1. 程式人生 > 其它 >Redis原始碼分析--Sentinel(5)故障轉移狀態機md

Redis原始碼分析--Sentinel(5)故障轉移狀態機md

故障轉移狀態機:

一、狀態機函式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命令的回撥中進行;