Redis cluster集群 故障转移

        Redis集群自身实现了高可用,通过增加Slave从节点做standby数据副本,能够实现故障自动转移,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。当集群内少量节点出现故障时通过自动故障转移保证集群可以正常对外提供服务。

一、故障发现

       Redis集群内节点通过ping/pong消息实现节点通信,消息不但可以传播节点槽信息,还可以传播其他状态如:主从状态、节点故障等。因此故障发现也是通过消息传播机制实现的,主要环节包括:主观下线(pfail)和客观下线(fail)。

2.1 主观下线

        主观下线指某个节点认为另一个节点不可用,即下线状态,这个状态并不是最终的故障判定,只能代表一个节点的意见,可能存在误判情况。Redis集群对于节点最终是否故障需要与集群中的其他主节点功能协商,多个节点协作完成故障发现的过程叫做客观下线。

集群状态(flags):

2.2 客观下线

        客观下线指标记一个节点真正的下线,集群内多个节点都认为该节点不可用,从而达成共识的结果。如果是持有槽的主节点故障,需要为该节点进行故障转移。

客观下线流程:

 

 

1. 当消息体内含有其他节点的pfail状态会判断发送节点的状态,如果发送节点是主节点则对报告的pfail状态处理,从节点则忽略

2. 找到pfail对应的节点结构,更新clusterNode内部下线报告链表

        维护下线报告链表:

        每个节点ClusterNode结构中都会存在一个下线链表结构,保存了其他主节点针对当前节点的下线报告。

typedef struct clusterNodeFailReport {

            struct clusterNode  node;          /* 报告该节点为主观下线的节点 */

            mstime_t time;                         /* 最近收到下线报告的时间 */

} clusterNodeFailReport;

3. 根据更新后的下线报告链表告尝试进行客观下线。       

尝试客观下线流程:

       如果在cluster-node-time*2时间内无法收集到一半以上槽节点的下线报告,那么之前的下线报告将会过期,也就是说主观下线上报的速度追赶不上下线报告过期的速度,那么故障节点将永远无法被标记为客观下线从而导致故障转移失败。因此不建议将cluster-node-time设置得过小。

 

向集群广播下线节点的fail消息:

  • 通知集群内所有的节点标记故障节点为客观下线状态并立刻生效。

  • 通知故障节点的从节点触发故障转移流程。

二、故障转移

       故障节点变为客观下线后,如果下线节点是持有槽的主节点则需要在它的从节点中选出一个新的主节点, 从而保证集群的高可用。下线主节点的所有从节点承担故障恢复的义务,当从节点通过内部定时任务发现自身复制的主节点进入客观下线时,将会触发故障恢复流程

故障恢复流程:

1)资格检查

        被标记为客观下线的主节点的所有个从节点都要检查最后与主节点断线时间,判断是否有资格替换故障的主节点。如果从节点与主节点断线时间超过cluster-node-time*cluster-slave-validity-factor,则当前从节点不具备故障转移资格。cluster-slave-validity-factor从节点有效因子可以在配置文件中修改。

2)、准备选举时间

       计算下线主节点所有从节点的优先级排名(复制偏移量越大优先级越高),排名高的从节点优选获得选举权,排名每降低一位则延迟1秒开始选举。

 

 

3)、发起选举

       当从节点定时任务检测到达故障选举时间到达后,发起选举流。在集群内广播选举消息(FAILOVER_AUTH_REQUEST),并记录已发送过消息的状态,保证该从节点在一个配置纪元内只能发起一次选举。

4)、选举投票

       只有持有槽的主节点才会处理故障选举消息(FAILOVER_AUTH_REQUEST),因为每个持有槽的节点在一个配置纪元内都有唯一的一张选票,当接到第一个请求投票的从节点消息时回复FAILOVER_AUTH_ACK消息作为投票,之后相同配置纪元内其他从节点的发送过来的选举消息将忽略。offset越大的从节点越先发送选举消息,可以降低主从复制数据的丢失的数据量

       如集群内有N个持有槽的主节点代表有N张选票。由于在每个配置纪元内持有槽的主节点只能投票给一个从节点,因此只能有一个从节点获得N/2+1超过半数的选票,保证能够找出唯一的从节点。

       投票作废:每个配置纪元代表了一次选举周期,如果在开始投票之后的cluster-node-timeout*2时间内没有一个从节点获取足够数量的投票,则本次选举作废。从节点对配置纪元自增+1并发起下一轮投票,直到选举成功为止。

5)、替换主节点

  1. 投票成功的从节点取消复制变为主节点。

  2. 执行clusterDelSlot操作撤销故障主节点负责的槽,并执行clusterAddSlot把这些槽委派给自己。

  3. 向集群广播消息,通知集群内所有的节点当前从节点变为主节点并接管了故障主节点的槽信息。

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值