走進Redis:哨兵叢集

2022-08-11 15:00:45

為什麼需要哨兵

在 Redis 的主從庫模式中,如果從庫發生了故障,使用者的操作是可以繼續進行的,因為寫操作是隻在主庫中進行的。那麼,如果主庫發生了故障,使用者的操作將會收到影響。這時候可能會需要選擇一個從庫在作為主庫繼續服務使用者的操作。Redis 提供的哨兵機制就是解決主從庫模式的 Redis 服務可用性問題的。

故障轉移的基本流程

哨兵發現主庫下線並選出新主庫的流程稱為故障轉移,這個過程需要解決三個問題:

  1. 主庫真的掛了嗎?(監控)
  2. 該選擇那個從庫作為主庫?(選主)
  3. 怎麼把新主庫的相關資訊通知給從庫和使用者端呢?(通知)

監控

哨兵在執行過程中週期性的給所有主從庫傳送 PING 命令,以此檢測它們是否正常執行。如果某個範例對 PING 命令的沒有在down-after-milliseconds 應答,那麼,哨兵會把它標記為「主觀下線」。

哨兵不會對主觀下線的從庫做額外的處理,如果是主庫主觀下線,那麼哨兵會進行後續的選主和通知操作,這些操作會有額外的計算和通訊開銷。為了減少誤判,哨兵通常會採用叢集部署。當一個哨兵將 master 標記為主觀下線後,會和其它哨兵範例通過命令 SENTINEL is-master-down-by-addr 交流,如果有大於 quorum 個哨兵確認 master 已下線,則該 master 會被標記為」客觀下線」;否則,會重新將 master 標記為上線狀態。