一句话总结
Redis Cluster采用去中心化架构,共16384个哈希槽分配在多个主节点上。扩缩容时需要迁移槽位和数据,通过ASK/MOVED重定向实现客户端路由更新。
初级理解
Redis Cluster架构:
• 去中心化:所有节点通过Gossip协议互联,客户端可连接任意节点
• 哈希槽(Hash Slot):共16384个槽位(0-16383)
• 主从复制:每个主节点至少有一个从节点
槽位分配:
# 查看槽位分配
redis-cli cluster slots
# 计算key的槽位
CRC16(key) % 16384
一句话总结:Redis Cluster = 去中心化 + 哈希槽 + 主从复制。
中级深入
扩容处理流程:
1. 新增节点加入集群
redis-cli cluster meet
2. 将部分槽位从老节点迁移到新节点
redis-cli cluster setslot importing
redis-cli cluster setslot migrating
3. 迁移期间,客户端访问正在迁移的key:
- 老节点返回ASK重定向
- 迁移完成后返回MOVED重定向到新节点
4. 客户端更新本地槽位映射表
缩容处理流程:
1. 将待下线节点的槽位和数据逐步迁移到其他节点
2. 槽位全部迁移完毕后,执行 CLUSTER FORGET 移除节点
3. 缩容过程对客户端透明,通过MOVED机制实现无缝切换
注意:迁移过程中,客户端会收到ASK或MOVED重定向,需要处理这些重定向。
高级拓展
Gossip协议:
# 节点间通信方式
• 每个节点随机选择几个节点发送信息
• 信息包含:当前节点状态、已知其他节点状态
• 最终一致性:所有节点最终会达成一致
故障转移:
# 当主节点宕机时
1. 从节点检测到主节点不可达
2. 从节点发起选举,投票给自己
3. 如果获得超过半数投票,从节点晋升为主节点
4. 其他节点更新槽位映射
面试加分项:能说出Gossip协议、故障转移、ASK/MOVED重定向机制,说明你对Redis Cluster有深入理解。
实战场景
场景:Redis Cluster扩容(3节点扩展到6节点)
# 1. 启动新节点
redis-server /etc/redis/redis-6383.conf
# 2. 将新节点加入集群
redis-cli --cluster meet 192.168.1.10 6383
# 3. 分配槽位(从每个老节点迁移一部分到新节点)
redis-cli --cluster reshard 192.168.1.10:6380
# 4. 验证槽位分配
redis-cli cluster slots
面试模拟
Q:Redis Cluster的哈希槽是什么?为什么是16384个?
A:哈希槽是Redis Cluster的数据分片方式,每个key通过CRC16(key) % 16384计算槽位。16384个槽位是权衡结果:太少会导致单节点槽位过多,太多会增加Gossip协议的通信开销。
Q:Redis Cluster扩缩容时,客户端如何感知?
A:客户端通过ASK和MOVED重定向感知:1. ASK:迁移过程中,客户端访问正在迁移的key时,老节点返回ASK重定向;2. MOVED:迁移完成后,老节点返回MOVED重定向到新节点;3. 客户端收到重定向后,更新本地槽位映射表。