Redis集群实战:如何实现节点的弹性伸缩与数据迁移?

在生产环境中,业务量的增长往往不可预测。今天我们的Redis集群可能只有3个节点,明天可能就需要扩展到10个节点。如果每次扩容都要停机迁移数据,那简直是运维的噩梦。

幸运的是,Redis Cluster天生就支持动态伸缩 。它允许我们在不中断服务的情况下,像搭积木一样增加或减少节点。今天,我们就来揭秘这一"弹性"背后的核心操作------Add-NodeReshard

第一步:请新成员入队(Add-Node)

假设我们现有的集群运行在7001-7003端口,现在为了应对流量高峰,我们启动了一台新的Redis实例(端口7004)。此时,7004只是一个孤独的节点,它并不知道集群的存在。

我们需要用一条命令把它"拉"进群里:

复制代码
redis-cli --cluster add-node 127.0.0.1:7004 127.0.0.1:7001

这条命令包含两个关键信息:

  • 新节点127.0.0.1:7004(我们要加入的新人)。
  • 现有节点127.0.0.1:7001(集群里的老成员,用于获取集群元数据)。

执行后,7004成功加入了集群。但请注意,此时它只是一个没有插槽(Slot)的Master。它虽然身在集群,却"无地可耕",无法存储任何数据。如果我们现在尝试写入数据,会发现数据依然只分布在老节点上。

第二步:划分地盘(Reshard)

新节点加入后,为了让它分担压力,我们需要从老节点那里"匀"一部分插槽给它。这个过程叫重分片

我们使用reshard命令来执行这一操作:

复制代码
redis-cli --cluster reshard 127.0.0.1:7001

执行该命令后,系统会进入交互式问答,我们需要依次回答三个核心问题:

  • How many slots?
    你需要输入迁移的插槽数量。例如,如果你想让新节点承担约20%的流量,可以输入3000(总共有16384个槽)。
  • Receiving node?
    你需要输入接收者 的节点ID。也就是我们新加入的7004节点的ID(可以通过cluster nodes命令查看)。
  • Source nodes?
    你需要输入贡献者 的节点ID。你可以指定某个特定的老节点(如7001),也可以输入all让所有老节点共同分担。

输入done确认源节点,最后输入yes确认执行。此时,你会看到终端疯狂刷屏,Redis正在后台将数据从老节点平滑地搬运到新节点。

验证成果:数据去哪儿了?

迁移完成后,神奇的事情发生了。假设num这个键原本哈希到了2765号插槽,而这个插槽恰好被分配给了7004。

当我们执行SET num 10时:

  • 客户端计算哈希,发现属于7004。
  • 数据直接写入7004。

通过cluster nodes命令,我们可以清晰地看到7004已经持有了属于它的插槽范围。扩容完成,且全程业务无感知!

课后思考:如何优雅地"裁员"?

学会了"加法","减法"同样重要。如果业务量下降,我们需要下线某个节点,该怎么做?

  • 提示 :使用redis-cli --cluster help查看帮助。
  • 核心难点 :你不能直接删除一个还有数据的节点。必须先使用reshard将该节点上的所有插槽全部迁移走,把它变成"光杆司令",然后才能使用del-node命令将其移除。
知识小结:核心考点速查表

为了方便大家复习,我将本文的重点整理成了下表:

知识点 核心内容 考试重点/易混淆点 难度系数
Redis集群伸缩功能 动态增加或移除节点,支持集群规模调整 add-node命令需同时指定新节点和集群现有节点信息 ⭐⭐
add-node命令参数 new_host:new_port(新节点) + existing_host:port(集群现有节点) 未加选项时默认新增主节点,--cluster-slave可指定为从节点 ⭐⭐
插槽分配 数据通过哈希槽分布,新增主节点后需手动迁移插槽 reshard命令实现插槽迁移,需指定源节点ID和目标节点ID ⭐⭐⭐
案例:扩容并存储数据 1. 新增主节点(7004) 2. 通过reshard将7001的插槽(含number键的2765槽)迁移至7004 迁移后数据自动跟随插槽,set number=10成功写入新节点 ⭐⭐⭐⭐
删除节点(作业) 需通过帮助文档查找命令(如del-node),需先清空节点插槽 移除主节点前需重新分配其全部插槽 ⭐⭐⭐
总结

Redis Cluster的伸缩性是其最大的亮点之一。通过add-node引入新成员,再通过reshard公平地分配工作(插槽),我们就能轻松应对业务的增长。记住,数据是跟着插槽走的,只要掌握了插槽的分配权,你就掌握了Redis集群的命脉。

相关推荐
Jul1en_2 小时前
【Redis】常用命令及定时器实现思想
数据库·redis·缓存
杰克尼3 小时前
redis(day02-短信登录)
数据库·redis·缓存
永霖光电_UVLED3 小时前
氧化镓高体积热容的特性,集成高介电常数界面的结侧冷却架构
人工智能·生成对抗网络·架构·汽车·制造
却话巴山夜雨时i3 小时前
互联网大厂Java面试:从Spring到微服务的全栈挑战
java·spring boot·redis·微服务·面试·kafka·技术栈
杰克尼3 小时前
springCloud(day10-面试篇)
redis·spring cloud·面试
onebyte8bits3 小时前
NestJS 系列教程(十八):文件上传与对象存储架构(Multer + S3/OSS + 访问控制)
前端·架构·node.js·状态模式·nestjs
2501_948114243 小时前
从 Claude Code 源码泄露看 2026 年 Agent 架构演进与工程化实践
大数据·人工智能·架构
小雨青年3 小时前
鸿蒙 HarmonyOS 6 | 分布式数据同步详解
分布式·华为·harmonyos