redis集群

reidis集群简介

简图:

redis集群选举原理 redis集群模式选举_redis集群选举原理

 

定义:redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。

 

reidis集群选举原理

了解redis集群选举原理之前,我们首先要明白一件事情,那就是redis集群各节点之前的通讯协议:gossip协议。

gossip协议

gossip协议简单来解释下:各节点之间都会保持通讯,当某一个节点挂掉或者新增的时候,与它相邻的节点就会感知到,这时候此节点就是失去链接或者创建链接。

  • ping:每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据; 
  • pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新; 
  • fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了。
  • meet:某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信,不需要发送形成网络的所需的所有CLUSTER MEET命令。

 

Redis集群选举原理

流程图

 

redis集群选举原理 redis集群模式选举_redis集群_02

当slave(从节点)发现自己的master(主节点)不可用时,变尝试进行Failover,以便称为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

  1. slave发现自己的master不可用;
  2. slave将记录集群的currentEpoch(选举周期)加1,并广播FAILOVER_AUTH_REQUEST 信息进行选举;
  3. 其他节点收到FAILOVER_AUTH_REQUEST信息后,只有其他的master可以进行响应,master收到消息后返回FAILOVER_AUTH_ACK信息,对于同一个Epoch,只能响应一次ack;
  4. slave收集maste返回的ack消息
  5. slave判断收到的ack消息个数是否大于半数的master个数,若是,则变成新的master;
  6. 广播Pong消息通知其他集群节点,自己已经成为新的master。

 

注意:从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票。

  • 延迟计算公式:DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
  • SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

 

选举涉及到的其他知识:

Redis集群为什么至少需要三个master节点?

因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。

Redis集群为什么至少推荐节点数为奇数?

奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。

 

网络不稳定是否会是否引起选举?

真实世界的机房网络往往并不是风平浪静的,它们经常会发生各种各样的小问题。比如网络抖动就是非常常见的一种现象,突然之间部分连接变得不可访问,然后很快又恢复正常。

为解决这种问题,Redis Cluster 提供了一种选项cluster-node-timeout,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换 (数据的重新复制)。