Sửa lỗi Redis 'ERR This instance has cluster support disabled' Khi Chạy Lệnh CLUSTER

intermediate🔴 Redis2026-05-05| Redis 4.x–7.x, mọi hệ điều hành (Linux/macOS/Windows WSL), Redis standalone instance

Error Message

ERR This instance has cluster support disabled
#redis#cluster#standalone#config#cluster-enabled

Tình huống gặp phải

Bạn chạy lệnh CLUSTER INFO hoặc CLUSTER NODES trên Redis — có thể đang debug, kiểm tra trạng thái cluster, hoặc chạy script migration — và nhận được thông báo này:

(error) ERR This instance has cluster support disabled

Ứng dụng hoặc script của bạn bị crash. Điều khó chịu là lệnh đó hoàn toàn hợp lệ trong cú pháp Redis. Redis chỉ đơn giản là từ chối thực thi vì cluster mode chưa bao giờ được bật trên instance này.

Nguyên nhân

Redis hoạt động theo một trong hai chế độ: standalone hoặc cluster. Mọi instance đều mặc định là standalone. Ở chế độ đó, tất cả lệnh CLUSTER * đều bị từ chối ngay ở tầng protocol — không có bất kỳ nỗ lực thực thi nào, chỉ trả về lỗi ngay lập tức.

Một số tình huống thường gặp:

  • Thư viện tự động chạy CLUSTER INFO để phát hiện topology khi khởi động — Lettuce, ioredis và Jedis đều làm vậy khi khởi tạo với cluster client
  • Script migration hoặc deployment được viết cho môi trường cluster, vô tình chạy nhầm vào Redis standalone ở dev/staging
  • Client hỗ trợ cluster trỏ sai host — standalone trên cổng 6379 thay vì cluster endpoint trên cổng 7000+
  • Chạy thủ công CLUSTER MYID hoặc CLUSTER SLOTS trong lúc debug

Chẩn đoán nhanh

Xác nhận Redis đang thực sự chạy ở chế độ nào:

redis-cli -h 127.0.0.1 -p 6379 INFO server | grep redis_mode

Bạn sẽ nhận được một trong hai kết quả:

redis_mode:standalone
# hoặc
redis_mode:cluster

Nếu kết quả là standalone, đó chính là nguyên nhân. Không có lệnh cluster nào hoạt động được trên instance này.

Kiểm tra thêm giá trị config:

redis-cli CONFIG GET cluster-enabled
1) "cluster-enabled"
2) "no"

Cách sửa 1: Bạn cần standalone — sửa lại phía client

Nếu Redis của bạn cố ý chạy standalone (một node, không sharding), vấn đề không phải ở Redis — mà ở phía client đang gửi sai lệnh. Hãy thay cluster client bằng client thông thường.

ioredis (Node.js) — đang dùng new Redis.Cluster([...]) trong khi cần dùng new Redis(...):

// Sai — cluster client kết nối vào Redis standalone
const redis = new Redis.Cluster([
  { host: '127.0.0.1', port: 6379 }
]);

// Đúng — standalone client
const redis = new Redis({
  host: '127.0.0.1',
  port: 6379
});

Jedis (Java) — thay JedisCluster bằng JedisPool:

// Sai
JedisCluster jedis = new JedisCluster(new HostAndPort("127.0.0.1", 6379));

// Đúng
JedisPool pool = new JedisPool("127.0.0.1", 6379);
Jedis jedis = pool.getResource();

Lettuce (Java/Spring) — dùng RedisClient thay vì RedisClusterClient:

// Sai
RedisClusterClient clusterClient = RedisClusterClient.create("redis://127.0.0.1:6379");

// Đúng
RedisClient client = RedisClient.create("redis://127.0.0.1:6379");

redis-py (Python):

# Sai
from redis.cluster import RedisCluster
r = RedisCluster(host='127.0.0.1', port=6379)

# Đúng
import redis
r = redis.Redis(host='127.0.0.1', port=6379)

Cách sửa 2: Bạn cần cluster mode — bật trong config Redis

Thực sự cần clustering? Sharding dữ liệu, mở rộng ngang, high availability trên nhiều node? Khi đó bạn phải bật cluster mode trong redis.conf và xây dựng cluster đúng cách.

Bước 1 — Chỉnh sửa /etc/redis/redis.conf:

# Bật cluster mode
cluster-enabled yes

# Mỗi node cần file trạng thái riêng — không dùng chung giữa các instance
cluster-config-file nodes.conf

# Thời gian (ms) trước khi một node bị coi là không thể kết nối
cluster-node-timeout 5000

Bước 2 — Khởi động lại Redis:

sudo systemctl restart redis
# hoặc
redis-server /etc/redis/redis.conf

Bước 3 — Redis yêu cầu ít nhất 3 master node để tạo cluster. Với 3 instance chạy trên cổng 7000–7002:

redis-cli --cluster create \
  127.0.0.1:7000 \
  127.0.0.1:7001 \
  127.0.0.1:7002 \
  --cluster-replicas 0

Nhập yes khi được hỏi để xác nhận phân bổ slot cho 3 node.

Cách sửa 3: Sai endpoint — kiểm tra lại cổng

Đang chạy cả Redis standalone lẫn cluster? Rất dễ vô tình trỏ cluster client vào cổng 6379. Kiểm tra xem cổng nào đang thực sự lắng nghe:

# Kiểm tra các cổng đang lắng nghe
ss -tlnp | grep redis
# hoặc
netstat -tlnp | grep redis
tcp  LISTEN  0  128  0.0.0.0:6379  # standalone
tcp  LISTEN  0  128  0.0.0.0:7000  # cluster node 1
tcp  LISTEN  0  128  0.0.0.0:7001  # cluster node 2
tcp  LISTEN  0  128  0.0.0.0:7002  # cluster node 3

Cluster client của bạn cần trỏ vào cổng cluster (7000+), không phải 6379.

Kiểm tra sau khi sửa

Đã chuyển sang standalone client? Chạy thử một lượt đọc/ghi cơ bản và xác nhận không còn lỗi cluster:

redis-cli SET test_key "hello"
redis-cli GET test_key
# Kết quả mong đợi: "hello"

Đã bật cluster mode? Kiểm tra cluster đang hoạt động tốt trước khi đưa vào xử lý traffic thực:

redis-cli -p 7000 CLUSTER INFO | grep cluster_state
# Kết quả mong đợi: cluster_state:ok

redis-cli -p 7000 CLUSTER NODES
# Kết quả mong đợi: 3 dòng, mỗi dòng có node ID và dải slot tương ứng (0-5460, 5461-10922, 10923-16383)
redis-cli -c -p 7000 SET foo bar
redis-cli -c -p 7000 GET foo
# Cờ -c cho phép redis-cli tự động theo dõi MOVED redirect

Lưu ý: bật cluster mode sẽ xóa toàn bộ dữ liệu

Bạn không thể chuyển một instance standalone đang chạy sang cluster mode mà không mất dữ liệu. Redis lưu trữ dữ liệu theo cách khác nhau ở mỗi chế độ — không có cách migration tại chỗ.

Trước khi chuyển đổi, hãy dump toàn bộ dữ liệu trước:

redis-cli --rdb dump.rdb

Sau đó restore vào cluster mới sau khi cluster đã sẵn sàng. Bỏ qua bước này, bạn sẽ mất toàn bộ dữ liệu trong instance standalone.

Related Error Notes