Hiểu về lỗi
Ít có điều gì gây ức chế hơn việc thấy lỗi (error) CLUSTERDOWN khi bạn cố gắng chạy một lệnh đơn giản. Lỗi này có nghĩa là cluster Redis của bạn đã ngừng chấp nhận các lệnh ghi và đọc vì nó không còn tự coi là đủ ổn định để đảm bảo tính toàn vẹn của dữ liệu.
Các nguyên nhân phổ biến
Redis thường chuyển sang trạng thái CLUSTERDOWN vì hai lý do cụ thể sau:
- Mất Quorum: Điều này xảy ra khi phần lớn các master node biến mất. Ví dụ: nếu bạn có một cluster 6 node (3 master, 3 replica) và 2 master bị ngoại tuyến cùng lúc, master còn lại không thể đạt được đa số (quorum). Nó sẽ ngừng hoạt động để ngăn chặn tình trạng không nhất quán dữ liệu.
- Hash Slots chưa được gán: Redis chia dữ liệu thành chính xác 16.384 hash slot. Nếu chỉ cần một slot không được lưu trữ bởi một node đang hoạt động—do cả master và replica của nó đều bị lỗi—toàn bộ cluster sẽ mặc định dừng hoạt động.
Những lỗi này thường bắt nguồn từ việc chia cắt mạng (network split), mất điện đột ngột trên nhiều tủ rack, hoặc sự cố của nhà cung cấp dịch vụ đám mây ảnh hưởng đến toàn bộ availability zone.
Hướng dẫn khắc phục từng bước
Bước 1: Kiểm tra trạng thái Cluster
Bắt đầu bằng cách kết nối với bất kỳ node nào vẫn có thể ping được. Bạn cần xem góc nhìn của cluster về sự cố. Chạy lệnh sau:
redis-cli -h <node-ip> -p 6379 CLUSTER NODES | grep fail
Lệnh này lọc các node được đánh dấu là fail hoặc fail?. Nếu bạn thấy hơn một nửa số master nằm trong danh sách này, bạn đã xác nhận được tình trạng mất quorum.
Bước 2: Đưa các node bị thiếu hoạt động trở lại
Cách khắc phục nhanh nhất là khôi phục lại các tiến trình ban đầu. Nếu máy chủ bị khởi động lại hoặc dịch vụ bị sập, hãy khởi động lại Redis trên các máy bị lỗi:
# Trên máy chủ đã bị sập
sudo systemctl start redis-server
# Hoặc nếu sử dụng cấu hình tùy chỉnh
redis-server /etc/redis/redis.conf
Khi các node tham gia lại, chúng sẽ tự động đồng bộ hóa. Trạng thái CLUSTERDOWN sẽ biến mất trong vòng vài giây sau khi các node thực hiện handshake thành công.
Bước 3: Sửa lỗi Cluster thông qua CLI
Đôi khi một node bị hỏng hoàn toàn—có thể một cloud instance đã bị xóa hoặc ổ đĩa bị hỏng. Nếu bạn không thể đưa node cũ hoạt động trở lại, bạn phải gán lại các slot của nó cho các node còn sống. Chạy công cụ sửa lỗi từ một node đang hoạt động tốt:
redis-cli --cluster fix <healthy-node-ip>:6379
Công cụ sẽ quét 16.384 slot và xác định các slot "mồ côi". Nó sẽ hỏi ý kiến để liên kết lại chúng với các master còn lại. Nhập yes để tiếp tục. Việc này sẽ giúp chữa lành cluster bằng cách bỏ qua các node đã chết.
Bước 4: Tùy chọn "Nuclear" (Giải pháp cuối cùng)
Nếu siêu dữ liệu (metadata) của cluster bị hỏng nặng và lệnh --cluster fix thất bại, bạn có thể phải reset các node. Cảnh báo: Việc này sẽ xóa cấu hình cluster và có thể dẫn đến mất dữ liệu.
Chạy lệnh này trên mọi node có thể truy cập được để chuyển nó trở lại thành một instance độc lập:
redis-cli CLUSTER RESET HARD
Sau khi thực hiện việc này, bạn sẽ cần chạy lại lệnh --cluster create như thể bạn đang thiết lập môi trường lần đầu tiên.
Bước 5: Điều chỉnh cài đặt tính sẵn sàng
Nếu bạn muốn cluster của mình vẫn trực tuyến ngay cả khi thiếu một số dữ liệu, bạn có thể thay đổi độ khắt khe của việc bao phủ slot. Điều này hữu ích cho các kịch bản làm cache, nơi tính sẵn sàng quan trọng hơn tính nhất quán dữ liệu 100%.
redis-cli CONFIG SET cluster-require-full-coverage no
Để thay đổi này duy trì sau khi khởi động lại, hãy thêm cluster-require-full-coverage no vào tệp redis.conf của bạn.
Xác minh kết quả
Đừng vội cho rằng lỗi đã được khắc phục chỉ vì thông báo lỗi biến mất. Hãy thực hiện ba bước kiểm tra sau:
- Kiểm tra trạng thái:
redis-cli CLUSTER INFO | grep cluster_state(Kết quả phải làok). - Kiểm tra độ bao phủ:
redis-cli --cluster check <ip>:6379(Kết quả phải làAll 16384 slots covered). - Kiểm tra lưu lượng:
redis-cli SET health_check 1.
Mẹo phòng ngừa
- Quy tắc Port 10000: Đảm bảo tường lửa của bạn cho phép lưu lượng truy cập trên port cơ bản (6379) VÀ port cluster bus (16379). Nếu không có port bus, các node không thể "bình bầu", dẫn đến lỗi quorum giả.
- Tăng thời gian timeout: Nếu bạn thường xuyên thấy lỗi
CLUSTERDOWNchớp nhoáng khi lưu lượng truy cập cao, hãy tăngcluster-node-timeoutlên 30000ms (30 giây) trong cấu hình để xử lý tình trạng lag mạng tạm thời. - Số lượng Master lẻ: Luôn sử dụng ít nhất 3 master node. Điều này đảm bảo có thể đạt được đa số rõ ràng trong trường hợp xảy ra sự cố split-brain.

