redis cluster集群的源码分析(1)

本文深入分析Redis Cluster的源码,重点探讨集群通信机制,包括MEET、PING/PONG、FAIL等9种消息类型及其作用。同时,讲解了集群的故障检测与处理,如节点疑似下线(PFAIL)的判断,FAIL状态的传播以及故障转移(Failover)的过程。
摘要由CSDN通过智能技术生成

对于cluster.c的源码分析,我将会分两部分介绍。本文主要分析集群通信和通信故障。

先大致归纳下cluster的主要函数

void clusterCron(void);//集群的定时任务
int clusterProcessPacket(clusterLink *link);//消息处理中心
void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link);//根据消息中的gossip信息更新nodes里的节点
void clusterAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask);//接收集群中节点的连接
void clusterReadHandler(aeEventLoop *el, int fd, void *privdata, int mask);//读处理函数
void clusterWriteHandler(aeEventLoop *el, int fd, void *privdata, int mask);//写处理函数
void clusterSendPing(clusterLink *link, int type);//发送ping,pong,meet消息给指定节点,同时将gossip信息(集群其他节点的存活状况)更新给指定的节点
void clusterSendFail(char *nodename);//发送fail消息给所有连接的节点
void clusterSendFailoverAuth(clusterNode *node);//发送FailoverAuth消息给指定节点,给指定节点投票
void clusterSendMFStart(clusterNode *node);//发送MFStart消息给指定节点
void clusterSendUpdate(clusterLink *link, clusterNode *node);//发送关于node的update信息给节点,去更新指定节点的槽信息
void clusterSendFailoverAuthIfNeeded(clusterNode *node, clusterMsg *request);//判断是否需要给发送投票,如果可以就给发送者投票
void clusterHandleSlaveFailover(void);//处理failover
void clusterHandleSlaveMigration(int max_slaves);//处理slave迁移
void resetManualFailover(void);//在启动或终止failover时,进行初始化
void clusterDoBeforeSleep(int flags);
clusterNode *clusterLookupNode(char *name);//根据节点名字在nodes中获取节点
void clusterSetMaster(clusterNode *n);//将节点设置为master,如果自身是master,则转变成slave
void clusterSetNodeAsMaster(clusterNode *n);
int clusterNodeAddSlave(clusterNode *master, clusterNode *slave);
clusterNode *createClusterNode(char *nodename, int flags);
int clusterAddNode(clusterNode *node);
void clusterDelNode(clusterNode *delnode);
int clusterAddSlot(clusterNode *n, int slot);
int clusterDelSlot(int slot);
int clusterDelNodeSlots(clusterNode *node);
void clusterCloseAllSlots(void);

集群通信

       集群中的各个节点通过发送和接收信息来进行通信,我们把发送消息的节点叫做发送者,接收消息信息节点叫做接收者。发送的信息主要有以下九种:

1、MEET消息:当发送者接收到客户端发送的cluster meet命令时,发送者会向接收者发送meet消息,请求接收加入到发送者所在的集群里。

2、PING消息:集群里用来检测相应节点是否在线的消息,每个节点默认每隔一秒从节点列表随机选5个节点,然后对最长时间没有收到PONG回复的节点发送PING消息。此外,如果上次收到某个节点的PONG消息回复的时间,距离当前时间超过了cluster-node-time选项设置的一半,那么会对此节点发送PING消息,这样可以防止节点长期没被随机到,而导致长期没有发送PING检测是否存活。

3、PONG消息:当接收者收到发送者发来的meet消息或者ping消息时,为了向发送者确认这条meet消息或ping消息已到达,接收者向发送者返回一条pong消息。另外,一个节点也可以通过向集群广播自己的pong消息来让集群中的其他节点立即刷新关于这个节点的认识、。

4、FAIL消息:当一个主节点a判断另外一个主节点b已经进入fail状态时,节点a向集群广播一条关于节点b的fail消息,所有收到这条消息的节点都会立即将节点b标记为已下线。

5、PUBLISH消息:当节点接收到一个PUBLISH命令时,节点会执行这个命令,并向集群广播一条PUBLISH消息,所有接收到PUBLISH消息的节点都会执行相同的PUBLISH命令。

6、FAILOVER_AUTH_REQUEST消息:当slave的master进入fail状态,slave向集群中的所有的节点发送消息,但是只有master才能给自己投票failover自己的maser。

7、FAILOVER_AUTH_ACK消息:当master接收到FAILOVER_AUTH_REQUEST消息,如果发送者满足投票条件且自己在当前纪元未投票就给它投票,返回FAILOVER_AUTH_ACK消息.。

8、UPDATE消息:当接收到ping、pong或meet消息时,检测到自己与发送者slots不一致,且发送的slots的纪元过时, 就发送slots中纪元大于发送者的节点信息作为update消息的内容给发送者。

9、MFSTART消息:当发送者接收到客户端发送的cluster failover命令时,发送者会向自己的master发送MFSTART消息,进行手动failover。

     clusterProcessPacket是cluster的消息处理中心,来负责处理集群中的MEET,PING,FAIL,PUBLISH,FAILOVER_AUTH_REQUEST,FAILOVER_AUTH_ACK,UPDATE,MFSTART这几种消息。(吐槽一下,clusterProcessPacket函数长达几百行看着眼花缭乱)

int clusterProcessPacket(clusterLink *link) {
	……
    //检查发送者是否已知节点且是否处于handshake状态
    sender = clusterLookupNode(hdr->sender);
    if (sender && !nodeInHandshake(sender)) {
        //根据消息更新发送者在此节点的上的配置纪元信息和此节点的当前纪元
        if (senderCurrentEpoch > server.cluster->currentEpoch)
            server.cluster->currentEpoch =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值