Redis的哨兵機制

2021-10-19 14:39:10 字數 1471 閱讀 1546

在主從集群模式下,如果從庫發生故障,客戶端可以繼續向主庫或其他從庫傳送請求,進行相關操作,但是如果主庫發生故障,就會直接影響從庫同步,如果客戶端傳送的是讀操作,還可以由其他從庫繼續服務,但是一旦有寫操作,就沒有例項來服務客戶端的寫請求操作了。

如果主庫掛了,就需要執行乙個新主庫,比如把乙個從庫切換為主庫。這就涉及到三個問題:

主庫真的掛了嗎?

該選擇哪個從庫作為主庫?

怎麼把新主庫的相關資訊通知給從庫和客戶端?

在redis主從集群中,哨兵機制是實現主從庫自動切換的關鍵機制。哨兵就是乙個執行在特殊模式下的redis程序,它主要負責三個任務:監控、選主和通知

選主是指主庫掛了以後,哨兵就需要從多個從庫中選擇乙個從庫例項,把它作為新的主庫。

通知是指重新選擇主庫後,哨兵會把新主庫的連線資訊傳送給其他從庫,讓他們執行replicaof命令,和新主庫建立連線,並進行資料複製。同時,哨兵會把新主庫的連線資訊通知給客戶端,讓他們把請求操作傳送到新主庫上。

如何判斷主庫是否下線?

哨兵對主庫的下線判斷有「主觀下線」和「客觀下線」。

哨兵程序會使用ping命令檢測它自己和主、從庫的網路連線狀況,用來判斷例項的狀態,如果發現主、從庫對ping命令的響應超時了,那麼哨兵就會把它標記為「主觀下線」。

如果檢測的是從庫,那麼,哨兵把它標記為「主觀下線」就行了,應為從庫的下線影響不大,集群對外服務不會中斷。

但是如果檢測的是主庫,那麼哨兵不能簡單的把它標記為「主觀下線」。因為可能是集群網路壓力較大、網路阻塞,或者主庫本身壓力較大等情況,導致哨兵誤判了,一旦啟動了主從切換,後續的選主和通知操作會帶來額外的計算開銷和通訊開銷。

為了避免這個問題,哨兵機制通常會採用多例項組成的集群模式進行部署,也被稱為哨兵集群。引入多個哨兵一起判斷,可以避免單個哨兵自身網路狀況不好而誤判主庫下線的情況。同時,多個哨兵的網路同時不穩定的概率小,由他們一起做決策,能有效降低誤判率。

在判斷主庫是否下線時,不能由乙個哨兵說了算,只有大多數哨兵例項都判斷主庫已經「主觀下線」時,主庫才會被標記為「客觀下線」。當有n個哨兵例項時,最好要有n / 2 + 1個例項判斷主庫為「主觀下線」,才能最終判定主庫為「客觀下線」。具體由多少個例項做出「主觀下線」的判斷才可以,可以自行設定。

如何選定新主庫?

哨兵選擇主庫的過程為「篩選 + 打分」。

打分規則分別為從庫優先順序、從庫複製進度和從庫id號。

多個哨兵例項可以降低誤判率,但是也會產生一些新的問題:

redis哨兵機制

為了解決redis主從複製模式致命缺點,當主節點宕機,影響整個系統執行,引入哨兵機制sentinel。sentinel哨兵主要解決以下問題 哨兵配置如下 哨兵工作原理 哨兵是乙個特殊的redis伺服器,不同的是命令以及不會持久化,啟動時,根據配置檔案中master主節點ip和埠,建立兩個連線,一為命...

redis哨兵機制

sentinal 哨兵 哨兵是redis集群架構中非常重要的乙個元件,主要功能如下 port 26379 當前sentinel服務執行的埠 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down after milliseconds myma...

Redis中的哨兵機制

sentinel哨兵機制實際上就是對redis的主從節點進行監控,當主節點發生宕機之後,被多個sentinel哨兵發現,然後他們從從節點中推選出新的主節點,告訴其他從節點新的主節點的位址,最後將新的主節點的位址告知連線sentinel的客戶端。值得注意的是,如果原來的主節點在宕機之後突然復活,它也只...