redis cluster 擴容

rockyzhang發表於2019-01-19

需求:

A redis cluster 叢集 40 臺叢集擴容到 68 臺
也就是 增加 28 臺新的機器 : 一主一從 為一組,一共12組

前期準備

   掃描新增擴容伺服器ip是否能訪問
   DBA擴容指令碼模擬驗證
   準備系統驗證指令碼:
       1: netstat -an | grep `:6379`| grep -e add-node1-ip  檢查埠連線
                       netstat -an| grep :6379|awk `{print substr($5,8)}`|sort |uniq -c
       2: 比較遷移前後平均沒臺機器的記憶體容量         
curl `http://localhost:8080/systemapp/redis/info.htm?ip=add-node1-ip&port=6379` | grep maxmemory_human --col=always | grep used_memory_human --col=always | grep total_system_memory_human --col   
       3:檢視各系統業務是否異常,是否右redis相關報錯日誌



Redis Cluster叢集動態擴容是指在不停掉Cluster叢集環境的情況下,動態的往叢集環境中增加主、從節點和動態的從叢集環境中刪除節點。

redis的動態擴容操作都是通過redis-trib.rb指令碼檔案來完成

 [root@linux redis] # ruby redis-trib.rb
      可以看到redis-trib.rb具有以下功能: 
1、create:建立叢集 
2、check:檢查叢集 
3、info:檢視叢集資訊 
4、fix:修復叢集 
5、reshard:線上遷移slot 
6、rebalance:平衡叢集節點slot數量 
7、add-node:將新節點加入叢集 
8、del-node:從叢集中刪除節點 
9、set-timeout:設定叢集節點間心跳連線的超時時間 
10、call:在叢集全部節點上執行命令 
11、import:將外部redis資料匯入叢集     

因為主、從節點在操作上會有差異,所以分來來說。增加節點的順序是先增加Master主節點,然後在增加Slave從節點。

-- 檢視redis 程式
ps -ef | grep redis

--登陸檢視主從資訊
redis-cli -h node-ip -p port
cluster nodes

動態增加Master 主伺服器節點

#前提:假設 已有6個Cluster 叢集節點,三主三從;
   1.1、建立目錄7006(Master主節點資料夾)和7007(Slave從節點資料夾),並從以前Cluster叢集節點7000-7005任一節點中拷貝配置檔案redis.conf到7006和7007目錄下。    
    1.2、修改配置檔案,將7006和7007目錄下面的redis.conf配置檔案的埠進行相應修改,與自己的目錄名稱保持一致,修改專案如下:
    (在linux環境下可以執行如下命令進行全域性替換::%s/7000/7006/g,%s/7000/7007/g,儲存並退出則可)
    1.3、啟動7006和7007目錄下Redis例項,並檢視效果。
                redis-server ../redis-cluster/7006/redis.conf
                redis-server ../redis-cluster/7007/redis.conf
   ###連個例項雖然存在,但是沒有真正的加入到叢集中!!!

登陸7006 7007 埠的例項 檢視info資訊 發現 connected_slaves = 0
redis-cli -C -H 192.168.127.130 -p 7006
info replication

將7006主節點加入到Cluster叢集

    ruby redis-trib.rb add-node add-node1:7006 old-node:7000 

ruby redis-trib.rb add-node (增加節點)
add-node1:7006 (新增例項和埠 )
old-node:7000 (叢集中已經存在的任意例項地址和其埠 )

注意:當新增新節點成功以後,新的節點不會有任何資料,因為他沒有分配任何的資料Slot(雜湊slots),這一步需要手動操作。

Send CLUSTER MEET to node add-node1:7006 to make it join the cluster. 
New node added corrently 

表示:節點增加成功

cluster info 驗證

cluster nodes 驗證: 新增成功但是會沒有Slots

為7006Master主節點分配資料Slots,分配方法是從叢集中知道任何一個主節點
(因為只有Master主節點才有資料slots),然後對其進行重新分片工作。

ruby redis-trib.rb reshard old-node:7000
我們會從7000這個主節點上抽取一些slots 給7006 
How many slots do you want to move (from 1 to 16384)?  200
我們要使用多少slots    
 選擇接收資料槽的節點和資料槽產生的方式:
 what is the receiving node id ? 接受slots的主節點 這裡是7006的ID
 Please enter all the source node IDs: all  

執行分配計劃後選擇yes ,檢視cluster nodes,顯示7006有資料slots

動態增加Slave從伺服器節點
ruby redis-trib.rb add-node 192.168.127.130:7007 192.168.127.130:7000
指定7007節點作為7006的從節點,實現主從的配置。

redis-cli -c -h 192.168.127.130 -p 7007 
   cluster replicate 71ecd970838e9b400a2a6a15cd30a94ab96203bf
                                    (主節點的ID,這裡是7006)



Cluster 叢集刪除操作

刪除的順序是先刪除Slave從節點,然後在刪除Master主節點

1.動態刪除Slave從伺服器節點
ruby redis-trib.rb del-node 192.168.127.130:7007 991ed242102aaa08873eb9404a18e0618a4e37bd
 2.動態刪除Master主伺服器節點   
要想刪除Master主節點,可能要繁瑣一些。
因為在Master主節點上有資料槽(slots),為了保證資料的不丟失,
必須把這些資料槽遷移到其他Master主節點上,然後在刪除主節點。
2.1、重新分片,把要刪除的Master主節點的資料槽移動到其他Master主節點上,以免資料丟失。
    ruby redis-trib.rb reshard 192.168.127.130:7006
    2.1.1、移除多少槽如圖:建立輸入200,這裡要輸入199,因為計數是從0開始的,切記。
    2.1.2、接受槽的Master主節點ID:這個節點可以是任意一個主節點都可以,
    我選擇7002,ID是:3b025b3ecfa65f462de639c7a412be443cf1dd1c
    Source node 選擇 需要移除節點7006的ID號 
    2.1.4、執行分割槽計劃,選擇yes。分割槽完成
    2.1.5、當前7006主節點已經沒有資料槽了。
    2.2、刪除7006主節點,提供要刪除節點的IP地址和Port埠,當然還有要刪除的節點的ID名稱。
     ruby redis-trib.rb del-node 192.168.127.130:7006 71ecd970838e9b400a2a6a15cd30a94ab96203bf
  2.2.1、刪除成功 
  2.2.2、檢視節點效果 cluster nodes
  

_

總結:

主從複製和哨兵模式這兩個叢集模式由於不能動態擴容,而且主節點之間(有多個主節點的情況)資料完全一樣,導致了主節點的容量成了整個叢集的瓶頸,如果想擴充套件叢集容量,必須擴充套件主節點的容量。由於以上的問題,redis在3.0開始Cluster叢集模式,這個模式在主節點之間資料是不一樣的,資料也可以根據需求自動轉向其他節點。這樣就可以實現橫向動態擴容,新增加的主從節點,用於儲存新的資料則可,對以前的節點的資料不會有任何影響。
參考:https://www.cnblogs.com/Patri…

相關文章