我们在IP地址127.0.0.1已经创建好了三个节点,端口分别是7000、7100和7200,以下分别用7000、7100和7200表示这三个节点,这三个节点的配置文件中的配置选项cluster-config-file分别为nodes-7000.conf、nodes-7100.conf和nodes-7200.conf。初始化状态下,集群状态配置分别如图1、2和3所示。
图1 nodes-7000.conf文件
图2 nodes-7100.conf文件
图3 nodes-7200.conf文件
从图1、2和3中可以看出节点7000负责槽0-5499以及16198;节点7100负责槽5500-10999;节点7200负责槽11000-16197、16199-16383。现在,我们要将槽16198迁移到7200节点。那么,在迁移的过程中节点的状态配置文件nodes-xxxx.conf以及在上述3个客户端执行cluster nodes命令的输出结果是怎样的呢?
1、对7200执行cluster setslot <slot_16198> importing <7000_runid>,表示节点7200准备从节点7000接收槽16198的所有权。观察nodes-7000.conf和nodes-7100.文件,发现没有任何的变化;但是nodes-7200.conf发生了变化,如图4。通过redis-cli -c -p 7200命令以集群的模式连接到节点7200,执行cluster nodes命令,命令的输出结果和nodes-7200.conf文件出现了同样的提示,如图5所示。图中的箭头表示节点7200准备接收节点7000编号为16198的槽,这是clusterState_7200.importing_slots_from[16198]值的反应。nodes-7000.conf和nodes-7100.conf没有任何变化,在这两个节点的客户端执行cluster nodes命令的输出结果和初始状态没有任何变化,说明节点7000和节点7100对当前要迁移槽16198这件事情一无所知。
这一步操作也就是在节点7200对应的clusterState(以后节点7000、节点7100和节点7200在内存中的结构clusterState分别用clusterState_7000、clusterState_7100和clusterState_7200进行区分)结构的importing_slots_from成员中将importing_slots_from[16198]的值从NULL变为指向clusterState_7200.nodes中代表节点7000的clusterNode(为了方便节点7000、节点7100和节点7200在内存中的clusterNode结构也分别用clusterNode_7000、clusterNode_7100和clusterNode_7200表示)。但是槽16198的所有权仍然是归节点7000所有,内存中clusterState_7200.slots[16198]的值仍然是指向clusterState_7200.nodes中clusterNode_7000的,并且cluterState_7200.nodes中节点clusterNode_7000.slots[16198]仍然为1。
图4 执行cluster setslot 16198 importing <7000_runid>之后,nodes-7200.con文件
图5 执行cluster setslot 16198 importing <7000_runid>之后,client_7200的cluster nodes命令输出结果
2、对节点7000执行cluster setslot <slot_16198> migrating <7200_runid>,nodes-7100.conf和nodes-7200.conf文件的内容,以及通过节点7100的客户端和7200的客户端(以后分别用client_7000、client_7100和client_7200表示节点7000、节点7100和节点7200在内存中的客户端)执行cluster nodes命令的输出结果和第1步相比,仍然没有发生任何的变化。但是,nodes-7000.conf和通过client_7000执行cluster nodes命令的输出结果却出现了变化,分别如图6和图7所示。通过对比可知,界定啊7100对于16198槽的迁移仍然是一无所知,节点7000知道自己将要把槽16198迁移到节点7200,节点7200也知道这件事情。
这一步操作,就是将内存中clusterState_7000.migrating_slots_to[16198]的值变为指向clusterState_7000.nodes中的clusterNode_7200,且clusterState_7000.myself.slots[16198]的值仍然为1,表示节点7000对于槽16198仍然占据拥有权。
图6 cluster setslot 16198 migrating <7200_target_id>之后,node-7000.conf文件