Phần 6: Quản lý, mở rộng và xử lý sự cố (Troubleshooting) trong Redis Cluster
1. Mở rộng Cluster: Thêm Node mới và Rehash Slot
Mục tiêu là thêm một node Master mới vào cluster đang hoạt động để tăng dung lượng bộ nhớ và khả năng phân tán dữ liệu.
Trước tiên, bạn cần chuẩn bị một instance Ubuntu 24.04 mới (ví dụ IP: 192.168.1.60) đã cài đặt Redis 7.2 và cấu hình cơ bản như Phần 3. Node này sẽ chạy trên cổng 7006.
Khởi động Redis server trên node mới với chế độ cluster nhưng chưa tham gia vào topology hiện tại.
redis-server --port 7006 --cluster-enabled yes --cluster-config-file nodes-7006.conf --cluster-node-timeout 5000 --bind 0.0.0.0
Verify kết quả: Node chạy, lắng nghe cổng 7006, trạng thái là "ok" nhưng chưa có slot nào được gán.
Sử dụng công cụ redis-cli để thêm node mới vào cluster hiện có và phân bổ lại slot (rehash) để cân bằng tải.
redis-cli --cluster add-node 192.168.1.60:7006 192.168.1.50:7000 --cluster-yes
Kết quả mong đợi: Redis Cluster tự động thêm node mới và thông báo đã thêm thành công, nhưng chưa gán slot. Dữ liệu vẫn nằm ở các node cũ.
Thực hiện rehash để phân phối lại các slot (0-16383) đều nhau cho tất cả các node Master, bao gồm cả node mới.
redis-cli --cluster reshard 192.168.1.50:7000
Khi được hỏi, nhập số slot cần chuyển (ví dụ: 4000) và nhập ID của node đích (node mới 192.168.1.60:7006). Sau đó xác nhận "yes".
Verify kết quả: Chạy lệnh kiểm tra trạng thái cluster. Node mới hiện thị trạng thái "master" và hiển thị số lượng slot đã được gán (ví dụ: 4000 keys).
redis-cli -c -p 7000 cluster nodes
2. Xử lý sự cố Node mất kết nối và Failover tự động
Trong môi trường sản xuất, node có thể bị mất mạng hoặc treo (hang). Cần mô phỏng tình huống này để kiểm tra cơ chế tự động failover (chuyển từ Master sang Replica).
Giả sử node Master 192.168.1.50:7000 bị sự cố. Chúng ta sẽ kill tiến trình Redis trên node đó để mô phỏng sự cố.
ps aux | grep redis-server | grep 7000 | awk '{print $2}' | xargs kill -9
Kết quả mong đợi: Redis Cluster phát hiện node Master "fail", sau 1500ms (mặc định node-timeout), Replica tương ứng (192.168.1.50:7001) sẽ tự động chuyển trạng thái sang Master mới.
Verify kết quả: Dùng redis-cli kết nối vào cluster. Lệnh vẫn trả về kết quả bình thường, không báo lỗi "CLUSTERDOWN".
redis-cli -c -p 7000 ping
Kiểm tra lại topology để xác nhận node Replica đã trở thành Master mới.
redis-cli -c -p 7000 cluster nodes | grep 7001
Trong trường hợp Replica không tự failover (ví dụ do mất kết nối mạng hoàn toàn), bạn có thể thực hiện failover thủ động.
redis-cli -c -p 7001 cluster failover
Kết quả mong đợi: Node Replica 7001 được ép buộc chuyển sang trạng thái Master và tiếp nhận các slot của Master cũ.
Khôi phục node Master cũ (nếu muốn): Khởi động lại tiến trình Redis trên node cũ. Node cũ sẽ nhận diện nó không còn là Master và tự động chuyển thành Replica của Master mới.
redis-server --port 7000 --cluster-enabled yes --cluster-config-file nodes-7000.conf --cluster-node-timeout 5000 --bind 0.0.0.0
Verify kết quả: Node cũ khởi động lại, trạng thái chuyển thành "slave" và kết nối với Master mới (7001).
3. Sử dụng redis-cli --cluster fix để khắc phục lỗi Slot
Lệnh `--cluster fix` là công cụ mạnh nhất để tự động sửa các vấn đề về phân bổ slot, node bị mất, hoặc cấu hình không đồng bộ.
Mô phỏng lỗi: Giả sử một node Master bị lỗi khiến các slot của nó trở thành "unassigned" (không được gán cho ai), dẫn đến lỗi CLUSTERDOWN khi truy cập các key nằm trong slot đó.
Thực hiện lệnh fix để Redis Cluster tự động tái cấu trúc và gán lại các slot bị mất cho các node Master còn lại.
redis-cli --cluster fix 192.168.1.50:7000 --cluster-yes
Kết quả mong đợi: Công cụ sẽ liệt kê các vấn đề phát hiện (ví dụ: "Slot 1000 is not covered") và thực hiện di chuyển slot sang node khác hoặc khôi phục node cũ.
Trường hợp node bị "lost" khỏi cluster file (nodes.conf) nhưng vẫn chạy: Lệnh fix sẽ thêm node này trở lại cluster nếu IP và Port khớp.
redis-cli --cluster fix 192.168.1.50:7000 --cluster-add-node 192.168.1.50:7002
Verify kết quả: Chạy lệnh kiểm tra slot để đảm bảo tất cả 16384 slot đều được gán cho các node Master.
redis-cli -c -p 7000 cluster slots
Để kiểm tra xem còn key nào nằm ở slot chưa được gán hay không.
redis-cli -c -p 7000 cluster slots | grep "unassigned"
4. Phân tích Log và Giám sát (Monitoring) với Prometheus
Để debug sâu, cần kiểm tra file log của Redis để tìm các thông báo về "Cluster state", "Failover", hoặc "Panic".
Xem log thời gian thực của Redis server trên node Master (ví dụ 7000).
tail -f /var/log/redis/redis-server.log
Kết quả mong đợi: Xuất hiện dòng log "Cluster state change: OK -> FAIL" hoặc "Node X is now master".
Cấu hình Redis để xuất Metrics cho Prometheus (bật chế độ Exporter trong Redis 6.2+ hoặc dùng redis_exporter bên ngoài). Ở đây ta dùng tính năng built-in của Redis 7.2.
Chỉnh sửa file cấu hình `/etc/redis/redis.conf` trên từng node để bật endpoint metrics.
cat >> /etc/redis/redis.conf
Tạo file cấu hình Prometheus cho Redis để chỉ định các metrics cần thu thập.
cat > /etc/redis/prometheus.conf
Khởi động lại Redis để áp dụng cấu hình mới.
systemctl restart redis-server
Verify kết quả: Truy cập vào endpoint metrics bằng curl. Nếu thành công, bạn sẽ thấy dữ liệu dạng text của Prometheus.
curl http://localhost:9121/metrics | head -20
Cấu hình Prometheus Server để scrape metrics từ các node Redis trong cluster.
Tạo file cấu hình `/etc/prometheus/prometheus.yml`.
cat > /etc/prometheus/prometheus.yml
Khởi động lại Prometheus để áp dụng cấu hình.
systemctl restart prometheus
Verify kết quả: Truy cập web UI của Prometheus (http://localhost:9090/targets). Tất cả các target Redis phải hiển thị trạng thái "UP".
Sử dụng Grafana hoặc Redis Insight để trực quan hóa. Nếu dùng Redis Insight (GUI), chỉ cần nhập seed node (192.168.1.50:7000) để nó tự động phát hiện toàn bộ cluster và hiển thị sơ đồ topology cùng các cảnh báo (alert) về node down hoặc slot unassigned.
Điều hướng series:
Mục lục: Series: Triển khai Database Caching với Redis Cluster và Ubuntu 24.04
« Phần 5: Tối ưu hóa hiệu năng Redis Cluster với cấu hình persistence và memory