10.2.2 节点握手
节点握手是指一批运行在集群模式下的节点通过 Gossip 协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步,由客户端发起命令:
cluster meet{ip}{port},如图 10-7 所示。
图中执行的命令是:cluster meet127.0.0.16380 让节点 6379 和 6380 节点进行握手通信。cluster meet 命令是一个异步命令,执行之后立刻返回。内部发起与目标节点进行握手通信,如图 10-8 所示。
1)节点 6379 本地创建 6380 节点信息对象,并发送 meet 消息。
2)节点 6380 接受到 meet 消息后,保存 6379 节点信息并回复 pong 消息。
3)之后节点 6379 和 6380 彼此定期通过 ping/pong 消息进行正常的节点通信。
这里的 meet、ping、pong 消息是 Gossip 协议通信的载体,之后的节点通信部分做进一步介绍,它的主要作用是节点彼此交换状态数据信息。6379 和 6380节点通过 meet 命令彼此建立通信之后,集群结构如图 10-9 所示。
对节点 6379 和 6380 分别执行 cluster nodes 命令,可以看到它们彼此已经感知到对方的存在。
127.0.0.1:6379> cluster nodes
cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0
0 connected
8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0 1468073534265
1 connected
127.0.0.1:6380> cluster nodes
cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 master - 0 1468073571641
0 connected
8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 myself,master - 0 0
1 connected
下面分别执行 meet 命令让其他节点加入到集群中:
127.0.0.1:6379>cluster meet 127.0.0.1 6381
127.0.0.1:6379>cluster meet 127.0.0.1 6382
127.0.0.1:6379>cluster meet 127.0.0.1 6383
127.0.0.1:6379>cluster meet 127.0.0.1 6384
我们只需要在集群内任意节点上执行 cluster meet 命令加入新节点,握手状态
会通过消息在集群内传播,这样其他节点会自动发现新节点并发起握手流程。
最后执行 cluster nodes 命令确认 6 个节点都彼此感知并组成集群:
127.0.0.1:6379> cluster nodes
4fa7eac4080f0b667ffeab9b87841da49b84a6e4 127.0.0.1:6384 master - 0
1468073975551
5 connected
cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0
connected
be9485a6a729fc98c5151374bc30277e89a461d8 127.0.0.1:6383 master - 0
1468073978579
4 connected
40622f9e7adc8ebd77fca0de9edfe691cb8a74fb 127.0.0.1:6382 master - 0
1468073980598
3 connected
8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0
1468073974541
1 connected
40b8d09d44294d2e23c7c768efc8fcd153446746 127.0.0.1:6381 master - 0
1468073979589
2 connected
节点建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据
读写都被禁止。通过如下命令可以看到:
127.0.0.1:6379> set hello redis
(error) CLUSTERDOWN The cluster is down
通过 cluster info 命令可以获取集群当前状态:
127.0.0.1:6379> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0………
从输出内容可以看到,被分配的槽(cluster_slots_assigned)是 0,由于目前所有的槽没有分配到节点,因此集群无法完成槽到节点的映射。只有当 16384 个槽全部分配给节点后,集群才进入在线状态