Nỗi hoảng loạn khi RDS bị 'storage-full'
Lỗi này thường xảy ra vào thời điểm tồi tệ nhất. Ứng dụng của bạn bắt đầu báo lỗi 500, và bảng điều khiển AWS chào đón bạn bằng trạng thái đỏ đáng sợ: storage-full. Đây không chỉ là một cảnh báo đơn thuần. Đó là trạng thái tới hạn mà tại đó database engine ngừng chấp nhận lệnh ghi. Trong nhiều trường hợp, nó sẽ ngắt hoàn toàn các kết nối hiện có để bảo vệ tính toàn vẹn của file hệ thống.
Khi một RDS instance đạt 100% dung lượng sử dụng đĩa, nó sẽ mất trạng thái 'Available'. Bạn sẽ thấy thông báo lỗi cụ thể sau:
DB instance is in storage-full state. The instance may not be able to accept connections or perform writes.
Khôi phục trong 60 giây
- Mở AWS RDS Console.
- Chọn cơ sở dữ liệu của bạn và nhấp vào Modify.
- Tìm phần Allocated storage. Tăng giá trị thêm ít nhất 20% hoặc 50 GB để tạo một vùng đệm an toàn.
- Cuộn xuống dưới cùng, nhấp vào Continue, và chọn Apply immediately.
- Chờ trạng thái chuyển từ 'Modifying' sang 'Available'.
Tại sao ổ đĩa bị đầy?
Sự tăng trưởng dữ liệu hiếm khi là thủ phạm duy nhất. Thường thì các chi phí ẩn sẽ tiêu tốn dung lượng của bạn. Tôi đã từng thấy các ổ đĩa 100 GB bị treo chỉ vì một rogue background job. Hãy cẩn thận với những nguyên nhân phổ biến sau:
- Uncommitted Transactions: Trong MySQL hoặc Postgres, một giao dịch chạy lâu có thể ngăn cản việc dọn dẹp binary logs. Các log này có thể dễ dàng tăng lên hơn 50 GB chỉ trong vài giờ.
- Spilled Temporary Files: Các phép join phức tạp hoặc thao tác
ORDER BYlớn không vừa với RAM sẽ ghi các tệptmpxuống đĩa. Một truy vấn lỗi đơn lẻ có thể ngốn sạch 20 GB dung lượng trong vài phút. - Log Bloat: Nếu bạn thiết lập
log_outputthành 'FILE' và bỏ qua việc rotation, các slow query logs sẽ lớn dần cho đến khi cạn kiệt dung lượng ổ đĩa.
Cách khắc phục 1: Sử dụng AWS CLI để xử lý nhanh
Khi bảng điều khiển console bị chậm trong thời gian xảy ra sự cố, terminal là người bạn tốt nhất của bạn. Lệnh này sẽ kích hoạt việc mở rộng lưu trữ ngay lập tức.
# Tăng dung lượng lưu trữ từ 100GB lên 150GB
aws rds modify-db-instance \
--db-instance-identifier my-production-db \
--allocated-storage 150 \
--apply-immediately
Cảnh báo: Việc tăng dung lượng lưu trữ là vĩnh viễn. Bạn không thể thu nhỏ một RDS volume sau khi đã cấp phát. Sau khi bạn nâng cấp, instance sẽ chuyển sang trạng thái 'storage-optimization' trong vài giờ. Bạn không thể thay đổi kích thước lưu trữ lần nữa cho đến khi quá trình này hoàn tất.
Cách khắc phục 2: Dọn dẹp thủ công
Nếu bạn đã đạt đến giới hạn lưu trữ tối đa cho instance class của mình, bạn phải xóa dữ liệu một cách thủ công. Nếu bạn vẫn có thể thực hiện một kết nối, hãy thử các lệnh sau.
Dành cho MySQL/MariaDB:
Buộc xoay vòng các nhật ký nội bộ để giải phóng dung lượng ngay lập tức:
CALL mysql.rds_rotate_general_log;
CALL mysql.rds_rotate_slow_log;
Dành cho PostgreSQL:
Tìm các bảng lớn nhất hoặc các temp files bị bỏ rơi đang làm phình to dung lượng lưu trữ của bạn:
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
Cách khắc phục 3: Thiết lập tự động với Autoscaling
Đừng khắc phục lỗi này một cách thủ công nữa. AWS có thể xử lý việc đó thay bạn. Storage Autoscaling sẽ kích hoạt việc tăng dung lượng bất cứ khi nào không gian trống giảm xuống dưới 10% trong một khoảng thời gian liên tục.
- Đi tới menu Modify cho instance RDS của bạn.
- Tích vào ô Enable storage autoscaling.
- Thiết lập một Maximum storage threshold (ví dụ: 1000 GB). Hạn mức này giúp ngăn chặn một lỗi hệ thống khiến bạn mất hàng ngàn đô la.
Xác minh: Lỗi đã thực sự được khắc phục chưa?
Đừng chỉ tin vào đèn 'Available' màu xanh. Hãy kiểm tra sức khỏe của hệ thống bằng ba bước kiểm tra sau:
- Kiểm tra quyền ghi (Test Writes): Tạo một bảng kiểm tra nhỏ để xác nhận bộ máy cơ sở dữ liệu đã chấp nhận dữ liệu trở lại.
CREATE TABLE rds_check (id INT); INSERT INTO rds_check VALUES (1); DROP TABLE rds_check;
- **Kiểm tra trạng thái qua CLI:**
```
aws rds describe-db-instances --db-instance-identifier my-production-db --query 'DBInstances[*].DBInstanceStatus'
- Theo dõi CloudWatch: Đảm bảo chỉ số
FreeStorageSpacecó xu hướng tăng lên hoặc đã ổn định.
Những lưu ý quan trọng
- Thời gian chờ 6 tiếng: Sau khi bạn thay đổi dung lượng lưu trữ, AWS sẽ khóa các thay đổi lưu trữ tiếp theo trong vòng 6 giờ. Đừng chỉ thêm 1 GB; hãy thêm đủ dùng trong ít nhất 24 giờ.
- Mở rộng IOPS: Nếu bạn sử dụng Provisioned IOPS (io1), tỷ lệ hiệu suất sẽ gắn liền với kích thước lưu trữ của bạn. Bạn có thể cần mở rộng IOPS cùng lúc với dung lượng lưu trữ để duy trì tốc độ.
- Giảm hiệu suất: Việc mở rộng diễn ra trên các ổ đĩa đang hoạt động. Bạn có thể thấy độ trễ tăng khoảng 5-10% trong khi ổ đĩa EBS bên dưới đang thực hiện tối ưu hóa.

