深色模式
Redis 集群 Cluster 部署
摘要:Redis Cluster 把数据按 16384 个哈希槽分片到多个主节点,自带故障切换,适合单机内存装不下的场景。本文搭建最小可用集群(3 主 3 从)并演示槽迁移。
适用环境
bash
redis-server --version # 需 5.0+(推荐 6.x/7.x)
# 准备 6 个实例端口:7001-7006
mkdir -p /data/redis-cluster/{7001..7006}1
2
3
2
3
操作步骤
1. 准备实例配置(以 7001 为例,其余改端口与目录)
ini
port 7001
cluster-enabled yes
cluster-config-file /data/redis-cluster/7001/nodes.conf
cluster-node-timeout 15000
appendonly yes
dir /data/redis-cluster/7001
requirepass Str0ngPass!2026
masterauth Str0ngPass!20261
2
3
4
5
6
7
8
2
3
4
5
6
7
8
bash
for p in 7001 7002 7003 7004 7005 7006; do
redis-server /data/redis-cluster/$p/redis.conf --daemonize yes
done
ps -ef | grep redis-server | grep cluster1
2
3
4
2
3
4
2. 创建集群
bash
redis-cli -a 'Str0ngPass!2026' --cluster create \
127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
--cluster-replicas 1
# 交互输入 yes 确认槽分配方案1
2
3
4
5
2
3
4
5
危险
--cluster create 只能用于全新空实例。对已有数据的实例执行会导致数据丢失;已有数据迁移请用 --cluster import 或业务双写。
3. 连接集群(必须用 -c)
bash
redis-cli -c -a 'Str0ngPass!2026' -p 7001
127.0.0.1:7001> SET user:1 alice # 自动重定向到负责该槽的节点
-> Redirected to slot [xxx] located at 127.0.0.1:70021
2
3
2
3
bash
redis-cli -a 'Str0ngPass!2026' --cluster check 127.0.0.1:7001
redis-cli -a 'Str0ngPass!2026' -p 7001 CLUSTER INFO
redis-cli -a 'Str0ngPass!2026' -p 7001 CLUSTER NODES1
2
3
2
3
4. 多键操作与 hashtag
bash
# 多键命令要求所有 key 落在同一槽,用 {} 强制相同槽位
MSET user:{1}:name alice user:{1}:age 201
2
2
5. 扩容:加入新主节点并迁移槽
bash
# 先启动 7007/7008,加入集群
redis-cli -a 'Str0ngPass!2026' --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
# 迁移槽(交互式:输入迁移数量、目标 id、源节点 all)
redis-cli -a 'Str0ngPass!2026' --cluster reshard 127.0.0.1:7001
# 为新主添加从节点
redis-cli -a 'Str0ngPass!2026' --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 \
--cluster-slave --cluster-master-id <7007的node-id>1
2
3
4
5
6
7
2
3
4
5
6
7
6. 缩容:先迁走槽再删节点
bash
redis-cli -a 'Str0ngPass!2026' --cluster reshard 127.0.0.1:7001 # 把 7007 的槽迁回
redis-cli -a 'Str0ngPass!2026' --cluster del-node 127.0.0.1:7001 <7007的node-id>1
2
2
验证
bash
redis-cli -a 'Str0ngPass!2026' --cluster check 127.0.0.1:7001 | tail -n 10
# 关键:所有槽被覆盖([OK] All 16384 slots covered)、无 [ERR]
redis-cli -c -a 'Str0ngPass!2026' -p 7001 SET a 1
redis-cli -c -a 'Str0ngPass!2026' -p 7003 GET a1
2
3
4
2
3
4
常见坑
WARNING
客户端必须支持集群协议并使用 -c 或对应客户端的集群模式,否则会遇到 MOVED/CROSSSLOT 报错。
WARNING
cluster-require-full-coverage 默认 yes:只要有槽无节点覆盖,整个集群停止服务;可设为 no 让其它分片继续可用。
DANGER
扩缩容期间迁移大 key 会造成源节点阻塞;先用 --cluster call ... --bigkeys 或 redis-cli --bigkeys 排查大 key 并拆分。