1、Redis Cluster 概念速览
能力 | 说明 |
---|---|
横向扩容 | 16384 槽位自动分片,多主均摊数据;动态增删节点秒级生效 |
高可用 | 多数主节点存活即可继续读写;主宕→副本选举,新 epoch 广播 |
客户端感知 | MOVED / ASK 重定向;成熟驱动本地缓存 Slot→Node 映射 |
弱一致 | 异步复制 → 极端情况下丢写;可用 WAIT 半同步、min-replicas-* 保护 |
2、端口模型与网络要求
端口 | 用途 | 必须互通对象 |
---|---|---|
6379 | 客户端读写、槽位迁移 (data port) | 所有客户端 & 所有节点 |
16379 | Cluster Bus 节点间 Gossip / 选举 | 仅节点 ↔ 节点 |
防火墙口诀:6379 对外全开,16379 节点互开。缺任一即心跳失败、无法故障转移。
3、Docker / NAT 踩坑指南
-
Cluster 不支持端口映射 / NAT。
-
解决方案
-
Docker →
--net=host
-
或在
redis.conf
显式声明cluster-announce-ip <宿主机IP> cluster-announce-port 6379 cluster-announce-bus-port 16379
-
4、数据分片:16384 Hash Slot & Hash Tag
-
槽位计算
slot = CRC16(key) % 16384
-
Hash Tag —— 强制同槽
user:{42}:profile user:{42}:cart // 均落同槽,可事务 / Lua / MGET
-
多键操作限制:跨槽即
CROSSSLOT
报错;务必使用 Hash Tag。
5、主-从-复制与故障转移
master 心跳超时(node_timeout) → PFail
↓ 多数主确认 → Fail
↓ 副本 RAFT 选举 → 升主
↓ 新 master 广播 epoch
↓ 客户端 MOVED 重定向
- 单主 + 全副本同宕 → 槽位缺失,集群进入 fail,拒绝写。
cluster-migration-barrier
可自动迁移多余副本,提升抗毁性。
6、一致性与写丢失
场景 | 风险 | 常用缓解 |
---|---|---|
主 ACK 后即宕机 | 异步复制未同步到副本 | WAIT n t 半同步;min-replicas-* 拒写 |
网络分区少数派继续写 | 恢复后少数派回滚 | node_timeout 后少数派停止写 |
7、redis.conf
关键参数全表
参数 | 作用 | 建议 |
---|---|---|
cluster-enabled yes | 开启集群模式 | 必设 |
cluster-config-file nodes.conf | 存储拓扑,自动生成 | 保留默认 |
cluster-node-timeout 5000 | 故障判定 + 客户端保护 (ms) | 3–10 s |
cluster-require-full-coverage | 槽缺失是否拒写 | 生产 yes |
cluster-allow-reads-when-down | fail 状态仍读 | 高读可设 yes |
cluster-migration-barrier 1 | 自动副本迁移阈值 | 默认 1 |
其余:cluster-slave-validity-factor 、cluster-port 等按需调整 |
8、安装演示:六节点集群(3 主 3 从)
# 1) 目录 & 配置
for p in 7000 7001 7002 7003 7004 7005; domkdir $p && cat > $p/redis.conf <<EOF
port $p
cluster-enabled yes
cluster-config-file nodes.conf
appendonly yes
EOF
done# 2) 启动实例
for p in 700{0..5}; do redis-server $p/redis.conf & done# 3) 初始化集群
redis-cli --cluster create \127.0.0.1:7000 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 \--cluster-replicas 1
验证:
redis-cli -c -p 7000 set foo bar # 若自动 MOVED 重定向说明集群 OK
9、日常交互 & 客户端
-
CLI
redis-cli -c -p 7000 cluster nodes
-
驱动:JedisCluster / Lettuce / Redisson / ioredis
- 本地缓存 slot→node
- 订阅
+switch-master
事件自动刷新
10、典型运维操作
场景 | 命令或步骤 |
---|---|
健康巡检 | redis-cli --cluster check 127.0.0.1:7000 |
在线 reshard | redis-cli --cluster reshard 127.0.0.1:7000 |
手动故障转移 | 在副本上 cluster failover |
修复不一致 | redis-cli --cluster fix 127.0.0.1:7000 |
动态调参 | cluster set-config-epoch … / CONFIG SET |
11、节点生命周期管理
11.1 新增主
# 启 7006 实例
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
# 再 reshard 将部分槽迁至新主
11.2 新增副本
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 \--cluster-slave --cluster-master-id <masterId>
11.3 删除节点
- 若为主 → reshard 清空槽位
redis-cli --cluster del-node 127.0.0.1:7000 <nodeId>
11.4 副本迁移
redis-cli -c -p 7007 cluster replicate <newMasterId>
自动迁移由 cluster-migration-barrier
控制。
12、集群升级 & 滚动维护
- 在要升级的主的 副本 执行
CLUSTER FAILOVER
(零数据丢失切换)。 - 下线原主 → 升级 Redis → 重启,现为副本。
- 若需恢复角色,再次手动 failover。
- 对所有主节点循环,业务持续写入。
13、迁移到 Redis Cluster
适用于: 单实例 / Sentinel / 自研分片。
步骤 | 说明 |
---|---|
1. 冻结写流量 | 确保数据静态 |
2. 各旧实例 BGREWRITEAOF | 生成 AOF |
3. 搭建空 Cluster | 启 N 主 0 从 |
4. 替换 AOF & 启动 | 分别放入各节点 |
5. --cluster fix | 自动迁移到正确槽 |
6. 切换客户端 | 使用集群驱动 |
另可 redis-cli --cluster import
从旧实例在线搬迁(删除源键)。
14、常见问题 & 快速排障
现象 | 排查 | 解决 |
---|---|---|
CLUSTERDOWN | Master 数 < 半数 或槽位缺失 | 恢复主节点 / fix 修复槽位 |
CROSSSLOT 报错 | 多键跨槽 | 使用 Hash Tag {...} |
Docker 节点互不识别 | Port mapping / NAT | --net host 或 announce 参数 |
写丢 | 异步复制窗口 | WAIT + 增副本 + 较长 timeout |
15、总结 & 最佳实践
- 三主三从起步,跨机房 / AZ 部署。
- node_timeout 3-10 s:兼顾故障检测与误判。
min-replicas-*
+WAIT
:约束写丢窗口。- 监控指标:主/从数量、slot 覆盖、replica lag、
failover
事件。 - 演练:定期注入故障,验证自动故障转移与客户端重连。
- 备份:AOF / RDB + 离线存储,防极端多主全毁。
通过本文,你已拿到一份从架构原理到生产运维的 Redis Cluster 全景手册。
按照步骤循序上云,横向扩容、高可用、性能提升不再是难题。祝你的 QPS 飙升,稳定运行!🚀