当前位置:首页 > 问答 > 正文

Redis集群里怎么从内部到外部一步步把节点给踢出去的那些事儿

这事儿说起来就像把一个老员工从一个大团队里请走,还得保证团队手里的活一点不落下,在Redis集群里,这个“老员工”就是一个节点,你想把它踢出去,不能直接跟它说“你明天不用来了”,那样它负责的数据就全丢了,客户(也就是客户端)来找数据找不到,可就乱套了,得有个稳妥的流程,这个流程的核心,在Redis里叫做“下线”,但咱们不用这词儿,就叫它“请走节点”吧。

你得搞清楚,你想请走的是一个什么样的节点,这很关键,Redis集群里有两种关键角色:一种是“主节点”,它是干活的骨干,手里直接管着一部分数据;另一种是“从节点”,它是骨干的备份,平时跟着主节点学,主节点干啥它干啥,万一主节点病倒了,它能顶上去,请走一个“从节点”相对简单,因为它不直接负责数据,风险小,但如果你想请走的恰恰是一个“主节点”,那就麻烦多了,因为它是数据的第一责任人。

请走一个“从节点”

这比较简单,算是“和平劝退”,根据Redis官方文档(redis.io)里的说法,你大概需要这么几步:

  1. 找到它跟的老大是谁:你先得用集群管理命令(CLUSTER NODES)看看这个要从节点是哪个主节点的小弟,记下这个主节点的ID。
  2. 直接告诉集群让它离开:你不需要直接跟这个要从节点沟通,而是要去跟它的主节点说,你对着那个主节点,执行一个特殊的命令(CLUSTER FORGET <要从节点的ID>),这个命令的意思就相当于主节点对着集群宣布:“哎,各位,这个小弟以后不跟我了,你们也都别记着它了。”
  3. 处理后续:主节点发出这个通知后,集群里的其他节点会逐渐忘记这个从节点的存在,那个被请走的从节点自己,会发现它被团队抛弃了,就会自动停止它作为集群一份子的工作,变回一个普通的、孤零零的Redis实例,这时候,你就可以安全地关掉它的进程,或者把它从服务器上挪走了。

整个过程数据不会丢失,因为主节点还在正常工作,这就好比一个项目组里,你把一个实习生调走了,但项目经理和核心工程师都还在,项目进度不受影响。

请走一个“主节点”

这才是重头戏,相当于你要把团队里的一个骨干工程师调离关键岗位,而且不能让他手里的项目烂尾,Redis官方推荐的方法是“交接班”制度,专业术语叫“resharding”(数据迁移),但我们理解成“工作交接”就行,你不能直接让骨干撂挑子,得先找个靠谱的替补(一个从节点)把它所有的工作都接过去。

  1. 物色接班人:这是第一步,也是最重要的一步,你要踢掉的那个主节点,它下面必须至少有一个从节点,这个从节点就是内定的接班人,如果它没有从节点,那你不能直接踢它,否则数据就没人管了,这时候你得先给它分配一个从节点再说。
  2. 启动交接流程:物色好接班人之后,你就需要请出一位“集群管理大佬”——也就是Redis源码里提到的集群管理工具 redis-cli,并带上一个关键参数 --cluster reshard,你运行这个命令,它会引导你完成整个交接过程。
  3. 确定交接多少“工作”:这位“大佬”会问你,要把原主节点负责的多少个“哈希槽”迁移走?哈希槽你可以理解为这个骨干工程师负责的具体工作任务包,既然你要把他完全请走,那自然是要把他负责的所有槽(也就是所有工作)都交出去,你告诉工具“全部”。
  4. 指定接班人:“大佬”会问,把这些“工作包”交给谁呢?这时候你就输入你物色好的那个从节点的ID,注意,这里你指定的是接班人(从节点),而不是另一个主节点。
  5. 确认交接:“大佬”会给你列出一个详细的交接计划,问你确不确定要这么干,你确认之后,真正的魔法就开始了。

根据Redis的实现机制,接下来会发生一系列自动化操作:

  • 通知升职:集群会首先把这个指定的从节点提升为新的主节点,这下,团队里有了一个新的骨干。
  • 工作交接:集群会开始把旧主节点上的数据,一点点地同步到新的主节点上,在同步过程中,如果有客户端来访问这些正在交接的数据,旧主节点还会处理请求,但同时也会把变动告诉新主节点,保证数据一致。
  • 更新花名册:当所有数据都同步完成后,集群会正式更新它的“内部花名册”,告诉所有其他节点:“喂,注意了,原来由A(旧主节点)负责的那一摊事,现在全部归B(新主节点)管了!以后有相关的工作请求,都找B!”
  • 旧主节点下岗:至此,那个旧的主节点发现自己负责的“工作包”已经清零,它在集群中的角色就自动降级了,变成了一个没有任何任务的“光杆司令”(其实就变成了一个从节点,但因为它没有可追随的主节点,所以处于一种游离状态)。
  1. 最终清理:这个曾经的骨干,现在已经是一个无事可做的“从节点”了,这时候,你就可以按照前面“请走从节点”的步骤,用 CLUSTER FORGET 命令,把它彻底从集群中清理出去了。

所以你看,请走一个主节点,其实是分了两大步:第一步是先把它的身份从“主”变成“从”,这是通过数据迁移和副本提升完成的;第二步才是把这个已经变成“从”的节点请走,这一切都是为了确保数据的高可用性,避免服务中断,整个流程,Redis集群的设计者已经帮你把步骤封装好了,你只需要理解其逻辑,然后使用工具按部就班地操作就行。

Redis集群里怎么从内部到外部一步步把节点给踢出去的那些事儿