cluster-enabled 总开关
cluster-enabled yes 决定实例是否以集群模式运行:打开后键空间被划分为 16384 个槽,键按 CRC16 取模落到具体槽,再由负责该槽的节点提供服务;实例同时改用单库模型,并依赖客户端跟随重定向找到正确节点。刚启动、还没加入任何拓扑的集群实例也能运行,只是 CLUSTER INFO 里的 cluster_state 为 fail,需要 CLUSTER MEET 或 redis-cli --cluster create 把它纳入集群。
基本信息
| 开关 | cluster-enabled yes,默认 no |
|---|---|
| 状态文件 | cluster-config-file 指定,例如 nodes-7000.conf,由 Redis 自动维护 |
| 节点超时 | cluster-node-timeout,单位毫秒,默认 15000 |
| 数据库 | 集群模式只有 db0,SELECT 到其他库会直接报错 |
| 槽位数量 | 16384 个,全部有节点负责时 cluster_state 才会是 ok |
| 数据兼容 | 快照中存在 db0 以外的键时,集群模式无法加载该文件 |
典型使用场景
- 新建分片集群:每台机器按端口生成一份独立配置,再用创建工具一次性分配槽与主从
- 本地验证:单机起多个实例搭最小拓扑,验证客户端重定向与多 key 限制
- 扩容准备:新实例先以集群模式启动并加入拓扑,之后再迁移槽
- 排查 CLUSTERDOWN:确认是槽未分配完整,还是节点之间无法互相通信
- 灰度上线:先在预发确认客户端支持重定向,再切生产流量
配置与状态检查
配置与状态检查
port 7000
cluster-enabled yes # 打开集群模式
cluster-config-file nodes-7000.conf # 集群状态文件,Redis 自动维护,不要手改
cluster-node-timeout 15000 # 节点失联判定阈值,毫秒
dir /var/lib/redis/7000 # 每个实例独立目录,避免状态文件互相覆盖
appendonly yes组网与验证
组网与验证
redis-cli -p 7000 CLUSTER INFO | grep -E 'cluster_state|cluster_slots_assigned|cluster_known_nodes'
redis-cli -p 7000 CLUSTER MYID # 本节点 ID,加入拓扑时用于确认身份
redis-cli -p 7000 CLUSTER NODES # 当前节点认知的全部节点与槽归属
redis-cli -p 7000 CLUSTER MEET 10.0.0.12 7000 # 与另一节点握手组网
redis-cli -p 7000 SET k1 v1 # 槽未分配时会返回 CLUSTERDOWN Hash slot not served相关配置与作用
| 配置 | 默认值 | 作用 |
|---|---|---|
| cluster-enabled | no | 是否以集群模式运行,改动需要重启实例 |
| cluster-config-file | nodes.conf | 持久化节点 ID、槽归属与拓扑信息 |
| cluster-node-timeout | 15000 | 判定节点失联的毫秒阈值,影响故障切换速度 |
| cluster-require-full-coverage | yes | 是否要求全部槽都有节点负责,为 yes 时部分槽不可用会导致整集群拒服务 |
| cluster-allow-reads-when-down | no | 集群状态为 fail 时是否仍允许读请求 |
cluster-config-file 记录的是这份实例在集群里的身份(节点 ID、槽归属与握手信息)。同一台机器上跑多个实例时,必须各自使用独立的配置文件与独立 dir;把某个实例的状态文件复制给新实例,会造成节点身份冲突,槽归属变得难以收拾。
从单机切到集群不是改一个开关的事:集群模式只有 db0、不支持跨槽的多 key 命令与事务,SELECT 多库与 Lua 跨槽脚本都会失效。切换前要先完成数据落库、键命名(哈希标签)与应用改造,并在预发环境实测客户端重定向。