Redis Cluster是Redis官方提供的分布式解决方案,通过分片机制将数据分散到多个节点,实现水平扩展和高可用。集群将所有数据划分为16384个槽位(slot),每个节点负责一部分槽位。客户端写入数据时根据CRC16哈希算法计算key所属槽位,直接路由到对应节点。在数据备份恢复和数据库高可用架构设计中,Redis Cluster的槽位管理是运维核心。
Redis Cluster架构与槽位分配机制
Redis Cluster采用去中心化架构,没有代理层,客户端直连数据节点。每个节点通过Gossip协议与其他节点通信,维护集群状态信息。集群最少需要6个节点:3主3从,每个主节点负责一部分槽位,从节点异步复制主节点数据并在主节点故障时自动提升为主。
槽位计算公式:slot = CRC16(key) mod 16384。对于多key操作(如MGET、MSET),所有key必须落在同一槽位,否则操作失败。可通过Hash Tag机制强制多个key分配到同一槽位:例如user:{1001}:profile和user:{1001}:orders,花括号内的部分作为槽位计算依据。
# 创建集群(6节点,3主3从)
redis-cli --cluster create \
192.168.1.11:6379 192.168.1.12:6379 192.168.1.13:6379 \
192.168.1.14:6379 192.168.1.15:6379 192.168.1.16:6379 \
--cluster-replicas 1
# 查看集群状态
redis-cli -c -h 192.168.1.11 -p 6379 cluster info
# 查看槽位分配
redis-cli -c -h 192.168.1.11 -p 6379 cluster nodes
# 查看指定key的槽位
redis-cli -c -h 192.168.1.11 -p 6379 cluster keyslot user:1001:profile
-c参数启用集群模式,当客户端访问的key不在当前节点时,集群返回MOVED重定向,客户端自动切换到正确节点。部分客户端(如Jedis、Lettuce、go-redis)内置了集群路由表缓存,会自动更新槽位映射,减少重定向开销。
槽位迁移与集群扩缩容操作
集群扩容时需要将部分槽位从现有节点迁移到新节点。Redis Cluster支持在线迁移,迁移过程中集群正常对外提供服务。以下演示新增一个主节点并迁入槽位的完整流程。
# 1. 将新节点加入集群(作为空主节点)
redis-cli --cluster add-node 192.168.1.17:6379 192.168.1.11:6379
# 2. 将新节点设置为已有节点的从节点(可选,先加入再提升)
# 或直接分配槽位使其成为主节点:
# 3. 从现有节点迁移槽位到新节点
# 手动迁移单个槽位(以槽位1000为例)
redis-cli -c -h 192.168.1.11 -p 6379 cluster setslot 1000 importing 17_node_id
redis-cli -c -h 192.168.1.12 -p 6379 cluster setslot 1000 migrating 12_node_id
# 迁移该槽位的所有key
while true; do
keys=$(redis-cli -c -h 192.168.1.12 -p 6379 cluster getkeysinslot 1000 100)
if [ -z "$keys" ]; then break; fi
for key in $keys; do
redis-cli -c -h 192.168.1.12 -p 6379 migrate 192.168.1.17 6379 "" 0 5000 KEYS $key
done
done
# 通知所有节点槽位归属变更
redis-cli -c -h 192.168.1.11 -p 6379 cluster setslot 1000 node 17_node_id
手动迁移过程繁琐,生产环境推荐使用redis-cli –cluster reshard自动完成迁移。该工具交互式询问迁移槽数量、源节点和目标节点,自动执行迁移逻辑。
# 自动迁移4096个槽位到新节点
redis-cli --cluster reshard 192.168.1.11:6379 \
--cluster-from 12_node_id,13_node_id,14_node_id \
--cluster-to 17_node_id \
--cluster-slots 4096 \
--cluster-yes
故障转移与脑裂防护配置
Redis Cluster的故障检测依赖Gossip协议。当节点A发现节点B在cluster-node-timeout时间内无响应时,将其标记为PFAIL(疑似下线)。当超过半数主节点都标记B为PFAIL时,B被标记为FAIL(确定下线),B的从节点发起选举成为新主节点。
# 关键集群配置参数
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000 # 节点超时15秒
cluster-require-full-coverage no # 部分槽位不可用时不拒绝所有写
cluster-migration-barrier 1 # 从节点迁移屏障
cluster-allow-reads-when-down yes # 集群异常时允许读
cluster-node-timeout是最关键参数,设置过短会在网络抖动时频繁触发误切换,设置过长则故障恢复慢。生产环境建议15-30秒。如果集群部署在同机房内网,网络延迟低,可适当缩短到10秒。
脑裂问题在Redis Cluster中通过配置min-replicas-to-write缓解。设置该参数后,主节点只有在至少N个从节点确认同步时才接受写入。当网络分区导致主节点与从节点隔离时,主节点因不满足条件拒绝写入,避免脑裂数据不一致。
集群运维常见问题与排障
集群跨槽位操作失败是多key操作中最常见的问题。解决方法是使用Hash Tag确保相关key落在同一槽位。如果业务无法使用Hash Tag,需要在客户端层面拆分为多次单key操作。
大key迁移是槽位迁移的隐患。单个key包含大量元素(如百万级成员的Set)时,migrate命令可能耗时数秒,阻塞源节点。迁移前应先通过redis-cli –bigkeys扫描识别大key,采取拆分或异步迁移策略。
集群状态不一致时,使用redis-cli –cluster fix命令修复。该命令会检测槽位分配异常(如多个节点声称拥有同一槽位)并自动选择一个节点保留该槽位。fix命令有一定风险,执行前建议备份集群配置文件。
# 集群健康检查
redis-cli --cluster check 192.168.1.11:6379
# 修复集群槽位不一致
redis-cli --cluster fix 192.168.1.11:6379
# 平衡各节点槽数
redis-cli --cluster rebalance 192.168.1.11:6379 \
--cluster-use-empty-masters
rebalance命令自动平衡各节点负责的槽位数量,适用于多次扩缩容后槽位分布不均匀的场景。执行前需评估迁移量,大规模槽位迁移会带来一定的性能抖动。SQL查询优化关注单库性能,而Redis Cluster的运维核心在于槽位分布的均衡和故障转移的可靠性,两者共同构成数据库高可用架构的完整图景。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/rediscluster-ji-qun-fen-pian-yuan-li-yu-cao-wei-qian-yi-yun/