補漏 redis 節點及槽知識

1.currentEpoch

集羣初始時爲0,當發送其他事件時,會增1;當接收事件時,若消息的currentEpoch更大,則替換成更大的currentEpoch。

2.slave rank

主從同步,會有一個rank記錄同步信息,rank越小,表示同步的數據越新。

3.節點重新加入到集羣

如果之前的slot被分配掉了,之前的slot信息全部清空,找出之前最大的slot所在的組,與之綁定爲slave。

4.slot加入與同步

  • slot會被綁定給currentEpoch更大者。
  • 集羣中節點之間發送的ping,pong等信息中,都會攜帶slot信息。每個master節點收到了slot信息後,發現其currentEpoch比自己小且slot分配一致,則強制要求其更新節點信息。

5.Ask和Moved區別

當槽位置分配發生變化中,請求已經遷移好的key時,客戶端會收到Ask,客戶端需要向新節點(槽遷移後的節點)發送Asking,才能正確獲取數據。如果是還未遷移的數據,就是正常訪問老節點(槽原來在的節點);
當槽位置分配變化完成後,客戶端請求一個節點時,該節點並沒有對應key時,會發送Moved,告知客戶端正確的節點信息。

6.hashTag

key中使用{}時,且左邊第一個{}內含有字符時,該key將使用hashTag——只使用{}中的字符來計算slot,這樣可以人爲的固定多個key在同一個slot上面。
eg:aaa{}{ssk}不開啓hashTag,aaa{{ccc}{ssk}}只用{ccc計算slot,aaa{ccc}{ssk}只用ccc計算slot,aaa{ccc}{ssk}與aaa{ccc}將在同一個slot上。

7.Replica遷移算法

集羣中,可能存在一個master沒有任何slave,而其他master可能存在多個slave。這種不平衡的狀態被發現了,會從具有最多slave的master裏移除一個具有最小node id的slave,作爲沒有slave的master的slave。

8.slave選舉爲master

當master節點失敗時,其下的slave節點們,會爭先恐後想成爲新的master。所有的slave會先比較slave rank,具有最小的slave rank會最先嚐試選舉爲master。該slave 會向集羣中其他主節點發送 FAILOVER_AUTH_REQUEST 請求,主節點接收到該請求會遵循以下原則進行回覆或者直接不回覆。
原則:

  • slave的master必須是fail狀態。
  • slave未在2*NODE_TIMEOUT時間內發送過該請求。slave的currentEpoch必須大於等於該master的currentEpoch。(這是爲了避免延遲的slave請求)
  • 每次master收到slave的currentEpoch,都會記錄slave的currentEpoch,會與上次的slave的currentEpoch比較,如果小於上次的就直接忽略。
  • master拒絕slave成爲新master時,便不會回覆消息。(這是當master未意識到其他master fail)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章