17.集群
cluster-enabled # 是否开启集群模式的选项
CLUSTER MEET <ip> <port> # 告诉当前节点将ip:port节点加入到集群中
三个数据结构:
- clusterNode:clusterNode 结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点当前的配置纪元、节点的IP地址和端口号等等。
- clusterLink:clusterNode结构的link属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输人缓冲区和输出缓冲区。
redisClient结构中的套接字和缓冲区是用于连接客户端的,而clusterLink结构中的套接字和缓冲区则是用于连接节点的。 - clusterState:记录了在当前节点的视角下,集群目前所处的状态,例如集群是在线还是下线,集群包含多少个节点,集群当前的配置纪元,诸如此类:
三次握手:CLUSTER MEET <ip> <port>
进行三次握手的过程如下,PONG和PING相当于两个“确认收到”的信息:
整个数据库被分为16384(2048*8)槽
只有这16384槽都有节点在处理时,集群才处于上线状态。
将槽0至槽5000指派给节点:
CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000
:
每个节点都会将自己负责的槽发送给其他节点,所以集群中的每个节点都会知道数据库中的16384个槽分别被指派给了集群中的哪些节点。
- clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽。这样就可以通过少量的代价就可以告诉其他节点,当前节点负责哪些槽。
- clusterstate结构中的slots数组记录了集群中所有16384个槽都由哪个节点进行处理。用于快速得知某个槽是要由哪个节点负责的。
CLUSTER KEYSLOT <key>
命令可以查看一个给定键属于哪个槽,计算算法为CRC16(key) & 16383
如果当前节点不负责客户发送过来的key,就会告诉客户处理该key的节点的ip和端口。
clusterState结构中的slots_to_keys为跳跃表,用来保存槽和键之间的关系:
slots_to_keys 跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员( member)都是一个数据库键。由于使用槽号进行排序,所以相同槽号的key都是紧挨在一起的,故通过slots_to_keys可以快速找到某个槽对应的所有key。
【注】在跳表中,每个member都对应一个score,而这个score将用来在跳表中进行排序。