一、为什么需要扩容Redis集群

咱们先来聊聊为什么要扩容。想象一下,你开了一家网红奶茶店,刚开始只有一个小门面,三个员工。生意越来越好,排队的人从门口排到了马路对面。这时候你发现:操作台不够用、原料冰箱放不下、员工忙得脚不沾地。怎么办?当然是扩大店面、增加设备、招聘新员工啊!

Redis集群也是同样的道理。随着业务量增长,你可能会遇到:

  • 内存不够用,频繁触发逐出策略
  • QPS太高,响应时间变长
  • 数据量暴增,持久化时卡顿

这时候就需要考虑扩容了。Redis集群扩容就像给奶茶店开分店,既要保证新老店面协调运作,又不能影响正在排队的顾客。

二、Redis集群扩容的两种姿势

扩容主要有两种方式:垂直扩容和水平扩容。

垂直扩容就像是给奶茶店换更大的冰箱,简单粗暴但有限制:

# 修改redis.conf配置文件
maxmemory 16gb  # 从8GB提升到16GB

注释:这种方式简单,但受单机硬件限制,而且升级时需要重启服务

水平扩容才是我们今天的主角,它就像开分店:

# 添加新节点
redis-cli --cluster add-node 新节点IP:端口 集群任意节点IP:端口

注释:这是真正意义上的分布式扩展,可以突破单机限制

三、手把手教你扩容Redis集群

下面我用一个6节点集群(3主3从)扩容到8节点(4主4从)的完整示例,带你看清每个步骤。

3.1 准备新节点

首先准备两个新节点,就像新店开业前要装修:

# 新节点1配置
port 6380
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 5000

# 新节点2配置
port 6381
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000

注释:配置要和现有集群保持一致,特别是cluster-enabled必须开启

3.2 加入集群

新店装修好了,得让总部知道:

# 将第一个新节点加入集群
redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379

# 将第二个新节点作为从节点加入
redis-cli --cluster add-node 127.0.0.1:6381 127.0.0.1:6379 --cluster-slave

注释:第一个参数是新节点,第二个参数是集群中任意现有节点

3.3 重新分配槽位

现在新节点还是光杆司令,需要分些业务给它:

# 重新分配哈希槽
redis-cli --cluster reshard 127.0.0.1:6379

# 系统会交互式询问:
How many slots do you want to move? 4096  # 从16384个槽中分出4096个
What is the receiving node ID?  # 输入新节点的ID
Source node(s): all  # 从所有现有节点抽取

注释:建议在业务低峰期操作,移动每个槽时会阻塞对应请求

3.4 平衡节点数据

就像把奶茶原料重新分配:

# 自动平衡各节点槽数量
redis-cli --cluster rebalance 127.0.0.1:6380 --cluster-use-empty-masters

注释:--cluster-use-empty-masters参数确保空主节点也能参与分配

四、扩容过程中的避坑指南

4.1 客户端连接问题

扩容后客户端可能还记着老节点:

// Jedis集群客户端配置示例
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 6379));
// 一定要包含所有节点地址
nodes.add(new HostAndPort("127.0.0.1", 6380)); 
JedisCluster jedis = new JedisCluster(nodes);

注释:客户端需要配置全部节点地址,或者使用支持自动发现的客户端

4.2 数据迁移期间的性能

迁移槽位时会短暂阻塞:

# 监控迁移过程中的延迟
redis-cli --latency -h 127.0.0.1 -p 6379

注释:建议设置迁移速度限制:redis-cli --cluster reshard ... --cluster-pipeline 10

4.3 从节点自动迁移

有时候Redis会自动调整主从关系:

# 手动修复从节点归属
redis-cli --cluster fix 127.0.0.1:6379

注释:执行前建议先备份集群配置

五、扩容后的效果验证

新店开张要验收,扩容完也要检查:

# 检查集群状态
redis-cli --cluster check 127.0.0.1:6379

# 预期输出示例:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

六、什么时候不该扩容

虽然扩容很美好,但有些情况要三思:

  1. 网络带宽已经吃紧 - 扩容会加剧网络负担
  2. 客户端不支持集群协议 - 需要先升级客户端
  3. 数据量很小但QPS高 - 可能需要优化而不是扩容

七、其他扩容方案对比

除了官方方案,还可以考虑:

  1. Twemproxy:简单但会成为单点
  2. Codis:功能丰富但需要额外组件
  3. Redis Enterprise:商业版功能全但要花钱

八、总结

Redis集群扩容就像经营连锁店,要点是:

  1. 渐进式扩容,避免一次性迁移过多数据
  2. 做好监控,特别是网络和延迟指标
  3. 客户端配置要跟上集群变化
  4. 选择业务低峰期操作
  5. 记得验证扩容后的数据分布

记住,没有完美的方案,只有适合当前业务场景的选择。希望这篇指南能帮你顺利完成扩容,让你的Redis集群继续稳如泰山!