Redi集群

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/smilesundream/article/details/85529361

节点集群维护

节点维护一个clusterState结构体,其中含有nodes数组指针,指向的每个元素就是集群中的每个节点,同时改结构体中的myself指针指向本节点

Meet命令实现

向A节点发送MEET B命令后,A将在clusterStats中为B创建相应结构,之后与B进行握手,B将读取A发送来的信息命令,并回复给A pong,A收到后再回复给B一个ping,之后A再将B通过Gossip传播给集群中其他节点。

故障转移

当一个从节点发现自己的主节点进入故障下线后,将向集群中的其他节点发送消息请求将自己设为主节点,如果获得半数投票后,将成为主节点,新的主节点会将老的主节点的所有槽指派给自己

槽指派

clusterNode中的slots数组保存了本节点存储的槽,用bit位表示。并且节点会将自己的槽指派信息发送给其他节点,让其他节点进行更新。

clusterStats中的slots指针数组保存了每个槽的指派信息,其表示槽i对应的节点是多少。

用cluster addslots告诉指定节点添加相应槽后,节点将把自己的槽信息告诉集群中其他节点

Meet ping pong消息的实现

每次发送消息时,发送者从自己的已知节点中,随机选出两个节点,将其状态信息写入消息体中,再发给任意节点。接受者接收到后,如果判断这两个节点自己的列表中并不存在,则将与指定节点进行握手。否则更新节点列表的信息。

Fail消息的实现

当某个节点认定另外一个节点下线时,将向集群广播这个节点的fail消息,其他节点收到后都将这个节点标记为下线状态。从而判断是否要将集群标记为下线或者对故障节点进行故障转移。

猜你喜欢

转载自blog.csdn.net/smilesundream/article/details/85529361