手工设置 config epoch 是干什么的
手工组建集群时,先给每个节点设置互不相同的 config epoch,再执行 CLUSTER MEET 与槽分配。config epoch 是节点的配置版本号,用于节点间解决状态冲突:epoch 相同的节点会被当成同一配置代,重复会引发持续的主从争夺与拓扑震荡。用 redis-cli --cluster create 自动组网时不需要手工设置。
基本信息
| 命令 | CLUSTER SET-CONFIG-EPOCH <n> |
|---|---|
| 执行时机 | 节点加入集群之前,且其 config epoch 仍为 0 |
| 取值要求 | 每个节点互不相同,通常按顺序从小到大分配 |
| 冲突后果 | epoch 重复导致持续争主与拓扑震荡 |
| 持久化 | 写入该节点的集群配置文件,重启后保持 |
手工组网步骤与检查点
| 步骤 | 命令 | 检查点 |
|---|---|---|
| 分配 epoch | CLUSTER SET-CONFIG-EPOCH n | 每个节点数值各不相同 |
| 节点互联 | CLUSTER MEET | CLUSTER NODES 能看到全部节点 |
| 指派槽 | CLUSTER ADDSLOTS 或 redis-cli --cluster 分配 | 16384 个槽全部有归属,无重叠 |
| 设置主从 | CLUSTER REPLICATE 或加节点时指定副本 | 副本指向正确的主节点 |
| 最终核对 | CLUSTER INFO 与 CLUSTER NODES | 集群状态正常、槽范围与预期一致 |
示例
示例
redis-cli -p 7000 CLUSTER SET-CONFIG-EPOCH 1
redis-cli -p 7001 CLUSTER SET-CONFIG-EPOCH 2
redis-cli -p 7002 CLUSTER SET-CONFIG-EPOCH 3
redis-cli -p 7000 CLUSTER MEET 127.0.0.1 7001
redis-cli -p 7000 CLUSTER INFO | grep -E 'cluster_state|cluster_known_nodes'
redis-cli -p 7000 CLUSTER NODES | awk '{print $1, $3, $7}' # 节点 ID、角色标记、epoch典型使用场景
- 脚本化组网:用命令行逐节点搭建集群,替代交互式工具
- 容器与固定拓扑部署:节点地址可预知,便于固化命名
- 从备份重建集群:按原拓扑恢复 role 与槽分配
- 排查拓扑震荡:确认是否存在 epoch 冲突
- 迁移演练:在测试环境复现生产拓扑
redis-cli --cluster create 会自动分配 epoch,手工设置只在自己写脚本建集群时才需要;两种方式不要混着用。
组网完成后做一次完整核对:节点数量、角色、epoch 与槽范围四项都要与设计一致,避免带着不一致的拓扑上线。
设置完 epoch 建议立刻核对 CLUSTER NODES 输出中的 epoch 列,确认没有重复值,再继续做节点互联与槽分配。
该命令只在节点尚未加入集群(config epoch 为 0)时可用,对已有集群成员执行会被拒绝;已入集群的节点想改 epoch 需要重建或清理其集群状态,风险较高。