第17章 集群
节点连接:CLUSTER MEET <ip> <port>
查看节点:CLUSTER NODES
节点握手过程:
- 节点A会为节点B创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面
- 之后,节点A将根据CLUSTER MEET命令给定的IP地址和端口号,向节点B发送一条MEET消息(message)
- 如果一切顺利,节点B将接收到节点A发送的MEET消息,节点B会为节点A创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面
- 之后,节点B将向节点A返回一条PONG消息
- 如果一切顺利,节点A将接收到节点B返回的PONG消息,通过这条PONG消息节点A可以知道节点B已经成功地接收到了自己发送的MEET消息
- 之后,节点A将向节点B返回一条PING消息
- 如果一切顺利,节点B将接收到节点A返回的PING消息,通过这条PING消息节点B可以知道节点A已经成功地接收到了自己返回的PONG消息,握手完成
之后,节点A会将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点也与节点B进行握手,最终,经过一段时间之后,节点B会被集群中的所有节点认识。
槽指派:CLUSTER ADDSLOTS <slot> [slot ...]
只有当16384个槽全部被指派时,集群才处于上线状态。
计算键属于哪个槽:CRC16(key) & 16383
redis-trib对集群的单个槽进行重新分片的步骤:
- redis-trib对目标节点发送
CLUSTER SETSLOT<slot>IMPORTING<source_id>
命令,让目标节点准备好从源节点导入(import)属于槽slot的键值对。
- redis-trib对源节点发送
CLUSTER SETSLOT<slot>MIGRATING<target_id>
命令,让源节点准备好将属于槽slot的键值对迁移(migrate)至目标节点。
- redis-trib向源节点发送
CLUSTER GETKEYSINSLOT<slot><count>
命令,获得最多count个属于槽slot的键值对的键名(key name)。
- 对于步骤3获得的每个键名,redis-trib都向源节点发送一个
MIGRATE<target_ip><target_port><key_name>0<timeout>
命令,将被选中的键原子地从源节点迁移至目标节点。
- 重复执行步骤3和步骤4,直到源节点保存的所有属于槽slot的键值对都被迁移至目标节点为止。
- redis-trib向集群中的任意一个节点发送
CLUSTER SETSLOT<slot>NODE<target_id>
命令,将槽slot指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会知道槽slot已经指派给了目标节点。
对槽slot进行重新分片的过程 MOVED错误:当节点发现键所在的槽并非由自己负责处理的时候,节点就会向客户端返回一个MOVED错误,指引客户端转向正在负责槽的节点,并再次发送之前想要执行的命令。
ASK错误:分片过程中,客户端命令要处理的数据库键恰好属于正在被迁移的槽时,源节点会先在自己的数据库里面查找,如果找到就直接执行,找不到就向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,首先发送ASKING
命令,然后再次发送之前想要执行的命令。
ASK错误和MOVED错误的区别 设置从节点:CLUSTER REPLICATE <node_id>
选举新的主节点:
- 集群的配置纪元是一个自增计数器,它的初始值为0。
- 当集群里的某个节点开始一次故障转移操作时,集群配置纪元的值会被增一。
- 对于每个配置纪元,集群里每个负责处理槽的主节点都有一次投票的机会,而第一个向主节点要求投票的从节点将获得主节点的投票。
- 当从节点发现自己正在复制的主节点进入已下线状态时,从节点会向集群广播一条
CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST
消息,要求所有收到这条消息、并且具有投票权的主节点向这个从节点投票。
- 如果一个主节点具有投票权(它正在负责处理槽),并且这个主节点尚未投票给其他从节点,那么主节点将向要求投票的从节点返回一条
CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
消息,表示这个主节点支持从节点成为新的主节点。
- 每个参与选举的从节点都会接收
CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
消息,并根据自己收到了多少条这种消息来统计自己获得了多少主节点的支持。
- 如果集群里有N个具有投票权的主节点,那么当一个从节点收集到大于等于N/2+1张支持票时,这个从节点就会当选为新的主节点。
- 因为在每一个配置纪元里面,每个具有投票权的主节点只能投一次票,所以如果有N个主节点进行投票,那么具有大于等于N/2+1张支持票的从节点只会有一个,这确保了新的主节点只会有一个。
- 如果在一个配置纪元里面没有从节点能收集到足够多的支持票,那么集群进入一个新的配置纪元,并再次进行选举,直到选出新的主节点为止。
节点发送的消息主要有以下五种: