文章目錄
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)