
在节假日流量高峰期,我管理的一套游戏用户状态缓存系统在 Redis Sentinel 架构下遭遇了瓶颈——单主节点吞吐已经逼近上限,尤其在用户在线数飙升时出现明显写入延迟。那次事件让我深刻意识到,仅靠主从冗余并不能支撑业务的“可扩展性”需求。
于是,我启动了 Redis Cluster 架构的评估与部署工作,并在香港本地服务器上完成了首个 在线迁移 + 分片水平扩容 实践。本文将结合该过程,完整还原如何部署 Redis Cluster、如何实现不中断业务的节点扩容与 Slot 迁移、如何监控并发故障风险,打造一个具备真正 高性能 + 高可用 + 横向可扩展性 的分布式缓存系统。
一、Redis Cluster 架构原理简述
Redis Cluster 是 Redis 官方提供的分布式模式,具备如下特性:
- 数据分片:通过哈希槽(slot)机制将键映射到 0~16383 的槽,分布于多个节点;
- 节点自治:每个节点既可作为主节点也可以管理多个从节点;
- 故障转移:从节点可自动接管其主节点角色;
- 客户端智能路由:大部分语言的客户端可感知重定向跳转(MOVED/ASK)。
二、香港节点集群部署方案设计
2.1 节点规划表
| 节点角色 | IP地址 | 端口 | 说明 |
|---|---|---|---|
| master-01 | 10.0.0.11 | 7000 | 初始主节点1 |
| master-02 | 10.0.0.12 | 7000 | 初始主节点2 |
| master-03 | 10.0.0.13 | 7000 | 初始主节点3 |
| replica-01 | 10.0.0.14 | 7000 | 从节点,备份 master-01 |
| replica-02 | 10.0.0.15 | 7000 | 从节点,备份 master-02 |
| replica-03 | 10.0.0.16 | 7000 | 从节点,备份 master-03 |
每对主从节点分布在不同物理机,位于香港同一内网段内,网络延迟在 0.2ms 左右。
三、Redis Cluster 搭建步骤
3.1 安装 Redis 并修改配置
所有节点创建独立配置目录:
mkdir -p /etc/redis-cluster/7000 /var/lib/redis/7000
配置样例如下:
# /etc/redis-cluster/7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
dir /var/lib/redis/7000
bind 10.0.0.11
protected-mode no
启动 Redis 实例:
redis-server /etc/redis-cluster/7000/redis.conf
3.2 创建集群
使用 redis-cli 工具打通主节点:
redis-cli --cluster create \
10.0.0.11:7000 10.0.0.12:7000 10.0.0.13:7000 \
10.0.0.14:7000 10.0.0.15:7000 10.0.0.16:7000 \
--cluster-replicas 1
系统将自动为每个主节点分配 5461 个 Slot 并设置一对从节点。
验证集群状态:
redis-cli -c -h 10.0.0.11 -p 7000 cluster nodes
四、节点水平扩容实操:新增主节点并迁移 Slot
4.1 新增节点部署
在一台新服务器 10.0.0.17 上部署 Redis:
mkdir -p /etc/redis-cluster/7000 /var/lib/redis/7000
配置并启动 Redis:
port 7000
cluster-enabled yes
...
bind 10.0.0.17
注册节点进集群:
redis-cli --cluster add-node 10.0.0.17:7000 10.0.0.11:7000
4.2 手动分配 Slot
假设我们希望从 master-01 迁移 1000 个 Slot 到新节点:
redis-cli -c --cluster reshard 10.0.0.11:7000
按照提示操作:
How many slots do you want to move? 1000
What is the receiving node ID? <10.0.0.17 node ID>
What is the source node? <10.0.0.11 node ID>
系统会依次迁移 Slot,并重分配数据。
4.3 自动迁移优化(生产建议)
- 迁移期间避免写操作(或短暂停业务);
- 使用 –cluster-yes 参数自动执行;
- 按“最热 Slot 优先”策略规划迁移批次;
- 可编写脚本按天自动均衡 Slot。
五、客户端接入与透明扩容
5.1 客户端适配建议
选择支持 Redis Cluster 的客户端(如 go-redis、lettuce、JedisCluster);
确保连接初始化时包含多个节点地址,防止单点故障。
示例(Python):
from rediscluster import RedisCluster
startup_nodes = [{"host": "10.0.0.11", "port": "7000"},
{"host": "10.0.0.12", "port": "7000"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
5.2 在线扩容透明性验证
- 新增主节点;
- 在线迁移 Slot;
- 客户端正常写入、读取,无需重连或配置变更;
- cluster slots 返回结果自动更新。
六、经验总结与风险防控
6.1 拓扑建议
- 每主节点配至少 1 个从节点;
- 不同主从应部署于不同物理机;
- 尽量避免跨 IDC 部署同一个 Slot 区段,防止网络切断导致误判。
6.2 常见问题排查
| 问题现象 | 可能原因 |
|---|---|
CLUSTERDOWN 错误 |
集群 Slot 未补齐或节点挂掉 |
MOVED 异常频繁 |
客户端未启用 cluster 模式 |
ASK 跳转失败 |
写入正在迁移 Slot,延迟确认 |
| 数据丢失 | 强制下线节点时未备份数据 |











