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

示例
1. 在sentinel.conf文件中,使用如下命令設(shè)置要監(jiān)控的master服務(wù)器,quorum表示確認(rèn)客觀(guān)下線(xiàn)的最少的哨兵數(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é)點(diǎn)沒(méi)有應(yīng)答哨兵,此時(shí)哨兵主觀(guān)上認(rèn)為主節(jié)點(diǎn)下線(xiàn) sentinel parallel-syncs <master-name> <nums>: 表示允許并行同步的slave個(gè)數(shù),當(dāng)Master掛了后,哨兵會(huì)選出新的Master,此時(shí),剩余的slave會(huì)向新的master發(fā)起同步數(shù)據(jù) sentinel failover-timeout <master-name> <milliseconds>: 故障轉(zhuǎn)移的超時(shí)時(shí)間,進(jìn)行故障轉(zhuǎn)移時(shí),如果超過(guò)設(shè)置的毫秒,表示故障轉(zhuǎn)移失敗 sentinel notification-script <master-name> <script-path> : 配置當(dāng)某一事件發(fā)生時(shí)所需要執(zhí)行的腳本 sentinel client-reconfig-script <master-name> <script-path>: 客戶(hù)端重新配置主節(jié)點(diǎn)參數(shù)腳本
2. 啟動(dòng)哨兵
![]()
查看sentinel.log,哨兵啟動(dòng)成功

3. 將主機(jī)shutdown模擬主機(jī)故障

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

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

4. 重新啟動(dòng)原來(lái)的主機(jī),可以看到原主機(jī)從master變?yōu)閟lave,新的master并不會(huì)改變

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

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

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

