redis cluster源码研究--增删节点

  增删节点是指节点加入或退出redis cluster。

  redis cluster 提供了运维工具redis-trib.rb,使得增删节点变得简单和容易。


一、增节点

  1、加入 步骤:

(1)以cluster模式启动新节点(127.0.0.1:7000);

(2)用以下命令将新节点(空主节点)加入集群:

  ./redis-trib.rb add-node 127.0.0.1:7000 27.0.0.1:7006 

  其中第一个参数是新节点地址,第二参数可以是集群中任意一个节点地址。

就这样,把新节点(127.0.0.1:7000)加入了集群,但新节点没有负责任何哈希槽,可通过reshard给它分配哈希槽,本节不讨论如何reshard。

(3)如果要将新节点(空主节点)设为某主节点的从节点,可通过redis-cli连上新节点,然后用以下命令:

  redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

  其中3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e是新节点的主节点id。


2、实现原理

  redis-trib.rb add-node命令实际发送了cluster meet命令给集群里某一个节点,该节点会将新节点加入它的集群配置,并与新节点进行握手,以确保可以连上新节点,最后通过定时发ping包给集群其他节点以告之有新节点的存在,其他节点也因此将新节点加入它的集群配置,并与新节点进行握手,以确保可以连上新节点。

  设置新节点A为某主节点B的从节点是通过cluster replicate命令实现,分析该命令源码,可知其原理是首先将自已设为该主节点的从节点,建立主从同步关系,然后通过ping包告诉集群其他节点,我是主节点B的从节点。

  以上变动,EpochConfig不会发生变化。


二、删除节点

1、从节点或空主节点删除步骤:

(1)简单通过以下命令:

  ./redis-trib del-node 127.0.0.1:7000 `<node-id>`

  其中第一参数可以是集群中任意一个节点地址,第二参数是要删除节点id。


2、非空主节点删除步骤:

(1)首先通过man failover使该节点变为从节点;

(2)然后按删除从节点步骤删除该节点。


3、实现原理

  通过分析redis-trib del-node命令可知:(1)首先发送cluster forget命令给除了删除节点外其他集群节点,它会使收到该命令的节点将待删除节点从集群节点配置中删除;

(2)如果待删除节点是空的主节点,会通过cluster replicate命令将它的从节点设为目前从节点数最少的主节点的从节点;(3)最后发送shutdown命令给待删除节点,使其自动关闭进程。

  以上变动,EpochConfig同样不会发生变化。


你可能感兴趣的:(redis cluster源码研究--增删节点)