redis集群與哨兵選舉原理


redis集群與哨兵選舉原理

Redis集群
  1. redis Cluster將所有數據分為16384個槽位,每個節點負責一部分,當客戶端要查找某個key時,根據本地槽位分配信息進行定位
槽位定位算法

Cluster會對key進行crc16算法得到一個整數值,再對這個整數值進行16384取模得到具體槽位

跳轉重定向

當客戶端向一個錯誤的節點發出來指令,該節點會發現key所在槽位並不歸自己管理,會向客戶端發送一個特殊的跳轉指令攜帶目標操作節點地址,客戶端收到指令后會跳轉到正確的節點上操作

網絡抖動

正式的生產環境中,網絡會經常出現問題,Redis Cluster提供了一個cluster-node-timeout,當某個節點持續timeout時間失聯才會認定該節點掛了,進行主從切換,如果不配置該選項網絡抖動會導致頻繁的主從切換

Redis集群選舉原理
  1. 當slave發現自己的master掛了
  2. 將自己記錄的currentEpoch加1,並向其他節點請求投票給自己成為master
  3. 其他節點收到請求,只有master會回應,判斷請求的合法性,並投票,可能會有多個slave請求,每個master只能投一票
  4. slave收集master的投票
  5. 當slave收到的投票超過半數后就可以成為master
  6. 廣播消息通知其他節點
    • 當slave發現自己的master掛了並不會立即進行請求投票,會有一定的延時,確保其他的master也意識到當前的master掛了,否則master可能會拒絕投票
    • 延時計算公式Delay=500ms+random(0-500)ms+Slave_rank* 100ms(slave_rank為復制數據的等級,等級越小表示復制數據越多也是為了保證能讓擁有最新數據的slave最先發起選舉)
集群是否完整才能對外提供服務

當一個集群節點全都掛了的時候,整個redis是否還能使用,在redis.conf中配置cluster-required-full-converage為no,即使節點掛了集群仍然能提供服務

集群為什么至少三個節點而且推薦節點數為奇數
  1. 因為選舉需要收到大於master節點總數的一半,若只有兩個master節點,其中一個掛了,是選舉不出來新的master的
  2. 奇數個master節點是為了滿足上述要求並且節省資源,三個master節點與四個master節點,當大家都掛了一個master的時候,都能進行選舉,當掛了兩個的是否都選舉不了
哨兵leader選舉流程
  1. sentinel會以每秒一次的頻率向主從和其他sentienl發送ping命令,當超過設置的down-after-milliseconds后未收到的有效的響應會認為該master主觀下線,接着向其他sentiel進行確認,接收到足夠數量的后,sentinel會判定該服務器客觀下線
  2. 該sentinel會想其他sentinel發送請求其他sentinel視自己為leader,每個sentinel每次選舉會自增配置紀元,每個sentinel只能選擇一次,當收到半數以上的票,sentinel會進行slave的選舉
  3. slave的選舉.進行不健康的slave排除(主觀下線的,大於5秒未回應的,與master節點失聯的),對健康節點進行排序(設置的優先級,若相同進行下一步,選擇偏移量大的從節點)
  4. 選舉出的slave會執行slaveof no one成為主節點,向其他slave發送命令其成為新的master的slave,監視舊的master恢復后成為新的master的slave並進行同步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM