哨兵
哨兵介紹
作用:
監控Redis系統的運行情況
功能:
- 監控主數據庫和從數據庫是否正常運行
- 主數據庫出現故障時自動將從數據庫轉換爲主數據庫
一個典型的哨兵架構
虛線表示主從複製,實線表示哨兵的監控路徑
多個哨兵監控
哨兵不僅會監控主數據庫和從數據庫,哨兵之間也會互相監控
哨兵的應用配置
- 建立一個配置文件,如sentinel.conf,內部爲
sentinel monitor mymaster 127.0.0.1 6379 1
- mymaster表示要監控的主數據庫的名字,可以自己定義,只能由大小寫字母 數字 ".-_"這三個字符組成
- 127.0.0.1 6379 表示主數據庫的地址和端口號
- 1 表示最低通過票數
- 配置哨兵監控一個系統的時候,只需要交控主數據庫即可,哨兵會自動發現所有複製該主數據庫的從數據庫
- 啓動Sentinel進程,並將上述配置文件的路徑傳遞給哨兵
redis-sentinel /path/to/sentinel.conf
- 返回值
- +slave 表示發現了從數據庫
- +sdown表示哨兵主觀認爲主數據庫停止服務了
- +odown表示哨兵客觀認爲主數據庫停止服務了
- +try-failover表示哨兵開始進行故障恢復
- +failover-end表示哨兵完成故障恢復
- +switch-master表示主數據庫從…端口遷移到…端口
- -sdown表示實例已經恢復
- +convert-to-slave表示將…端口實例設置爲現在主數據庫的從數據庫
哨兵的實現原理
- 一個哨兵節點可以同時監控多個redis主從環境
- 多個哨兵節點可以同時監控同一個Redis主從環境,形成網狀結構
- 哨兵啓動後,會與要監控的主數據庫建立兩條連接,其中一條連接用來訂閱主數據的__sentinel__:hello頻道以獲取其他同樣監控該數據庫的哨兵節點的信息
另外哨兵也需要定期向主數據庫發送INFO命令來獲取主數據庫本身的信息 - 三個貫穿哨兵進程的生命週期的操作
- 每10s哨兵會向主數據庫和從數據庫發送INFO命令
- 發送INFO命令使得哨兵可以獲得當前數據庫的相關信息從而實現新節點的主動發現
- 每2s哨兵會向主數據庫和從數據庫的__sentinel__:hello頻道發送自己的信息
- 每1s哨兵會向主數據庫 從數據庫和其他哨兵節點發送ping命令
- 配置發送ping命令的時間通過
down-after-milliseconds
- sentinel down-after-milliseconds mymaster 60000 // 每隔1s發送一次ping命令
- 當參數值小於1s時,哨兵會每隔設置的值的時間發送ping命令,當參數的值大於1s是,哨兵會每隔1s發送一次ping命令
- 配置發送ping命令的時間通過
- 每10s哨兵會向主數據庫和從數據庫發送INFO命令
主觀下線:
當超過down-after-milliseconds選項指定的時間後,如果ping的數據庫或節點仍然未進行回覆,則哨兵認爲主觀下線
客觀下線:
主觀下線表示從當前的哨兵進程來看,該節點已經下線,如果該節點是主數據庫,則哨兵會進一步判斷是否需要對其進行故障恢復:
哨兵發送sentinel is-master-down-by-addr
命令詢問其他哨兵節點以瞭解他們是否也認爲該數據庫主觀下線,如果達到指定數量
時,
哨兵會認爲其客觀下線,並選舉領頭的哨兵節點對主從系統發起故障恢復
指定數量指的是: sentinel monitor mymaster 127.0.0.1 6379 1 中的1
領頭哨兵選舉(Raft算法)
- 發現主數據庫客觀下線的哨兵節點(下面稱作A)向每個哨兵節點發送命令,要求對方選自己成爲領頭哨兵
- 如果目標哨兵節點沒有選過其他人,則會同意A設置成零頭哨兵
- 如果A發現有超過半數且超過quorum參數值的哨兵節點同意選自己成爲領頭哨兵,則A成功成爲領頭哨兵
- 當有多個哨兵節點同時參選領頭哨兵,則會出現沒有任何節點當選的可能.此時每個參選節點將等待一個隨機時間重新發起參選請求,進行下一輪選舉,直到選舉成功
領頭哨兵挑選數據庫的依據
- 在所有在線的從數據庫中,選擇優先級最高的從數據庫,優先級可以通過slave-priority選項來設置
- 如果有多個最高優先級的數據庫,則複製的命令偏移量越大(即複製越完整)越優先
- 如果以上條件都一樣,則選擇運行ID較小的數據庫
哨兵部署
- 一個主系統中哨兵數量少,可靠性就會降低,當只有一個哨兵,容易發生單點故障
- 相對穩妥的是使哨兵的視角儘可能與每一個節點的視角一致
- 爲每個節點(無論是主數據庫還是從數據庫)部署一個哨兵
- 使每個哨兵與其對應的節點的網絡環境相同或相近
- 設置quorum的值爲N/2 + 1(其中N爲哨兵節點數量),這樣使得只有當大部分哨兵點同意後纔會進行故障恢復
- 具體配置還要根據實際情況,因爲當節點較多時,會產生大量冗餘連接,同時如果redis節點負載較高,會在一定程度上影響其對哨兵的回覆以及與其同機的哨兵與其他節點的通信