5.10. 高可用性與主備切換原理
redis cluster的高可用的原理,跟redis replication sentinel類似,過程如下:
1、判斷節點宕機
如果一個節點認爲另外一個節點宕機,那麼就是pfail,主觀宕機。如果多個節點都認爲另外一個節點宕機了,那麼就是fail,客觀宕機,跟哨兵的原理幾乎一樣,pfail對應sdown,fail對應odown 。
在cluster-node-timeout內,某個節點一直沒有返回pong,那麼就被認爲pfail,如果一個節點認爲某個節點pfail了,那麼會在gossip ping消息中,ping給其他節點,如果超過半數的節點都認爲pfail了,那麼就會變成fail。
2、從節點過濾
對宕機的master node,在其所有的slave node中,選擇一個切換成master node,檢查每個slave node與master node斷開連接的時間,如果超過了cluster-node-timeout * cluster-slave-validity-factor,那麼就沒有資格切換成master,這個也是跟哨兵是一樣的,從節點超時過濾的步驟。
3、從節點選舉
對slave進行排序,排序方法如下:
- slave priority:選擇優先級
slave-priority
最大的從節點作爲主節點,如不存在則繼續。 按照slave優先級進行排序,slave priority越低,優先級就越高。- replica offset:選擇複製偏移量(數據寫入量的字節,記錄寫了多少數據。主服務器會把偏移量同步給從服務器,當主從的偏移量一致,則數據是完全同步)最大的從節點作爲主節點,如不存在則繼續。如果slave priority相同,那麼看replica offset,哪個slave複製了越多的數據,offset越靠後,優先級就越高。
- run id:如果上面兩個條件都相同,那麼選擇一個run id比較小的那個slave。(redis每次啓動的時候生成隨機的
runid
作爲redis的標識)
所有的master node開始slave選舉投票,給要進行選舉的slave進行投票,如果大部分master node(N/2 + 1)都投票給了某個從節點,那麼選舉通過,那個從節點可以切換成master。從節點執行主備切換,成爲主節點。