Redis Sentinel 架構原理詳解(四)

前言

前面Redis Sentinel 架構原理詳解(三)中介紹了redis哨兵集羣中sentinel的leader如何選舉,以及redis主從中的新master如何選擇,這裏再和大家一起學習下Sentinel集羣的quorum 和majority,configuration epoch,以及Redis Sentinel可能出現的問題以及解決辦法。

Sentinel集羣的quorum和majority

quorum 是在 sentinel.conf中手動配置的,默認爲2,意味着只有大於等於quorum數量的sentinel都認爲master主觀下線,sentinel集羣纔會認爲master客觀下線。

# sentinel monitor [master-name] [master-ip] [master-port] [quorum] 
sentinel monitor mymaster 127.0.0.1 6379 2

sentinel集羣執行故障轉移時需要選舉leader,此時涉及到majority,majority 代表 sentinel 集羣中大部分 sentinel 節點的個數,只有大於等於 max(quorum, majority) 個節點給某個 sentinel 節點投票,才能確定該sentinel節點爲leader,majority 的計算方式爲:num(sentinels) / 2 + 1,比如:

2 個節點的 sentinel 集羣的 majority爲 2
3 個節點的 sentinel 集羣的 majority爲 2
4 個節點的 sentinel 集羣的 majority爲 3
5 個節點的 sentinel 集羣的 majority爲 3

所以 sentinel集羣的節點個數至少爲3個,當節點數爲2時,假如一個 sentinel 節點宕機,那麼剩餘一個節點是無法讓自己成爲 leader 的,因爲2個節點的sentinel 集羣的 majority是2,此時沒有2個節點都給剩餘的節點投票,也就無法選擇出leader,從而無法進行故障轉移。另外最好把quorum的值設置爲 <= majority,否則即使 sentinel 集羣剩餘的節點滿足majority數,但是有可能不能滿足quorum數,那還是無法選舉leader,也就不能進行故障轉移。

configuration epoch

configuration epoch 是當前redis主從架構的配置版本號,無論是sentinel集羣選舉 leader 還是進行故障轉移的時候,要求各 sentinel節點得到的 configuration epoch都是相同的,sentinel is-master-down-by-addr 命令中就必須有當前配置版本號這個參數,在選舉leader過程中,如果本次選舉失敗,那麼進行下一次選舉,就會更新配置版本號,也就是說,每次選舉都對應一個新的 configuration epoch,在故障轉移的過程中,也要求各個 sentinel 節點使用相同的 configuration epoch。在故障轉移成功之後,sentinel leader 會更新生成最新的master 配置,configuration epoch 也會更新,然後同步給其他的 sentinel 節點,這樣保證 sentinel 集羣中保存的 master、slave 配置都是最新的,當 client 請求的時候就會拿到最新的配置信息。

Redis Sentinel可能出現的問題

redis sentinel 無法保證數據完全不丟失,原因有兩個:

  • 異步複製導致的數據丟失     因爲 master -> slave 的複製是異步的,所以可能有部分數據還沒複製到 slave,master 就宕機了,此時這部分數據就丟失了。
  •  redis 服務腦裂導致的數據丟失    腦裂,也就是說,某個master所在機器突然網絡故障,跟其他 slave 機器不能連接,但是實際上master還運行着。此時哨兵可能就會認爲 master 宕機了,然後開啓選舉,將其他slave切換成了master,這個時候,集羣裏就會有兩個master,也就是所謂的腦裂。此時雖然某個 slave 被切換成了 master,但是 client 還沒來得及切換到新的master,還繼續寫向舊 master 的數據就丟失了。因爲舊 master 再次恢復的時候,會被作爲一個 slave 掛到新的 master 上去,自己的數據會清空,重新從新的 master 複製數據。

redis 提供了兩個配置參數可以儘量丟失少的數據:

min-slaves-to-write 1
min-slaves-max-lag 10

第一個參數表示 master必須至少有一個 slave在進行正常複製,否則就拒絕寫請求,此時 master 喪失可用性。何爲正常複製,何爲異常複製?這個就是由第二個參數控制的,它的單位是秒,表示如果 10s 沒有收到從節點的反饋,就意味着從節點同步不正常。這樣可以把 master 宕機期間的數據丟失降低到可控範圍內。

redis-2.6 版本提供的是 redis sentinel v1版本,但是功能性和健壯性都有一些問題,如果想使用redis sentinel的話,建議使用2.8以上版本,也就是v2版本的 redis sentinel。

總結

這裏和大家一起學習了sentinel集羣中的quorum和majority參數的具體配置意義,以及configuration epoch版本號配置。redis哨兵不能保證數據絕對不丟失,在主從異步複製過程數據沒有及時同步,或因爲網絡因素導致選舉新的master節點而產生腦裂等問題。所以在選用redis哨兵實現高可用的時候需要考慮這些問題,如何將風險降低到最小。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章