目录
一、每个节点维护的信息
每个节点内的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