江门学做网站课程,建网站 多少钱,深圳市企业网站建设,济南美赞网站建设公司节点
集群数据结构
redisClient结构和clusterLink结构的相同和不同之处
redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区#xff0c;这两个结构的区别在于#xff0c;redisClient结构中的套接字和缓冲区是用于连接客户端的#xff0c;而clust…节点
集群数据结构
redisClient结构和clusterLink结构的相同和不同之处
redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区这两个结构的区别在于redisClient结构中的套接字和缓冲区是用于连接客户端的而clusterLink结构中的套接字和缓冲区是用于连接节点的。
例子
举个例子。以前面介绍的7000、7001、7002三个节点为例如图展示了节点7000创建的clusterState结构这个结构从节点7000的角度记录了集群以及集群包含的三个节点的当前状态:
1.结构的currentEpoch属性的值为0表示集群当前的配置纪元为02.结构的size属性的值为0表示集群目前没有任何节点在处理槽因此结构的state属性的值为REDIS_CLUSTER_FAIL,这表示集群目前处于下线状态3.结构的nodes字典记录了集群目前包含的三个节点这三个节点分别由clusterNode结构表示其中myself指针指向代表节点7000的clusterNode结构而字典中的另外两个指针则分别指向节点7001和代表节点7002的clusterNode结构这两个节点是节点7000已知的在集群中的其他节点4.三个节点的clusterNode结构的flags属性都是REDIS_NODE_MASTER,说明三个节点都是主节点。
节点7001和节点7002也会创建类似的clusterState结构
1.不过在节点7001创建的clusterState结构中myself指针将指向代表节点7001的clusterNode结构而节点7000和节点7002则是集群中的其他节点.2.而在节点7002创建的clusterState结构中myself指针将指向代表节点7002的clusterNode结构而节点7000和节点7001则是集群中的其他节点。
CLUSTER MEET命令的实现
通过向节点A发送CLUSTER MEET命令客户端可以让接收命令的节点A将另一个节点B添加到节点A当前所在的集群里面:
CLUSTER MEET ip port收到命令的节点A将与节点B进行握手(handshake)以此来确认彼此的存在并未将来的进一步通信打好基础:
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消息握手完成
如图展示了握手过程。之后节点A会将节点B的信息通过Goossip协议传播给集群中的其他节点让其他节点也与节点B进行握手最终经过一段时间之后节点B会被集群中的所有节点认识
槽指派
概述
Redis集群通过分片的方式来保存数据库的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个集群中的每个节点可以处理0个或最多16384个槽。当数据库中的 16384个槽都有节点在处理时集群处于上线状态(ok);相反地如果数据库中有任何一个槽没有得到处理那么集群处于下线状态(fail),在前面我们使用CLUSTER MEET命令将7000、7001、7002三个节点连接到 了同一个集群里面不过这个集群目前仍然处于下线状态因为集群中的三个节点都没有在处理任何槽:
127.0.0.1:7000 cluster info
cluster_state:fail
cluster_slots_assigned:9
cluster_slots_ok:9
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:1
cluster_current_epoch:1
cluster_my_epoch:1
cluster_stats_messages_sent:2481
cluster_stats_messages_received:2478通过向节点发送CLUSTER ADDSLOTS命令可以将一个或者多个槽指派给节点负责
CLUSTER ADDSLOTS slot [slot ...]