Redis集群模式了解吗?扩缩容怎么处理?

2025年 阅读约 10 分钟 面试指南 · Redis面试

Redis Cluster集群原理深度解析,包含哈希槽分配、节点扩缩容流程及客户端路由机制。

一句话总结

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. 客户端收到重定向后,更新本地槽位映射表。