概要
當(dāng)redis集群的主節(jié)點(diǎn)故障時(shí),Sentinel集群將從剩余的從節(jié)點(diǎn)中選舉一個(gè)新的主節(jié)點(diǎn),有以下步驟:
- 故障節(jié)點(diǎn)主觀下線
- 故障節(jié)點(diǎn)客觀下線
- Sentinel集群選舉Leader
- Sentinel Leader決定新主節(jié)點(diǎn)
選舉過程
1、主觀下線
Sentinel集群的每一個(gè)Sentinel節(jié)點(diǎn)會(huì)定時(shí)對(duì)redis集群的所有節(jié)點(diǎn)發(fā)心跳包檢測(cè)節(jié)點(diǎn)是否正常。如果一個(gè)節(jié)點(diǎn)在down-after-milliseconds
時(shí)間內(nèi)沒有回復(fù)Sentinel節(jié)點(diǎn)的心跳包,則該redis節(jié)點(diǎn)被該Sentinel節(jié)點(diǎn)主觀下線。
2、客觀下線
當(dāng)節(jié)點(diǎn)被一個(gè)Sentinel節(jié)點(diǎn)記為主觀下線時(shí),并不意味著該節(jié)點(diǎn)肯定故障了,還需要Sentinel集群的其他Sentinel節(jié)點(diǎn)共同判斷為主觀下線才行。
該Sentinel節(jié)點(diǎn)會(huì)詢問其他Sentinel節(jié)點(diǎn),如果Sentinel集群中超過quorum
數(shù)量的Sentinel節(jié)點(diǎn)認(rèn)為該redis節(jié)點(diǎn)主觀下線,則該redis客觀下線。
如果客觀下線的redis節(jié)點(diǎn)是從節(jié)點(diǎn)或者是Sentinel節(jié)點(diǎn),則操作到此為止,沒有后續(xù)的操作了;如果客觀下線的redis節(jié)點(diǎn)為主節(jié)點(diǎn),則開始故障轉(zhuǎn)移,從從節(jié)點(diǎn)中選舉一個(gè)節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)。
3、Sentinel集群選舉Leader
如果需要從redis集群選舉一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),首先需要從Sentinel集群中選舉一個(gè)Sentinel節(jié)點(diǎn)作為L(zhǎng)eader。
每一個(gè)Sentinel節(jié)點(diǎn)都可以成為L(zhǎng)eader,當(dāng)一個(gè)Sentinel節(jié)點(diǎn)確認(rèn)redis集群的主節(jié)點(diǎn)主觀下線后,會(huì)請(qǐng)求其他Sentinel節(jié)點(diǎn)要求將自己選舉為L(zhǎng)eader。被請(qǐng)求的Sentinel節(jié)點(diǎn)如果沒有同意過其他Sentinel節(jié)點(diǎn)的選舉請(qǐng)求,則同意該請(qǐng)求(選舉票數(shù)+1),否則不同意。
如果一個(gè)Sentinel節(jié)點(diǎn)獲得的選舉票數(shù)達(dá)到Leader最低票數(shù)(quorum
和Sentinel節(jié)點(diǎn)數(shù)/2+1
的最大值),則該Sentinel節(jié)點(diǎn)選舉為L(zhǎng)eader;否則重新進(jìn)行選舉。
4、Sentinel Leader決定新主節(jié)點(diǎn)
當(dāng)Sentinel集群選舉出Sentinel Leader后,由Sentinel Leader從redis從節(jié)點(diǎn)中選擇一個(gè)redis節(jié)點(diǎn)作為主節(jié)點(diǎn):
- 過濾故障的節(jié)點(diǎn)
- 選擇優(yōu)先級(jí)
slave-priority
最大的從節(jié)點(diǎn)作為主節(jié)點(diǎn),如不存在則繼續(xù)
- 選擇復(fù)制偏移量(數(shù)據(jù)寫入量的字節(jié),記錄寫了多少數(shù)據(jù)。主服務(wù)器會(huì)把偏移量同步給從服務(wù)器,當(dāng)主從的偏移量一致,則數(shù)據(jù)是完全同步)最大的從節(jié)點(diǎn)作為主節(jié)點(diǎn),如不存在則繼續(xù)
- 選擇
runid
(redis每次啟動(dòng)的時(shí)候生成隨機(jī)的runid
作為redis的標(biāo)識(shí))最小的從節(jié)點(diǎn)作為主節(jié)點(diǎn)
為什么Sentinel集群至少3節(jié)點(diǎn)
一個(gè)Sentinel節(jié)選舉成為L(zhǎng)eader的最低票數(shù)為quorum
和Sentinel節(jié)點(diǎn)數(shù)/2+1
的最大值,如果Sentinel集群只有2個(gè)Sentinel節(jié)點(diǎn),則
Sentinel節(jié)點(diǎn)數(shù)/2 + 1
= 2/2 + 1
= 2
即Leader最低票數(shù)至少為2,當(dāng)該Sentinel集群中由一個(gè)Sentinel節(jié)點(diǎn)故障后,僅剩的一個(gè)Sentinel節(jié)點(diǎn)是永遠(yuǎn)無法成為L(zhǎng)eader。
也可以由此公式可以推導(dǎo)出,Sentinel集群允許1個(gè)Sentinel節(jié)點(diǎn)故障則需要3個(gè)節(jié)點(diǎn)的集群;允許2個(gè)節(jié)點(diǎn)故障則需要5個(gè)節(jié)點(diǎn)集群。
到此這篇關(guān)于詳解redis集群選舉機(jī)制的文章就介紹到這了,更多相關(guān)redis集群選舉機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 詳細(xì)分析Redis集群故障
- Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼
- Redis集群搭建全記錄
- Windows環(huán)境部署Redis集群
- redis集群搭建教程及遇到的問題處理
- Redis cluster集群的介紹
- Redis集群與SSM整合使用方法