1. Redis Cluster 架构深度解析
Redis Cluster 作为官方推荐的分布式解决方案,其设计哲学体现了去中心化的核心理念。与传统的中心化代理模式不同,Redis Cluster 通过智能客户端和节点间的协作来实现数据分片和高可用。
1.1 核心架构设计原理
Redis Cluster 采用哈希槽(Hash Slot)分片机制,将整个键空间划分为 16384 个槽位。这个特定的数字选择背后有着深思熟虑的考量:
- 计算效率:16384(2^14)在 CRC16 哈希计算后取模运算效率高
- 扩展性:足够支持上千节点规模,同时保持元数据大小可控
- 均衡性:可以被大多数常见节点数(如3、6、9等)整除
集群中的每个主节点负责一部分哈希槽,通过CLUSTER ADDSLOTS命令分配。例如在3主3从的典型部署中:
code复制Master1: 0-5460
Master2: 5461-10922
Master3: 10923-16383
1.2 节点通信与故障检测
Redis Cluster 使用 Gossip 协议进行节点间通信,每个节点会:
- 每秒随机选择5个节点发送PING
- 收到PING的节点会回复PONG
- 如果超过
cluster-node-timeout(默认15秒)未收到响应,则标记为疑似下线(PFAIL) - 当多数主节点确认某节点下线时,将其标记为已下线(FAIL)
这种设计既保证了故障检测的及时性,又避免了广播风暴。在实际部署中,建议根据网络状况调整cluster-node-timeout:
- 数据中心内部:5000-10000ms
- 跨机房部署:15000-20000ms
1.3 数据迁移与重新分片
Redis Cluster 支持在线迁移槽位数据,这是其弹性扩展的核心能力。迁移过程采用"原子多键"机制保证一致性:
bash复制# 将槽位100从源节点迁移到目标节点
redis-cli --cluster reshard <host:port> \
--cluster-from <source-node-id> \
--cluster-to <target-node-id> \
--cluster-slots 100 \
--cluster-yes
迁移过程中,客户端可能会收到ASK重定向,需要正确处理:
java复制// JedisCluster 内部已处理ASK/MOVED重定向
try {
jedisCluster.set("key", "value");
} catch (JedisRedirectionException e) {
if (e instanceof JedisAskDataException) {
// 临时重定向
Jedis askJedis = new Jedis(redirectHost, redirectPort);
askJedis.asking();
askJedis.set("key", "value");
} else if (e instanceof JedisMovedDataException) {
// 永久重定向,更新槽位缓存
renewSl
