Cách khắc phục lỗi chuyển hướng 'MOVED' của Redis trong Chế độ Cluster

intermediate🔴 Redis2026-04-23| Redis Cluster (v3.0+) chạy trên Linux, Docker hoặc Kubernetes.

Error Message

MOVED 7638 127.0.0.1:7001
#redis#cluster#devops#database#troubleshooting

Thông báo lỗiNếu bạn đã từng thử chạy lệnh SET hoặc GET đơn giản trong Redis Cluster và nhận được một phản hồi khó hiểu như dưới đây, bạn không hề đơn độc.

(error) MOVED 7638 127.0.0.1:7001

Trong log ứng dụng, lỗi này có thể xuất hiện dưới dạng Redis.Exceptions.ClusterException. Nó thường xảy ra khi bạn kết nối tới một node đơn lẻ trong cluster như thể đó là một instance độc lập (standalone), thay vì sử dụng kết nối hiểu được kiến trúc phân tán của cluster.

Tại sao lỗi này lại xảy ra?Redis Cluster không lưu trữ tất cả dữ liệu trên mọi node. Thay vào đó, nó phân chia dữ liệu qua chính xác 16.384 hash slot. Mỗi node trong cluster của bạn chịu trách nhiệm cho một dải slot cụ thể. Ví dụ: Node A có thể xử lý các slot từ 0 đến 5460, trong khi Node B xử lý từ 5461 đến 10922.

Khi bạn thấy MOVED 7638 127.0.0.1:7001, Redis đang hỗ trợ bạn. Nó đang báo rằng: "Key bạn muốn thuộc về hash slot 7638, nhưng tôi không sở hữu slot đó. Node 127.0.0.1:7001 mới là node sở hữu. Hãy liên hệ với node đó." Về mặt kỹ thuật, đây không phải là một lỗi thất bại. Nó là một cơ chế chuyển hướng (redirection). Tuy nhiên, nếu client của bạn không biết cách đi theo bản đồ đó, nó sẽ coi gợi ý này là một lỗi.

Các bước khắc phục### 1. Khắc phục cho Command Line (redis-cli)Theo mặc định, redis-cli hoạt động ở chế độ standalone. Để sửa lỗi chuyển hướng, bạn phải bật Chế độ Cluster một cách rõ ràng bằng flag -c.

Cách làm sai:

redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> SET user:101 "John"
(error) MOVED 7638 127.0.0.1:7001

Cách làm đúng:

redis-cli -c -h 127.0.0.1 -p 7000
127.0.0.1:7000> SET user:101 "John"
-> Đã chuyển hướng đến slot [7638] tại 127.0.0.1:7001
OK

Flag -c yêu cầu CLI tự động nhảy sang đúng node dựa trên phản hồi MOVED. Điều này giúp việc chuyển hướng diễn ra mượt mà.

2. Khắc phục trong mã nguồn ứng dụngNếu ứng dụng của bạn gặp lỗi này, có khả năng bạn đang sử dụng một Redis client ở chế độ standalone. Bạn cần chuyển sang một client hỗ trợ cluster (Cluster-aware) có khả năng lấy bản đồ slot của cluster (topology) khi kết nối.

  • Python: Chuyển từ redis.Redis sang redis.cluster.RedisCluster.- Node.js: Sử dụng ioredis ở chế độ cluster (new Redis.Cluster([...])) thay vì client tiêu chuẩn.- Java: Sử dụng JedisCluster thay vì class Jedis cơ bản.- Go: Sử dụng redis.NewClusterClient từ package go-redis phổ biến.Các client hỗ trợ cluster sẽ tự xử lý việc chuyển hướng. Chúng tính toán hash CRC16 của key để xác định slot trước khi gửi yêu cầu, đảm bảo kết nối đúng node ngay từ lần thử đầu tiên.

3. Kiểm tra tình trạng sức khỏe của ClusterNếu lỗi vẫn tiếp diễn mặc dù đã sử dụng đúng client, có thể sơ đồ cluster (topology) của bạn đang bị mất đồng bộ. Kiểm tra trạng thái các slot bằng lệnh sau:

redis-cli -p 7000 cluster nodes

Xác nhận rằng node được đề cập trong lỗi (ví dụ: 127.0.0.1:7001) được đánh dấu là connectedmaster. Nếu một node bị lỗi và replica chưa được thăng cấp (promote), slot đó có thể không truy cập được.

Xác minhXác nhận việc khắc phục bằng các bước sau:

  • Kết nối bằng redis-cli -c.- Chạy lệnh CLUSTER KEYSLOT <your_key> để xác định slot cụ thể được gán cho key của bạn.- Chạy lệnh SET hoặc GET.- Tìm thông báo -> Đã chuyển hướng đến slot.... Nếu thao tác hoàn tất thành công, môi trường của bạn đã xử lý đúng giao thức Redis Cluster.## Lời khuyên từ chuyên gia- Seed Nodes: Đừng chỉ cung cấp một IP trong cấu hình ứng dụng. Hãy liệt kê ít nhất 3 node làm node "mồi" (seed nodes). Nếu một node bị sập khi khởi động, ứng dụng vẫn có thể lấy bản đồ cluster từ các node khác.- Docker & NAT: Nếu bạn đang chạy trong Docker và MOVED trỏ đến một IP nội bộ không thể truy cập (như 172.17.x.x), bạn phải thiết lập cluster-announce-ip trong file redis.conf thành IP công khai của máy host.- Lỗi CROSSSLOT: Khi sử dụng các thao tác trên nhiều key như MSET, tất cả các key phải nằm trong cùng một slot. Hãy sử dụng Hash Tags—ví dụ: {user123}:profile{user123}:settings—để ép các key liên quan vào cùng một node.

Related Error Notes