詳解redis集群選舉機制
概要
當redis集群的主節(jié)點故障時,Sentinel集群將從剩余的從節(jié)點中選舉一個新的主節(jié)點,有以下步驟:
- 故障節(jié)點主觀下線
- 故障節(jié)點客觀下線
- Sentinel集群選舉Leader
- Sentinel Leader決定新主節(jié)點
選舉過程
1、主觀下線
Sentinel集群的每一個Sentinel節(jié)點會定時對redis集群的所有節(jié)點發(fā)心跳包檢測節(jié)點是否正常。如果一個節(jié)點在down-after-milliseconds
時間內(nèi)沒有回復Sentinel節(jié)點的心跳包,則該redis節(jié)點被該Sentinel節(jié)點主觀下線。
2、客觀下線
當節(jié)點被一個Sentinel節(jié)點記為主觀下線時,并不意味著該節(jié)點肯定故障了,還需要Sentinel集群的其他Sentinel節(jié)點共同判斷為主觀下線才行。
該Sentinel節(jié)點會詢問其他Sentinel節(jié)點,如果Sentinel集群中超過quorum
數(shù)量的Sentinel節(jié)點認為該redis節(jié)點主觀下線,則該redis客觀下線。
如果客觀下線的redis節(jié)點是從節(jié)點或者是Sentinel節(jié)點,則操作到此為止,沒有后續(xù)的操作了;如果客觀下線的redis節(jié)點為主節(jié)點,則開始故障轉(zhuǎn)移,從從節(jié)點中選舉一個節(jié)點升級為主節(jié)點。
3、Sentinel集群選舉Leader
如果需要從redis集群選舉一個節(jié)點為主節(jié)點,首先需要從Sentinel集群中選舉一個Sentinel節(jié)點作為Leader。
每一個Sentinel節(jié)點都可以成為Leader,當一個Sentinel節(jié)點確認redis集群的主節(jié)點主觀下線后,會請求其他Sentinel節(jié)點要求將自己選舉為Leader。被請求的Sentinel節(jié)點如果沒有同意過其他Sentinel節(jié)點的選舉請求,則同意該請求(選舉票數(shù)+1),否則不同意。
如果一個Sentinel節(jié)點獲得的選舉票數(shù)達到Leader最低票數(shù)(quorum
和Sentinel節(jié)點數(shù)/2+1
的最大值),則該Sentinel節(jié)點選舉為Leader;否則重新進行選舉。
4、Sentinel Leader決定新主節(jié)點
當Sentinel集群選舉出Sentinel Leader后,由Sentinel Leader從redis從節(jié)點中選擇一個redis節(jié)點作為主節(jié)點:
- 過濾故障的節(jié)點
- 選擇優(yōu)先級
slave-priority
最大的從節(jié)點作為主節(jié)點,如不存在則繼續(xù) - 選擇復制偏移量(數(shù)據(jù)寫入量的字節(jié),記錄寫了多少數(shù)據(jù)。主服務器會把偏移量同步給從服務器,當主從的偏移量一致,則數(shù)據(jù)是完全同步)最大的從節(jié)點作為主節(jié)點,如不存在則繼續(xù)
- 選擇
runid
(redis每次啟動的時候生成隨機的runid
作為redis的標識)最小的從節(jié)點作為主節(jié)點
為什么Sentinel集群至少3節(jié)點
一個Sentinel節(jié)選舉成為Leader的最低票數(shù)為quorum
和Sentinel節(jié)點數(shù)/2+1
的最大值,如果Sentinel集群只有2個Sentinel節(jié)點,則
Sentinel節(jié)點數(shù)/2 + 1 = 2/2 + 1 = 2
即Leader最低票數(shù)至少為2,當該Sentinel集群中由一個Sentinel節(jié)點故障后,僅剩的一個Sentinel節(jié)點是永遠無法成為Leader。
也可以由此公式可以推導出,Sentinel集群允許1個Sentinel節(jié)點故障則需要3個節(jié)點的集群;允許2個節(jié)點故障則需要5個節(jié)點集群。
到此這篇關(guān)于詳解redis集群選舉機制的文章就介紹到這了,更多相關(guān)redis集群選舉機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis連接池監(jiān)控(連接池是否已滿)與優(yōu)化方法
本文詳細講解了如何在Linux系統(tǒng)中監(jiān)控Redis連接池的使用情況,以及如何通過連接池參數(shù)配置、系統(tǒng)資源使用情況、Redis命令監(jiān)控、外部監(jiān)控工具等多種方法進行檢測和優(yōu)化,以確保系統(tǒng)在高并發(fā)場景下的性能和穩(wěn)定性,討論了連接池的概念、工作原理、參數(shù)配置,以及優(yōu)化策略等內(nèi)容2024-09-09詳解Redis中的簡單動態(tài)字符串和C字符串的區(qū)別
簡單動態(tài)字符串(SDS)和?C?字符串在實現(xiàn)和特性上存在一些區(qū)別,這些區(qū)別使得?SDS?更適合作為?Redis?中字符串對象的內(nèi)部表示,本文給大家介紹一下Redis中的簡單動態(tài)字符串和C字符串的區(qū)別,需要的朋友可以參考下2023-12-12記錄一次并發(fā)情況下的redis導致服務假死的問題解決
由于Redis需要依賴于操作系統(tǒng)環(huán)境,如果系統(tǒng)資源受限,比如過量的進程在擠占系統(tǒng)資源、系統(tǒng)死鎖等情況,本文主要介紹了記錄一次并發(fā)情況下的redis導致服務假死的問題解決,感興趣的可以了解一下2023-09-09redis.conf中使用requirepass不生效的原因及解決方法
本文主要介紹了如何啟用requirepass,以及啟用requirepass為什么不會生效,從代碼層面分析了不生效的原因,以及解決方法,需要的朋友可以參考下2023-07-07