目录
1.节点
一个redis集群通常由多个节点组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群中,要建立一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。连接各个节点可以通过CLUSTER MEET命令完成
1.1启动节点
一个节点就是一个运行在集群模式下的redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式:
节点 ,即运行在集群模式下的Redis服务器,会继续使用所有在单机模式中使用的服务器组件:
1.2集群数据结构
clusterNode——节点的创建时间、名字、配置纪元、IP地址以及端口。每一个节点都会使用一个clusterNode来记录自己的状态,并为集群中的所有其他节点(包括主节点和从节点)都创建一个相应的clusterNode结构,以此来记录其他节点的状态
1.3CLUSTER MEET命令的实现
通过向节点A发送CLUSTER MEET命令,可以让接受命令的A节点将另一个节点B添加到节点A当前所在的集群里面。
2.槽指派
2.1记录节点的槽指派信息
2.2传播节点的槽指派信息
2.3记录集群所有的槽的指派信息
State.slots是从槽的角度,记录了每一个槽被指派给了哪个节点,这样想知道具体某一个槽是被指派给哪个节点的时候只需要O(1)的时间复杂度就能知道;Node.slots是从某一个节点的角度,去看自己指派监管了哪几个槽。
2.4CLUSTER ADDSLOTS命令的实现
CLUSTER ADDSLOTS命令接受一个或多个槽作为参数,并将所有输入的槽指派给接收该命令的节点负责:
3.在集群中执行命令
在对数据库中16384个槽都进行了指派之后,集群就会进入上线状态,这是客户端就可以向集群中的节点发送数据命令了。
3.1计算键属于哪个槽
节点使用以下计算方法来计算给定键key属于哪个槽:
3.2判断槽是否由当前节点负责处理
3.3MOVED错误
当节点发现键所在的槽并非由自己负责处理的时候,节点就会向客户端返回一个MOVED错误,指引客户端转向至正在负责槽的节点。
3.4节点数据库的实现
5ASK错误
6.复制和故障转移
Redis集群中的节点分为主节点和从节点,其中主节点用去处理槽,而从节点用于复制某个主节点,并在被复制的主节点下线时,替代下线的主节点继续处理命令请求。
7.消息
集群中的各个节点通过发送和接收消息来进行通信。我们称发送消息的节点为发送者,接收消息的节点为接收者