Redis哨兵(sentinel)用法解讀
巡查監(jiān)控后臺master主機是否故障,如果故障了根據(jù)投票數(shù)自動將某一個從庫轉(zhuǎn)換為新主庫,繼續(xù)對外服務(wù)。
作用
- 主從監(jiān)控:監(jiān)控主從redis庫運行是否正常
- 消息通知:哨兵可以將故障轉(zhuǎn)移的結(jié)果發(fā)送給客戶端
- 故障轉(zhuǎn)移:如果master異常,則會進行主從切換,將其中一個slave作為新master
- 配置中心:客戶端通過連接哨兵來獲得當(dāng)前redis服務(wù)的主節(jié)點地址

示例
1. 在sentinel.conf文件中,使用如下命令設(shè)置要監(jiān)控的master服務(wù)器,quorum表示確認客觀下線的最少的哨兵數(shù)量
sentinel monitor <master-name> <ip> <redis-port> <quorum>
使用如下命令連接master服務(wù)的密碼
sentinel auth-pass <master-name> <password>
其他配置
sentinel down-after-milliseconds <master-name> <milliseconds> 指定多少毫秒之后,主節(jié)點沒有應(yīng)答哨兵,此時哨兵主觀上認為主節(jié)點下線 sentinel parallel-syncs <master-name> <nums>: 表示允許并行同步的slave個數(shù),當(dāng)Master掛了后,哨兵會選出新的Master,此時,剩余的slave會向新的master發(fā)起同步數(shù)據(jù) sentinel failover-timeout <master-name> <milliseconds>: 故障轉(zhuǎn)移的超時時間,進行故障轉(zhuǎn)移時,如果超過設(shè)置的毫秒,表示故障轉(zhuǎn)移失敗 sentinel notification-script <master-name> <script-path> : 配置當(dāng)某一事件發(fā)生時所需要執(zhí)行的腳本 sentinel client-reconfig-script <master-name> <script-path>: 客戶端重新配置主節(jié)點參數(shù)腳本
2. 啟動哨兵
![]()
查看sentinel.log,哨兵啟動成功

3. 將主機shutdown模擬主機故障

此時從機get數(shù)據(jù)時會失去連接,再次get數(shù)據(jù)重新發(fā)起連接,哨兵會從從機中選取新的master

查看主機的sentinel.log,選取了ip為192.168.229.102的從機作為新的master

4. 重新啟動原來的主機,可以看到原主機從master變?yōu)閟lave,新的master并不會改變

sdown:主觀下線,單個sentinel自己主觀上檢測到的關(guān)于master的狀態(tài)在發(fā)送PING心跳后一定時間內(nèi)(默認30s)沒有收到合法回復(fù)odown:客觀下線,多個sentinel達成一致意見認為一個master客觀上已經(jīng)宕機
- 當(dāng)主節(jié)點被判斷客觀下線后,各個哨兵節(jié)點會進行協(xié)商,先選舉出一個領(lǐng)導(dǎo)者哨兵,并由該哨兵進行故障遷移
- 哨兵選取新的master時,優(yōu)先選取原master的直接slave,如果直接slave不可用,才會去尋找slave的slave
領(lǐng)導(dǎo)者哨兵選取算法——Raft算法
基本思路是先到先得:即在一輪選舉中,哨兵A向B發(fā)送成為領(lǐng)導(dǎo)者的申請,如果B沒有同意過其他哨兵,則會同意A成為領(lǐng)導(dǎo)者

新master選取機制
1. 選出新的master,在健康的slave中,通過優(yōu)先級(redis.conf中slave-priority或replica-priority,數(shù)字越小優(yōu)先級越高)、復(fù)制偏移量、id三層比較選取新的master

2. 重新認定master,領(lǐng)導(dǎo)者哨兵會對選舉出的新master執(zhí)行slaveof no one;對其他slave發(fā)送命令使剩余slave稱為新master的slave
3. 原master成為新master的slave,領(lǐng)導(dǎo)者哨兵會讓原master降級為slave并恢復(fù)正常工作
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
從java8升級java17的一些調(diào)整總結(jié)
在過去的幾年里,Java經(jīng)歷了多次版本升級,從JDK8到JDK17,每一次升級都帶來了許多新的特性和改進,這篇文章主要介紹了從java8升級java17的一些調(diào)整,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-03-03
Springboot中基于X509完成SSL檢驗的原理與實現(xiàn)
本文詳細解析了HTTPS通信中SSL證書的作用和原理,SSL證書建立在客戶端和服務(wù)器之間的安全通道,確保數(shù)據(jù)傳輸?shù)耐暾院捅C苄?詳細的介紹了Springboot中基于X509完成SSL檢驗的原理與實現(xiàn),感興趣的可以了解一下2024-09-09
Spring事務(wù)框架之TransactionDefinition源碼解析
這篇文章主要為大家介紹了Spring事務(wù)框架之TransactionDefinition源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Springboot jdbctemplate整合實現(xiàn)步驟解析
這篇文章主要介紹了Springboot jdbctemplate整合實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟
這篇文章主要介紹了SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

