Redis cluster 从库自动failover机制

目录

一、每个节点维护的信息

二、故障发现(主观下线)

三、客观下线

1.下线报告链表

2.pfail到fail的转变

四、从库通过clusterCron发起自动切换

五、主库投票

六、从库执行切换

七、纪元更新


一、每个节点维护的信息

每个节点内的clusterState结构保存集群信息,从库自身视角所维护的一些信息。结构关键属性如下:

在cluster.h文件中:
typedef struct clusterState {
clusterNode *myself;               /* 自身节点 */
int size;                          /* 当前节点认为的集群节点数 */
dict *nodes;                       /* 集群节点字典,当前节点认为集群中有哪些节点,key为节点ID,value为对应节点ClusterNode结构 */
...
} clusterState;

此外每个节点都会为集群里的所有节点维护一个clusterNode结构,通过上述clusterState的nodes指针指向这些clusterNode,大致结构如下:

typedef struct clusterNode {
int flags;                         /* 节点的状态,如:master/slave,pfail/fail等 */
mstime_t ping_sent;                /* 本节点最后一次与该节点发送ping消息的时间 */
mstime_t pong_received;            /* 最后一次接收到该节点pong消息的时间 */
...
} clusterNode;

clusterNode里的flags,有以下状态:

CLUSTER_NODE_MASTER 1       /* 当前为主节点 */
CLUSTER_NODE_SLAVE 2        /* 当前为从节点 */
CLUSTER_NODE_PFAIL 4        /* 主观下线状态 */
CLUSTER_NODE_FAIL 8         /* 客观下线状态 */
CLUSTER_NODE_MYSELF 16      /* 表示自身节点 */
CLUSTER_NODE_HANDSHAKE 32   /* 握手状态,未与其他节点进行消息通信 */
CLUSTER_NODE_NOADDR 64      /* 无地址节点,用于第一次meet通信未完成或者通信失败 */
CLUSTER_NODE_MEET 128       /* 需要接受meet消息的节点状态 */
CLUSTER_NODE_MIGRATE_TO 256 /* 该节点被选中为新的主节点状态 */

二、故障发现(主观下线)

集群节点间通过gossip相互通信,如果节点A收到节点B的pong,节点A则更新节点B clusterNode的pong_received。

每个节点都会检测自己维护的各节点clusterNode,是否有节点的pong_received大于cluster-node-timeout,如果有,则认为该节点不可用,将不可用节点的flags设为CLUSTER_NODE_PFAIL。

76803:S 09 Jun 17:01:19.274 . *** NODE 64cdc10096644b5bc3624f41ade916983806c47c possibly failing

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值