文章目錄
- 一、什么是redis高可用架構?
- 二、如何實作redis主備切換的高可用性?
- 1.哨兵的作用
- 2.哨兵的核心知識
- 3.為什么redis哨兵集群只有兩個節點無法正常作業?
- 三、redis哨兵主備切換的資料丟失問題:異步復制、集群腦裂
- 1.異步復制
- 2.集群腦裂問題
- 3.如何解決異步復制和腦裂導致的資料丟失?
- 四、redis哨兵的多個核心底層原理的深入決議(包含slave選舉演算法)
- 1.sdown和odown轉換機制
- 2.哨兵集群的自動發現機制
- 3.slave到master的選舉演算法
- 總結 怎么保證redis是高并發以及高可用的?
- 1.實作redis的高并發
- 2.實作redis的高可用
一、什么是redis高可用架構?
redis高可用架構也叫做故障轉移,或主備切換,
二、如何實作redis主備切換的高可用性?
通過哨兵 (sentinel)
哨兵是redis集群中的重要組件
1.哨兵的作用
集群監控:負責監控redis master和slave行程是否正常作業
訊息通知:如果某個redis實體有故障,那么哨兵負責發送訊息作為報警通知給管理員
故障轉移:如果master node掛掉了,會自動轉移到slave node上
2.哨兵的核心知識
1)哨兵至少需要3個實體,來保證自己的健壯性
2)哨兵+redis主從的這種架構不能保證資料的零丟失,只能保證redis集群的高可用
3.為什么redis哨兵集群只有兩個節點無法正常作業?
這里有兩個概念:quorum和marority;
quorum 也就是認為機器故障的個數,比如有5臺機器,quorum設定為3 那就是 如果有3個節點認為master宕機了,sentinal集群就會認為master宕機了,
majoritory 代表允許故障轉移的機器個數 例如2的majority=2,3的majority=2,4的majority=2,5的majority=3
而對于兩個節點的redis集群來說,他們的quorum可以設定為1,也就是s1和s2中只要有一個節點認為master宕機了就可以進行故障轉移,但是此時的majority是2,也就是至少要有2個系節點才允許故障轉移,這時候因為只有一個s1節點,就無法進行故障轉移 ,
正確的哨兵模式:3節點哨兵集群

經典的3節點哨兵集群,我們配置quorum = 2,3個節點的majority也是2,如果M1所在的機器宕機了,那么三個哨兵還剩下2個,S2和S3可以一致認為mater宕機,然后選舉一個來執行故障轉移
同時majority也是2,這個2個哨兵可以允許執行故障轉移的,
三、redis哨兵主備切換的資料丟失問題:異步復制、集群腦裂
1.異步復制
異步復制導致的資料丟失問題 即master node掛掉后,slave node 就成了master node,那些記憶體中還沒來得及的復制的資料就丟失了
2.集群腦裂問題
即master主節點,出現了例外性的,有相同資料,相同作業的,兩個節點, 腦裂時雖然某個slave被切換成了master,但是client還沒來得及切換到新的master,此時如果恢復,舊的master會被作為一個slave掛載到新的master上去,自己的資料就會被清空,重新從新的mater復制資料,導致資料丟失
3.如何解決異步復制和腦裂導致的資料丟失?
通過兩個配置: min-slave-to-write 1 ; min-slave-max-lag 10
即要求至少要有一個slave,資料復制和同步的延遲不能超過10s,如果說一旦所有的slave,資料復制和同步的延遲都超過了10s,那么這個時候,master就不會接收任何請求了
四、redis哨兵的多個核心底層原理的深入決議(包含slave選舉演算法)
1.sdown和odown轉換機制
sdown是主觀宕機
達成sdown的條件:如果一個哨兵ping一個master,超過了is-down-after-millisecond指定的毫秒數,就主觀認為master宕機了
odown是客觀宕機
sdown到odown的轉換條件:如果一個哨兵在指定的時間內,收到了quorum指定數量的其他哨兵也認為那個master是sdown了,那么就認為是odown了,客觀認為master宕機
2.哨兵集群的自動發現機制
哨兵之間的互相發現是通過redis的pub/sub機制實作,每個哨兵都會往_sentinal_:hello 這個channel發送訊息并監聽這個channel,這個時候所有其他哨兵都可以消費到這個訊息,并感知到其他哨兵的存在,
哨兵之間會交換對master的監控配置,互相進行監控配置的同步
3.slave到master的選舉演算法
如果一個master被認為是odown了,同時majority哨兵也允許了主備切換,那么某個哨兵就會執行主備切換操作,而選舉會考慮slave的一些資訊,
1)跟master斷開連接的時長 【如果時長過長也會被認為不適合被選舉成master】
2)slave的優先級 (slave priority越低,優先級就越高)
3)復制offset (哪個slave復制了越多的資料,offset就越靠后,優先級就越高)
4)run id
總結 怎么保證redis是高并發以及高可用的?
1.實作redis的高并發
主從架構,一主多從,單主用來寫入資料單機幾萬的QPS,多從用來查詢資料,多個從實體可以提供每秒10萬的QPS,
如果redis實作高并發的同時,還需要容納大量的資料,如果你的快取要容納的資料量很大,達到了幾十g,或者幾百g,那就要redis集群,而且用redis集群之后,可以提供每秒幾十萬的讀寫并發
2.實作redis的高可用
如果是主從架構部署,其實就是加上哨兵就可以實作任何一個實體宕機,自動進行主備切換
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261049.html
標籤:其他
上一篇:Python web全堆疊開發_Django_billshop 商城專案_pipeline操作Redis資料庫、生產者消費者設計模式、celery 介紹、安裝和處理
