一、节点
1、启动节点
1)CLUSTER MEET <ip> <port> 命令把指定服务器,添加当前集群
2)CLUSTER NODES 查询当前集群中所有节点信息,ps:cluster-enabled yes 开启集群模式节点才能被添加到集群
3)集群执行serverCron函数时,比单击节点多执行clusterCron函数
2、集群数据结构
1)clusterNode:保存节点当前状态,如创建时间,名字,当前配置纪元,IP和端口号,link(属clusterLink)
2)clusterLink:连接节点有关信息,如套接字描述,输入缓冲区,输出缓冲区
3)clusterState:记录集群状态,在线/下线,包含多少节点
3、Cluster meet执行流程
1)节点B向A发送CLUSTER MEET,A解析出目标服务器B的ip和端口
2)A为B创建clusterNode,添加到clusterState.nodes字典中,发MEET到B
3)B收MEET后,为A创建clusterNode,添加到clusterState.nodes字典中,回复PONG通知A已收到
4)A收PONG后,回复PING通知B收到PONG,握手结束。A将节点B消息通过Gossip协议传播,让其它节点和B握手
二、槽
1、槽信息
1)所有槽都有节点处理时,集群处于上线状态(ok),否则处于下线状态(fail)
2)clusterNode的slots:记处理的槽,num slot处理槽个数。
slots是长度16384二进制数组,第i为1表示i号槽被当前节点处理,0不是,取/设值O(1)。slots传播集群其它节点,告知当前处理槽
3)clusterState.slots:记槽指派信息,存clusterNode指针的数组;如slots[i] NULL槽未被指派,指向clusterNode结构,指派给当前clusterNode代表节点
ps:同时存clusterNode和State,提高查询效率,如不存Node,传播要挨个遍历,如不State,知道哪个被处理要遍历并检查
State中有跳表slots_to_keys保存槽和键映射,方便实现CLUSTER GETKEYSINSLOT <slot> <count>命令,返回最多count个属于slot的数据库键。
网友评论