Redis 分片集群
Redis 分片集群是解决海量数据存储、高并发读写和高可用性的分布式方案,其核心原理和实现如下:
一、核心原理与架构
-
散列插槽(Hash Slot)机制
- Redis 集群将数据划分为 16384 个虚拟槽,每个键通过
CRC16(key) % 16384
计算所属插槽。 - 键的有效部分:若键包含
{}
(如{user}123
),则仅计算{}
内的内容;否则计算整个键。 - 槽位分配到不同主节点,客户端请求时通过重定向(
MOVED
响应)定位目标节点。
- Redis 集群将数据划分为 16384 个虚拟槽,每个键通过
-
去中心化架构
- 采用 多主多从 模式(推荐 3 主 3 从),节点间通过 Gossip 协议 同步状态。
- 客户端直连任意节点,无需代理层。
二、集群搭建步骤(以 6 节点为例)
-
节点配置
redis-server --port 7001 --cluster-enabled yes \--cluster-config-file nodes-7001.conf --appendonly yes
- 每个节点需开启集群模式(
cluster-enabled yes
)并指定元数据文件。
- 每个节点需开启集群模式(
-
创建集群
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 ... \--cluster-replicas 1
--cluster-replicas 1
表示每个主节点配 1 个从节点。
-
验证集群
- 执行
SET/GET
测试跨节点数据读写,通过redis-cli --cluster check <节点IP:端口>
检查状态。
- 执行
三、集群伸缩与数据迁移
-
扩容(添加节点)
- 添加新节点:
redis-cli --cluster add-node <新节点IP:端口> <已有节点IP:端口>
- 迁移槽位:
redis-cli --cluster reshard <已有节点IP:端口> \--cluster-from <源节点ID> --cluster-to <新节点ID> --cluster-slots <槽数>
- 迁移时槽状态标记为
IMPORTING/MIGRATING
,数据分批转移保证原子性。
- 迁移时槽状态标记为
- 添加新节点:
-
缩容(删除节点)
- 先迁移待删节点的槽位至其他节点,再执行:
redis-cli --cluster del-node <已有节点IP:端口> <待删节点ID>
- 先迁移待删节点的槽位至其他节点,再执行:
四、高可用与故障转移
-
自动故障转移
- 主节点宕机时,从节点自动升主(需半数以上主节点确认)。
- 节点间通过
PING-PONG
检测健康状态,超时时间由cluster-node-timeout
控制(默认 15 秒)。
-
手动故障转移
- 在从节点执行
CLUSTER FAILOVER
,强制切换主从(适用于维护场景)。
- 在从节点执行
五、数据迁移方案
-
官方工具迁移
- 全量迁移:
redis-cli --cluster import
但会导致服务中断。 - 增量迁移:推荐 Redis-Shake(阿里开源),支持断点续传和实时同步:
./redis-shake -type=sync -conf=redis-shake.conf # 全量+增量同步
- 全量迁移:
-
平滑迁移实践
- 双写方案:应用层同时写入新旧集群,切换后校验数据一致性。
- 避坑点:
- 大 Key 需拆分迁移(如超过 1MB 的 String)。
- 迁移时监控同步延迟(阈值 <100ms)、内存增长(<70%)。
六、最佳实践与工具
- 客户端配置:
- 使用 Jedis/Lettuce 等支持集群的库,设置重试次数(如
maxRedirects=5
)。
- 使用 Jedis/Lettuce 等支持集群的库,设置重试次数(如
- 运维工具:
- 槽位平衡:
redis-cli --cluster rebalance
。 - 监控指标:槽位分布、节点状态、网络带宽使用率。
- 槽位平衡:
通过分片机制,Redis 集群实现了数据的水平扩展和高并发负载均衡,配合主从复制与自动故障转移保障了服务的高可用性。建议在业务低峰期执行扩缩容,并提前测试迁移方案。