redis之(十八)redis的支持水平擴容的集群特性,以及插槽的相關操作


[一]主從集群的缺點,客戶端分片的缺點
(1)主從+哨兵的redis集群,只是做主從備份,數據冗余的一種處理。但在存儲空間的擴展上還是有限制。因為集群中的節點都是存儲同樣的數據。單一節點的容量,就可以決定整個集群存儲數據的容量。木桶效應。
(2)客戶端規划的分片(就是將不同的鍵存儲在不同的節點上),包括客戶端預分片技術,解決了存儲容量的不受單台最小存儲節點的限制,但在集群節點新加入和節點下線上,就會造成數據的命中率不高,需要人工手動重新規划,數據轉移。
 
 
[二]redis3.0版本支持集群(包括存儲容量水平擴展,新節點加入或下線的問題解決。)
(1)redis的Cluster,擁有和單機實例同樣的性能
(2)在網絡分區后能夠提供一定的可訪問性以及對主數據庫故障恢復的支持
(3)例外集群幾乎支持所有的單機實例支持的命令,對於涉及多鍵的命令(mget),如果每個鍵都位於同一個節點,則可以正常支持,否則報錯。
(4)除此之外集群還有一個限制,是只能使用默認的0號數據庫,如果使用select命令切換數據庫,就會提示錯誤。
 
 
[三]使用3.0的redis的原因
(1)很好支持分片和存儲容量的擴容
(2)哨兵和集群是兩個獨立的功能,單從特性上來看哨兵可以視為集群的子集,當不需要數據分片,或者已經在客戶端進行分片的場景下,哨兵使用就足夠了,單如果需要進行水平(存儲容量擴容和數據分片)擴容,則集群是一個非常好的選擇。
 
 
[四]redis3.0以上cluster集群的節點的增加
(1)redis-trib.rb是使用CLUSTER MEET命令來使每個節點認識集群中的其他節點的,可想而知如果想要向集群中加入新節點,也需要使用CLUSTER MEET命令實現。
(2)使用命令:CLUSTER MEET ip port
  --->集群中加入新節點A。
  --->向新節點發送:“CLUSTER MEET ip port”命令,ip和port是集群中任意一個節點的地址和端口號,A接收到客戶端發來的命令后,會與該地址和端口號的節點B進行握手,使B將A認作當前集群中的一員。當B與A握手成功后,B會使用Gossip協議將節點A的信息通知給集群中的每一個節點。通過這一方式,即使集群中有多個節點,也只需要選擇MEET其中任意一個節點,即可使新節點最終加入整個集群。  
 
[五]什么是插槽?
(1)插槽的計算,將每個鍵的鍵名的有效部分使用CRC16算法計算出散列值,然后對16384取余數。這樣使得每個鍵都可以分配到16384個插槽中
(2)鍵名的有效部分:
  --->如果鍵名包含{符號,且在{符號后面存在}符號。並且{和}之間有至少一個字符,則有效部分是指{和}之間的內容
  --->如果不滿足上一條規則,那么整個鍵名是有效部分。
比如:{user102}:last.name的鍵名有效部分是:user102      shangxiaofei鍵名的有效部分是:shangxiaofei
 
 
[五]如何將插槽分配給指定的節點。插槽的分配分為如下幾種情況。
(1)插槽之前沒有被分配過,現在想分配給指定節點。鏈接上指定節點的服務器,輸入分配插槽的命令。
  --->命令:CLUSTER ADDSLOTS  slot1 slot2.... [slotn]
  --->redis-trib.rb也是通過該命令在創建集群時為新節點分配操作的。如果插槽已經被分配給某個節點,則會提示(error) err solts 100 is already busy
(2)插槽之前被分配過,現在想移動到指定的節點。
  --->利用命令查看插槽的分配情況.CLUSTER SLOTS。
  ==>查看插槽的分配情況
  
  ==>利用redis-trib.rb進行插槽移動
 
  ==>查看插槽的移動結果
 
 
 
  (3)手動再將0號插槽從6380節點移動回6379節點
  --->插槽中沒有任何鍵的移動命令:CLUSTRE SETSLOT 插槽號 NODE 新節點的運行id.
  --->該命令的遷移的前提是插槽中沒有任何鍵,因為CLUSTER SETSLOT命令遷移插槽時並不會連同相應的鍵一起遷移。這就造成了客戶端在指定節點無法找到未遷移的鍵,
 
 
  (4)將有鍵存在的插槽,從一個節點,移動到另一個節點,並將插槽中的鍵一並移動過去
  --->手工獲取某個插槽存在那些鍵:CLUSTER GETKEYSINSLOT 插槽號 要返回的鍵的數量
  --->之后對每個鍵,使用MIGRATE命令將其遷移到目標節點:MIGRATE 目標節點的地址 目標節點端口 鍵名 數據庫號碼 超時時間 [COPY][REPLACE]
  --->其中COPY選項,不將鍵從當前數據庫刪除,只是復制一份副本發往目標數據庫。
  --->其中REPLACE選項,如果目標存在同名鍵,則覆蓋
 
三:如果實現redis不下線的情況遷移數據
(1)兩條命令
--->CLUSTER SETSLOT 插槽號 MIGRATING 新節點的運行id
--->CLUSTER SETSLOT 插槽號 IMPORTING 原節點的運行ID
(2)假設把0號插槽從A遷移到B
--->在B執行:CLUSTER SETSLOT 0   IMPORTING A
--->在A執行:CLUSTER SETSLOT 0 MIGRATING B
--->執行CLUSTER GETKEYSINSLOT 0 獲取零號插槽的鍵列表
--->對第三步獲取的每個鍵執行MIGRATE命令,將其從A遷移到B
--->執行CLUSTRE SETSLOT 0 NODE B來完成遷移。
&&:注意:在遷移過程中,如果訪問A節點,如果鍵尚未遷移,則正常處理,如果已經完成遷移,則返回一個ask跳轉請求,告訴客戶端這個鍵在B。避免鍵在遷移過程中出現臨時丟失的現象。
 
四:獲取與插槽對應的節點。
五:故障恢復
(1)在一個集群中每個節點都會定期向其他節點發送ping命令。並通過有沒有收到回復來判斷目標節點是否已經下線。
(2)每隔1秒隨機選擇5個節點,然后選擇其中最久沒有響應的節點發送ping命令。
(3)故障恢復和哨兵機制類似。
  --->一旦節點a認為節點b疑似下線,就會在集群中傳播該消息,所有其他節點收到消息后都會記錄該信息。
  --->當其群中某一節點c收集到半數以上的節點認為b疑似下線,就會將b標記為下線,並向集群中的其他節點傳播該消息,從而使得b在整個集群中下線。若下線節點為主節點,則從對應的從節點列表中選舉一個從節點升級成新主節點。選舉算法:和哨兵中的選舉領頭哨兵算法一致,基於raft算法。當選舉出新的主節點,則執行SLAVEOF ON ONE將自己升格為主數據庫。
  --->如果一個至少負責一個插槽的主數據庫下線,且沒有相應的從數據庫可以進行故障恢復,則整個集群默認會進入下線狀態無法工作。如果想在這種情況下,使集群仍能正常工作,可以修改配置cluster-require-full-coverage為no(默認值為yes)
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM