redis健康檢查與故障轉移

lonecloud發表於2018-06-03

哨兵三個定時監控任務

  1. 每隔10s每隔sentinel節點會向主節點和從節點傳送info命令獲取最新的拓撲結構
  2. 每隔2S,每個sentinel節點會向redis資料節點的__sentiel__:hellp傳送sentinel節點資訊,用於瞭解新節點相關資訊,如果是新節點則將其儲存下來。並與其建立連線。
  3. 每隔1S,每隔sentinel節點會向主節點和從節點其餘的sentinel節點傳送平命令作為心跳監測,來確定這些節點是否可達。

總結

  1. 每隔10s傳送獲取拓撲心跳
  2. 每隔2S獲取新節點資料
  3. 每隔1S監測節點和哨兵通訊正常

下線規則

  1. 主觀下線:涉及down-after-millseconds引數,如果某一個哨兵與某一個redis節點在這個引數時間中沒有連線成功,則說明有問題,則下線
  2. 客觀下線:如果通過主觀下線的是主節點的時候,由於涉及到後面的leader選舉,則需要進行客觀判斷,,通過引數is-master-down-by-addr向所有的哨兵節點詢問,如果大部分都認為該節點有問題,則進行下線操作。

sentinel選舉

Raft

  1. 傳送 is-master-down-by-addr進行要求將自己設定為leader.
  2. 收到命令的sentinel會判斷,如果其沒有同意過其他的sentinel節點的命令則同意,否則拒絕
  3. 如果該sentinel發現自己的票數大於等於max(quorum,num(sentinels)/2);則將成為領導者
  4. 將進入下一次選舉

總結 選舉的過程非常快,基本上誰先完成客觀下線,則誰就是領導者

故障轉移

當sentinel選舉完成後,需要對資料進行同步,則會出現選舉redis主節點

  1. 過濾(主觀下線,斷線)的節點
  2. 選擇slave-priority優先順序搞的節點列表,如果存在則返回,不存在則繼續
  3. 選擇複製偏移量最大的從節點,如果存在則返回,不存在則繼續
  4. 選擇runid最小的從節點

總結 過濾無用節點->選擇優先順序高->選擇偏移量大->選擇runid最小

相關文章