节点
一个集群由多个节点构成,最初每个节点都是独立的,每个节点都是一个集群。要创建一个真正可用的集群,我们需要把哥哥独立的节点连接起来。
连接节点的命令:
CLUSTER MEET <ip> <port>
向一个node发送这个命令的时候,可以让node和指定ip port的节点握手。握手一旦成功,node节点就会将指定ip port的节点添加到节点当前所在的集群中。
启动节点
一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。
image.png
集群的数据结构
每个节点都会使用一个clusterNode结构来记录自己的状态:
image.png
link属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输入缓冲区和输出缓冲区。
image.png
最后,每个节点都保存着一个clusterState结构,这个结构记录了当前节点的视角下,集群所处的状态。比如集群是在线还是下线等。
image.png
Cluster MEET命令的实现
CLUSTER MEET <ip> <port>
假如收到命令的节点A和节点B进行握手:
1)节点A会为节点B创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面。
2)之后,节点A将根据CLUSTER MEET命令给定的IP地址和端口号,向节点B发送一条 MEET消息(message)。
3)如果一切顺利,节点B将接收到节点A发送的MEET消息,节点B会为节点A创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面。
4)之后,节点B将向节点A返回一条 PONG 消息。
5)如果一切顺利,节点A将接收到节点B返回的PONG消息,通过这条PONG消息节点A可以知道节点B已经成功地接收到了自己发送的 MEET消息。
6)之后,节点A将向节点B返回一条PING消息。
7)如果一切顺利,节点B将接收到节点A返回的PING消息,通过这条PING消息节点B可以知道节点A已经成功地接收到了自己返回的PONG 消息,握手完成。
image.png
之后,节点A会将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点也与节点B进行握手,最终,经过一段时间之后,节点B会被集群中的所有节点认识。
网友评论