Redis Cluster 在香港节点的水平扩容实战:在线分片、迁移与高可用一体化解决方案

Redis Cluster 在香港节点的水平扩容实战:在线分片、迁移与高可用一体化解决方案

在节假日流量高峰期,我管理的一套游戏用户状态缓存系统在 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,延迟确认
数据丢失 强制下线节点时未备份数据
未经允许不得转载:A5数据 » Redis Cluster 在香港节点的水平扩容实战:在线分片、迁移与高可用一体化解决方案

相关文章

contact