Sửa lỗi 'LOADING Redis is loading the dataset in memory'

intermediate🔴 Redis2026-04-13| Linux (Ubuntu, CentOS, Debian), Docker, Redis 4.0 trở lên

Error Message

LOADING Redis is loading the dataset in memory
#redis#devops#database-optimization#troubleshooting

Thực tế gây ức chế khi khởi động lại RedisHãy tưởng tượng bạn vừa khởi động lại máy chủ production hoặc khởi động lại dịch vụ Redis sau khi thay đổi cấu hình. Đột nhiên, ứng dụng của bạn ngừng phản hồi và bắt đầu trả về các lỗi 500. Khi kiểm tra nhật ký (logs), bạn thấy tràn ngập một thông báo cụ thể:

LOADING Redis is loading the dataset in memory

Có vẻ như Redis đang chạy, nhưng nó từ chối mọi lệnh SET, GET, hoặc INCR mà bạn gửi. Đây không phải là một sự cố sập nguồn (crash). Thay vào đó, đây là một trạng thái chuyển đổi có thể kéo dài từ 10 giây đến 20 phút tùy thuộc vào kích thước dữ liệu và tốc độ phần cứng của bạn.

Tại sao Redis từ chối phản hồi bạnRedis là một cơ sở dữ liệu lưu trữ trên bộ nhớ (in-memory). Vì RAM là bộ nhớ tạm thời, Redis định kỳ lưu các bản sao nhanh (snapshots) vào đĩa (tệp RDB) hoặc ghi lại mọi thao tác ghi (tệp AOF) để đảm bảo dữ liệu được duy trì sau khi khởi động lại. Khi dịch vụ bắt đầu, nó phải nạp lại dữ liệu này vào RAM để tái thiết lập không gian khóa (keyspace).

Trong khi quá trình này đang diễn ra, Redis chuyển sang trạng thái 'LOADING'. Theo mặc định, nó chặn hầu hết tất cả các lệnh gửi đến. Điều này giúp ngăn chặn tình trạng không nhất quán dữ liệu và đảm bảo bạn không đọc phải dữ liệu không đầy đủ hoặc cũ trong khi bộ nhớ đang được nạp.

Hành động tức thì: Quá trình này mất bao lâu?Phần căng thẳng nhất của lỗi này là sự im lặng. Bạn không biết liệu nó sẽ kết thúc trong một phút hay một giờ. May mắn thay, bạn có thể kiểm tra chi tiết bên dưới bằng cách sử dụng redis-cli. Ngay cả khi các lệnh dữ liệu bị chặn, lệnh INFO thường vẫn có thể truy cập được.

Chạy lệnh này để kiểm tra trạng thái hiện tại:

redis-cli INFO persistence

Tìm phần loading. Bạn sẽ thấy kết quả tương tự như sau:

# Persistence
loading:1
loading_start_time:1715832000
loading_expect_filesize:5368709120
loading_loaded_bytes:2147483648
loading_loaded_perc:40.00
loading_eta_seconds:120

Tập trung vào hai trường sau:

  • loading_loaded_perc: Trường này cho biết chính xác bao nhiêu phần trăm tệp đã được nạp vào bộ nhớ.- loading_eta_seconds: Trường này cung cấp ước tính sơ bộ về thời gian chờ còn lại.## Tùy chọn "Xóa sạch" (Chỉ dành cho trường hợp khẩn cấp)Đôi khi bạn đang ở trong môi trường phát triển hoặc dữ liệu trong Redis chỉ là bộ nhớ đệm (cache) có thể được xây dựng lại từ cơ sở dữ liệu chính. Trong những trường hợp này, bạn có thể ưu tiên tốc độ hơn là tính toàn vẹn của dữ liệu. Bạn có thể buộc Redis khởi động ngay lập tức với một tập dữ liệu trống. Cảnh báo: Hành động này sẽ xóa vĩnh viễn dữ liệu hiện đang được nạp.
  • Dừng dịch vụ Redis: sudo systemctl stop redis- Di chuyển đến thư mục dữ liệu của bạn (thường là /var/lib/redis) và xóa tệp dump.rdb hoặc appendonly.aof.- Khởi động lại Redis: sudo systemctl start redisVì không có tệp nào để đọc, Redis sẽ sẵn sàng chấp nhận các kết nối ngay lập tức.

Các giải pháp lâu dài để giảm thời gian ngừng hoạt độngNếu bạn có một tập dữ liệu lớn, bạn không nên chỉ ngồi chờ sự cố tiếp theo xảy ra. Bạn cần tối ưu hóa cấu hình của mình để giúp các quá trình chuyển đổi này nhanh hơn.

1. Bật AOF với RDB PreambleViệc nạp một tệp Append Only File (AOF) thô nổi tiếng là chậm vì Redis phải thực thi lại từng lệnh một. Các phiên bản hiện đại (4.0 trở lên) hỗ trợ phương pháp tiếp cận hỗn hợp. Phương pháp này ghi một bản sao nhanh RDB vào đầu tệp AOF, giúp nạp nhanh hơn nhiều.

Hãy đảm bảo tùy chọn này đã được bật trong tệp redis.conf của bạn:

aof-use-rdb-preamble yes

2. Đánh giá nén RDBNén giúp tệp dump.rdb nhỏ hơn, nhưng nó tiêu tốn chu kỳ CPU trong quá trình khởi động. Nếu bạn có CPU mạnh nhưng I/O đĩa chậm, hãy bật nó. Tuy nhiên, nếu CPU của bạn đã bị quá tải trong khi khởi động, việc tắt nén có thể giảm bớt vài giây thời gian khởi động:

rdbcompression no

3. Nâng cấp lên ổ lưu trữ NVMeTốc độ nạp của Redis hầu như phụ thuộc hoàn toàn vào băng thông đọc đĩa. Nếu bạn thấy loading_loaded_bytes tăng chậm, đĩa của bạn chính là nút thắt cổ chai. Chuyển từ ổ cứng HDD tiêu chuẩn sang SSD NVMe có thể giảm thời gian nạp từ 5 phút xuống còn dưới 30 giây cho tập dữ liệu 10GB.

4. Tìm kiếm các "Big Keys"Một Hash hoặc Set duy nhất chứa hàng triệu phần tử mất nhiều thời gian xử lý hơn đáng kể so với nhiều khóa nhỏ. Những "khóa lớn" (big keys) này làm đình trệ quá trình nạp. Hãy tìm chúng bằng công cụ quét tích hợp:

redis-cli --bigkeys

Nếu bạn tìm thấy một Hash có hơn 100.000 trường (fields), hãy cân nhắc chia nhỏ nó thành các phần nhỏ hơn để cải thiện việc quản lý bộ nhớ.

Xác minh cuối cùngKhi tỷ lệ phần trăm nạp đạt 100%, Redis sẽ chuyển sang trạng thái hoạt động. Bạn có thể xác minh dịch vụ đang hoạt động tốt bằng cách gửi một lệnh heartbeat:

redis-cli PING

Nếu hệ thống đã sẵn sàng, nó sẽ phản hồi bằng một chữ PONG đơn giản. Bạn cũng có thể theo dõi nhật ký của mình (thường là /var/log/redis/redis-server.log) để xem xác nhận cuối cùng:

* DB loaded from disk: 4.567 seconds
* Ready to accept connections

Related Error Notes