17、集群

2020-12-28  本文已影响0人  hedgehog1112

一、节点

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)clusterNodeslots:处理的槽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的数据库键。

上一篇下一篇

猜你喜欢

热点阅读