Redis原始碼分析--Sentinel(5)故障轉移狀態機md
阿新 • • 發佈:2022-02-07
故障轉移狀態機:
一、狀態機函式sentinelFailoverStateMachine:
終於進入故障轉移,先看一下狀態機函式:
void sentinelFailoverStateMachine(sentinelRedisInstance *ri) { redisAssert(ri->flags & SRI_MASTER); /* 如果機器不在故障轉移狀態,直接退出 */ if (!(ri->flags & SRI_FAILOVER_IN_PROGRESS)) return; switch(ri->failover_state) { case SENTINEL_FAILOVER_STATE_WAIT_START: /* 判斷本sentinel是否為leader */ sentinelFailoverWaitStart(ri); break; case SENTINEL_FAILOVER_STATE_SELECT_SLAVE: /* 選擇從伺服器作為新的主伺服器 */ sentinelFailoverSelectSlave(ri); break; case SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE: /* 向被選中的從伺服器傳送SLAVEOF no one */ sentinelFailoverSendSlaveOfNoOne(ri); break; case SENTINEL_FAILOVER_STATE_WAIT_PROMOTION: /* 觀察被選中的從伺服器是否被升級為主伺服器 */ sentinelFailoverWaitPromotion(ri); break; case SENTINEL_FAILOVER_STATE_RECONF_SLAVES: /* 讓原來的slave跟隨新的master * ri是當前master,新的master是ri->promoted_slave */ sentinelFailoverReconfNextSlave(ri); break; } }
- L22:這裡只處理超時,真正判斷slave升級為master在第二篇INFO命令的回撥中進行;