redis哨兵是對主從複製技術的補充,負責監控redis主從複製並在主節點宕機後執行自動故障轉移,同時更新故障轉移後新的配置,並提供客戶端最新的主節點和從節點信息.客戶端也被明確要求支持redis哨兵功能
redis哨兵通過一個別名來唯一標註一個主從複製架構中的主節點信息,該主從架構可以有數個從節點.
一個支持redis哨兵功能的客戶端可以自動發現故障轉移後的新的主節點信息,因為redis客戶端連接的是哨兵節點的額地址,而不是傳統意義的主節點的ip地址.一個支持redis哨兵功能的客戶端需同時支持以下兩個哨兵的配置.
下面是一個支持redis哨兵的客戶端通過哨兵獲得主節點地址的步驟.
剛才提到,客戶端可以配置多個哨兵地址,一個新連接被觸發後,客戶端從列表中第一個哨兵地址開始遍歷,如果在指定的超時時間內(通常為數百毫秒)第一個哨兵地址不可達,那麼就嘗試下一個哨兵地址,以此類推,直到返回成功為止.
一旦客戶端連接到哨兵節點後,客戶端嘗試在哨兵節點執行以下命令
SENTINEL get-master-addr-by-name master-name
該結果會返回指定別名下主從複製架構中主節點的ip:port信息,如果返回null,說明指定的別名不存在.
redis客戶端獲得主節點的地址後,就可以使用該地址進行讀寫操作了.
一旦客戶端連接上主節點,客戶端會嘗試執行role命令來驗證當前節點是否真的是主節點,如果不是,客戶端等待一段時間(幾百毫秒)後會重新執行第一步.
一旦客戶端獲取主節點後連接就會建立,每一次重新連接時,客戶端都需要重新從上述步驟1的哨兵開始重新建立連接,例如在下列情況客戶端和哨兵都會重新建立連接.
從redis2.8開始,當redis哨兵在執行故障轉移,將一個從節點升級為主節點,或者故障轉移後將原來的主節點配置為新的主節點的從節點,或者更改從節點連接的過期的主節點的地址時,哨兵會在操作的節點上執行CLIENT KILL type normal來確保所有連接的客戶端被斷開,這會強制讓客戶端重新連接到主節點.
如果故障轉移後哨兵節點還沒有來得及更新新的主節點信息,恰好有客戶端連接進來,那麼客戶端再執行role命令後獲得當前節點覺得並不是master,redis客戶端將會重新連接哨兵並再次嘗試.
還有一種情況,一個客戶端連接到了一個過期的哨兵節點並返回剛剛重新上線的過期主節點客戶端通過role命令可以正常返回master值,然而當該過期主節點重新上線時哨兵節點會將過期主節點降級為從節點,並斷開所有針對該節點的所有連接.
對於客戶端使用連接池的情況,當哨兵執行故障轉移後,連接池的所有連接都會斷掉,並且需要從哨兵重新獲得新的連接.
一旦客戶端連接哨兵並返回get-master-addr-by-name成功後,客戶端就會根據下列處理過程更新自己內部的哨兵列表.