Redis Cluster
Redis Cluster 提供数据分片、高可用和自动故障转移能力。它将 key 分布到 16384 个槽位中,每个主节点负责一部分槽位。
基础概念
| 概念 | 说明 |
|---|---|
| slot | 槽位,范围 0-16383 |
| master | 负责槽位读写的主节点 |
| replica | master 的副本,用于故障转移 |
| hash tag | {} 中的内容用于计算槽位,保证多个 key 落在同一槽 |
| MOVED | 客户端访问了错误节点,需要重定向到正确节点 |
| ASK | 槽位迁移过程中的临时重定向 |
推荐拓扑
最小生产拓扑建议 3 主 3 从:
master-1 6379 -> replica-1 6380
master-2 6379 -> replica-2 6380
master-3 6379 -> replica-3 6380
节点应尽量跨主机、跨机架或跨可用区分布,避免主从副本落在同一故障域。
实例配置
每个实例配置:
port 6379
bind 0.0.0.0
protected-mode yes
requirepass change-me
masterauth change-me
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage yes
dir /data/redis/6379/data
appendonly yes
注意:
- 每个实例的
cluster-config-file必须唯一。 - Cluster 总线端口默认为业务端口加 10000,例如
6379对应16379。 - 防火墙需要放行业务端口和 Cluster 总线端口。
创建集群
准备 6 个 Redis 实例后执行:
redis-cli -a change-me --cluster create \
10.0.0.11:6379 10.0.0.12:6379 10.0.0.13:6379 \
10.0.0.14:6379 10.0.0.15:6379 10.0.0.16:6379 \
--cluster-replicas 1
连接集群:
redis-cli -c -a change-me -h 10.0.0.11 -p 6379
-c 表示启用 Cluster 重定向支持。
状态检查
CLUSTER INFO
CLUSTER NODES
CLUSTER SLOTS
命令行检查:
redis-cli -a change-me --cluster check 10.0.0.11:6379
redis-cli -a change-me --cluster info 10.0.0.11:6379
重点关注:
cluster_state:ok- 槽位是否全部覆盖。
- 是否存在
fail、handshake、noaddr节点。 - 主从分布是否符合预期。
扩容节点
添加新主节点:
redis-cli -a change-me --cluster add-node \
10.0.0.17:6379 10.0.0.11:6379
迁移槽位:
redis-cli -a change-me --cluster reshard 10.0.0.11:6379
添加从节点:
redis-cli -a change-me --cluster add-node \
10.0.0.18:6379 10.0.0.11:6379 \
--cluster-slave \
--cluster-master-id <master-node-id>
缩容节点
缩容前先将目标主节点槽位迁移到其他主节点:
redis-cli -a change-me --cluster reshard 10.0.0.11:6379
删除节点:
redis-cli -a change-me --cluster del-node 10.0.0.11:6379 <node-id>
不要直接停止还有槽位的主节点,否则可能导致槽位不可用。
Key 设计注意事项
跨 key 操作要求 key 在同一槽位。可以使用 hash tag:
MSET order:{1001}:status created order:{1001}:amount 99
order:{1001}:status 和 order:{1001}:amount 会按 {1001} 计算槽位。
常见问题
| 现象 | 排查方向 |
|---|---|
MOVED | 客户端未启用 Cluster 模式或槽位缓存过期 |
CROSSSLOT | 多 key 命令涉及不同槽位,需要 hash tag |
cluster_state:fail | 检查槽位覆盖、失败节点和主从副本 |
| 节点无法握手 | 检查业务端口、总线端口、防火墙和 NAT |