Redis集群選舉原理:
當slave發現自己的master掛了
將自己記錄的currentEpoch加1,並向其他節點請求投票給自己成為master
其他節點收到請求,只有master會回應,判斷請求的合法性,並投票,可能會有多個slave請求,每個master只能投一票
slave收集master的投票
當slave收到的投票超過半數后就可以成為master
廣播消息通知其他節點
當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,即使節點掛了集群仍然能提供服務
集群為什么至少三個節點而且推薦節點數為奇數?
因為選舉需要收到大於master節點總數的一半,若只有兩個master節點,其中一個掛了,是選舉不出來新的master的
奇數個master節點是為了滿足上述要求並且節省資源,三個master節點與四個master節點,當大家都掛了一個master的時候,都能進行選舉,當掛了兩個的是否都選舉不了
哨兵leader選舉流程:
sentinel會以每秒一次的頻率向主從和其他sentienl發送ping命令,當超過設置的down-after-milliseconds后未收到的有效的響應會認為該master主觀下線,接着向其他sentiel進行確認,接收到足夠數量的后,sentinel會判定該服務器客觀下線
該sentinel會想其他sentinel發送請求其他sentinel視自己為leader,每個sentinel每次選舉會自增配置紀元,每個sentinel只能選擇一次,當收到半數以上的票,sentinel會進行slave的選舉
slave的選舉.進行不健康的slave排除(主觀下線的,大於5秒未回應的,與master節點失聯的),對健康節點進行排序(設置的優先級,若相同進行下一步,選擇偏移量大的從節點)
選舉出的slave會執行slaveof no one成為主節點,向其他slave發送命令其成為新的master的slave,監視舊的master恢復后成為新的master的slave並進行同步