redis cluster集羣架構詳解(十六)- redis cluster常用操作-節點的新增、刪除、slot導入等常用操作

接上篇文章,以下介紹redis cluster的常用操作:set-timeout 節點間心跳超時時間、call 、import、reshard、rebalance、add-node、del-node。

5.8.7.set-timeout設置集羣節點間心跳連接的超時時間

set-timeout用來設置集羣節點間心跳連接的超時時間,單位是毫秒,不得小於100毫秒,因爲100毫秒對於心跳時間來說太短了。該命令修改是節點配置參數cluster-node-timeout,默認是15000毫秒。通過該命令,可以給每個節點設置超時時間,設置的方式使用config set命令動態設置,然後執行config rewrite命令將配置持久化保存到硬盤。以下是示例:

[root@cache01 src]# redis-cli --cluster set-timeout 192.168.75.187:7001 30000

在這裏插入圖片描述

5.8.8.call在集羣全部節點上執行命令

call命令可以用來在集羣的全部節點執行相同的命令。call命令也是需要通過集羣的一個節點地址,連上整個集羣,然後在集羣的每個節點執行該命令。

[root@cache01 src]# redis-cli --cluster call 192.168.75.187:7001 get name

運行效果如下:

在這裏插入圖片描述

5.8.9.import將外部redis數據導入集羣

import命令可以把外部的redis節點數據導入集羣。如下示例:

[root@cache01 src]# redis-cli --cluster import 192.168.75.187:7005 --cluster-from 192.168.75.187:7002

在這裏插入圖片描述

上面的命令是把 192.168.75.187:7002上的數據導入到 192.168.75.187:7005這個節點所在的集羣

導入的流程如下:

1、通過load_cluster_info_from_node方法加載集羣信息,check_cluster方法檢查集羣是否健康;
2、連接外部redis節點,如果外部節點開啓了cluster_enabled,則提示錯誤;
3、通過scan命令遍歷外部節點,一次獲取1000條數據;
4、遍歷這些key,計算出key對應的slot;
5、執行migrate命令,源節點是外部節點,目的節點是集羣slot對應的節點,如果設置了–copy參數,則傳遞copy參數,如果設置了–replace,則傳遞replace參數;
6、不停執行scan命令,直到遍歷完全部的key;
7、至此完成整個遷移流程。

這中間如果出現異常,程序就會停止。沒使用--copy模式,則可以重新執行import命令,使用--copy的話,最好清空新的集羣再導入一次。

import命令更適合離線的把外部redis數據導入,在線導入的話最好使用更專業的導入工具,以slave的方式連接redis節點去同步節點數據應該是更好的方式。  

5.8.9. 注意事項:集羣創建時 replicas 參數指定情況

使用 --replicas 1 參數時,如果節點數量少於六個,會報如下錯誤:

*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 5 nodes and 1 replicas per node.
*** At least 6 nodes are required.

使用 --replicas 1 參數時,如果節點數量 大於六個,且爲單數時。
這樣會造成某個master擁有兩個salve

5.8.9.reshard在線遷移slot

reshard命令可以在線把集羣的一些slot從集羣原來slot負責節點遷移到新的節點,利用reshard可以完成集羣的在線橫向擴容和縮容。
reshard的參數很多,下面來一一解釋一番:

reshard host:port
–cluster-from
–cluster-to
–cluster-slots
–cluster-yes
–cluster-timeout
–cluster-pipeline
–cluster-replace

命令 說明
host:port 這個是必傳參數,用來從一個節點獲取整個集羣信息,相當於獲取集羣信息的入口。
–cluster-from 需要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還可以直接傳遞–cluster-from all,這樣源節點就是集羣的所有節點,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
–cluster-to slot需要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
–cluster-slots 需要遷移的slot數量,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
–cluster-yes 設置該參數,可以在打印執行reshard計劃的時候,提示用戶輸入yes確認後再執行reshard。
–timeout 設置migrate命令的超時時間。
–cluster-pipeline 定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值爲10。
–cluster-replace

遷移的流程如下:

1、通過load_cluster_info_from_node方法裝載集羣信息。
2、執行check_cluster方法檢查集羣是否健康。只有健康的集羣才能進行遷移。
3、獲取需要遷移的slot數量,用戶沒傳遞–cluster-slots參數,則提示用戶手動輸入。
4、獲取遷移的目的節點,用戶沒傳遞–cluster-to參數,則提示用戶手動輸入。此處會檢查目的節點必須爲master節點。
5、獲取遷移的源節點,用戶沒傳遞–cluster-from參數,則提示用戶手動輸入。此處會檢查源節點必須爲master節點。–cluster-from all的話,源節點就是除了目的節點外的全部master節點。這裏爲了保證集羣slot分配的平均,建議傳遞–cluster-from all。
6、執行compute_reshard_table方法,計算需要遷移的slot數量如何分配到源節點列表,採用的算法是按照節點負責slot數量由多到少排序,計算每個節點需要遷移的slot的方法爲:遷移slot數量 * (該源節點負責的slot數量 / 源節點列表負責的slot總數)。這樣算出的數量可能不爲整數,這裏代碼用了下面的方式處理:

n = (numslots/source_tot_slots*s.slots.length)
if i == 0
    n = n.ceil
else
    n = n.floor

這樣的處理方式會帶來最終分配的slot與請求遷移的slot數量不一致,這是一個個BUG。

7、打印出reshard計劃,如果用戶沒傳–cluster-yes,就提示用戶確認計劃。
8、根據reshard計劃,一個個slot的遷移到新節點上,遷移使用move_slot方法,該方法被很多命令使用。move_slot方法傳遞dots爲true和pipeline數量。
9、至此,就完成了全部的遷移任務。
下面看下一次reshard的執行結果:

[root@cache01 src]# redis-cli --cluster reshard 192.168.75.187:7001 --cluster-from all --cluster-to c276f98fb8f6b74cccceb3eb7399702fa6644cd9 --cluster-slots 11
>>> Performing Cluster Check (using node 192.168.75.187:7001)
M: 97901b9d1281fb8b27b26898340ec1682dfffdba 192.168.75.187:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ac47bd2d21c50500cc59c0f35720801f49e8cbba 192.168.75.187:7005
   slots: (0 slots) slave
   replicates 97901b9d1281fb8b27b26898340ec1682dfffdba
M: c276f98fb8f6b74cccceb3eb7399702fa6644cd9 192.168.75.187:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 3605efaeea1afcfd373f17181cf09a02915aa098 192.168.75.187:7004
   slots: (0 slots) slave
   replicates c276f98fb8f6b74cccceb3eb7399702fa6644cd9
S: e59bc95e8fadbcc1acaf95ada1621b8594c48007 192.168.75.187:7006
   slots: (0 slots) slave
   replicates d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
M: d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143 192.168.75.187:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Ready to move 11 slots.
  Source nodes:
    M: 97901b9d1281fb8b27b26898340ec1682dfffdba 192.168.75.187:7001
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    M: d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143 192.168.75.187:7002
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
  Destination node:
    M: c276f98fb8f6b74cccceb3eb7399702fa6644cd9 192.168.75.187:7003
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
  Resharding plan:
    Moving slot 5461 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 5462 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 5463 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 5464 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 5465 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 5466 from d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
    Moving slot 0 from 97901b9d1281fb8b27b26898340ec1682dfffdba
    Moving slot 1 from 97901b9d1281fb8b27b26898340ec1682dfffdba
    Moving slot 2 from 97901b9d1281fb8b27b26898340ec1682dfffdba
    Moving slot 3 from 97901b9d1281fb8b27b26898340ec1682dfffdba
    Moving slot 4 from 97901b9d1281fb8b27b26898340ec1682dfffdba
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 5461 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 5462 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 5463 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 5464 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 5465 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 5466 from 192.168.75.187:7002 to 192.168.75.187:7003: 
Moving slot 0 from 192.168.75.187:7001 to 192.168.75.187:7003: 
Moving slot 1 from 192.168.75.187:7001 to 192.168.75.187:7003: 
Moving slot 2 from 192.168.75.187:7001 to 192.168.75.187:7003: 
Moving slot 3 from 192.168.75.187:7001 to 192.168.75.187:7003: 
Moving slot 4 from 192.168.75.187:7001 to 192.168.75.187:7003: 
[root@cache01 src]# 

move_slot方法可以在線將一個slot的全部數據從源節點遷移到目的節點,fix、reshard、rebalance都需要調用該方法遷移slot。

move_slot接受下面幾個參數:

1、pipeline:設置一次從slot上獲取多少個key。
2、quiet:遷移會打印相關信息,設置quiet參數,可以不用打印這些信息。
3、cold:設置cold,會忽略執行importing和migrating。
4、dots:設置dots,則會在遷移過程打印遷移key數量的進度。
5、update:設置update,則會更新內存信息,方便以後的操作。

move_slot流程如下:

1、如果沒有設置cold,則對源節點執行cluster importing命令,對目的節點執行migrating命令。fix的時候有可能importing和migrating已經執行過來,所以此種場景會設置cold。
2、通過cluster getkeysinslot命令,一次性獲取遠節點遷移slot的pipeline個key的數量.
3、對這些key執行migrate命令,將數據從源節點遷移到目的節點。
4、如果migrate出現異常,在fix模式下,BUSYKEY的異常,會使用migrate的replace模式再執行一次,BUSYKEY表示目的節點已經有該key了,replace模式可以強制替換目的節點的key。不是fix模式就直接返回錯誤了。
5、循環執行cluster getkeysinslot命令,直到返回的key數量爲0,就退出循環。
6、如果沒有設置cold,對每個節點執行cluster setslot命令,把slot賦給目的節點。
7、如果設置update,則修改源節點和目的節點的slot信息。
8、至此完成了遷移slot的流程。

5.8.10. rebalance平衡集羣節點slot數量

rebalance命令

rebalance命令可以根據用戶傳入的參數平衡集羣節點的slot數量,rebalance功能非常強大,可以傳入的參數很多,以下是rebalance的參數列表和命令示例。
rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
[root@cache01 src]# redis-cli --cluster rebalance 192.168.75.187:7001  --cluster-threshold 1 --cluster-weight c276f98fb8f6b74cccceb3eb7399702fa6644cd9=5 d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143=5 --cluster-use-empty-masters  --cluster-simulate
>>> Performing Cluster Check (using node 192.168.75.187:7001)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 11.00
Moving 1991 slots from 192.168.75.187:7001 to 192.168.75.187:7002
#######################################################################################################################################################
Moving 1976 slots from 192.168.75.187:7001 to 192.168.75.187:7003
########################################################
[root@cache01 src]# 

以下是各個參數的用法:

參數 用法
host:port 這個是必傳參數,用來從一個節點獲取整個集羣信息,相當於獲取集羣信息的入口。
–cluster-weight <node1=w1…nodeN=wN> 節點的權重,格式爲node_id=weight,可爲多個節點分配權重。沒有傳遞–weight的節點的權重默認爲1。
–cluster-use-empty-masters rebalance是否考慮沒有節點的master,默認沒有分配slot節點的master是不參與rebalance的,設置–cluster-use-empty-masters可以讓沒有分配slot的節點參與rebalance。
–cluster-timeout 設置migrate命令的超時時間。
–cluster-simulate 設置該參數,可以模擬rebalance操作,提示用戶會遷移哪些slots,而不會真正執行遷移操作。
–cluster-pipeline 與reshard的pipeline參數一樣,定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值爲10。
–cluster-threshold 只有節點需要遷移的slot閾值超過threshold,纔會執行rebalance操作。具體計算方法可以參考下面的rebalance命令流程的第四步。
–cluster-replace

rebalance命令流程如下

1、load_cluster_info_from_node方法先加載集羣信息。
2、計算每個master的權重,根據參數–weight ,爲每個設置的節點分配權重,沒有設置的節點,則權重默認爲1。
3、根據每個master的權重,以及總的權重,計算自己期望被分配多少個slot。計算的方式爲:總slot數量 * (自己的權重 / 總權重)。
4、計算每個master期望分配的slot是否超過設置的閾值,即–threshold 設置的閾值或者默認的閾值。計算的方式爲:先計算期望移動節點的閾值,算法爲:

(100-(100.0*expected/n.slots.length)).abs

如果計算出的閾值沒有超出設置閾值,則不需要爲該節點移動slot。只要有一個master的移動節點超過閾值,就會觸發rebalance操作。
5、如果觸發了rebalance操作。那麼就開始執行rebalance操作,先將每個節點當前分配的slots數量減去期望分配的slot數量獲得balance值。將每個節點的balance從小到大進行排序獲得sn數組。
6、用dst_idx和src_idx遊標分別從sn數組的頭部和尾部開始遍歷。目的是爲了把尾部節點的slot分配給頭部節點。

sn數組保存的balance列表排序後,負數在前面,正數在後面。負數表示需要有slot遷入,所以使用dst_idx遊標,正數表示需要有slot遷出,所以使用src_idx遊標。理論上sn數組各節點的balance值加起來應該爲0,不過由於在計算期望分配的slot的時候只是使用直接取整的方式,所以可能出現balance值之和不爲0的情況,balance值之和不爲0即爲節點不平衡的slot數量,由於slot總數有16384個,不平衡數量相對於總數,基數很小,所以對rebalance流程影響不大。

7、獲取sn[dst_idx]和sn[src_idx]的balance值較小的那個值,該值即爲需要從sn[src_idx]節點遷移到sn[dst_idx]節點的slot數量。
8、接着通過compute_reshard_table方法計算源節點的slot如何分配到源節點列表。這個方法在reshard流程中也有調用,具體步驟可以參考reshard流程的第六步。
9、如果是simulate模式,則只是打印出遷移列表。
10、如果沒有設置simulate,則執行move_slot操作,遷移slot,傳入的參數爲:quiet=>true,:dots=>false,:update=>true。
11、遷移完成後更新sn[dst_idx]和sn[src_idx]的balance值。如果balance值爲0後,遊標向前進1。
12、直到dst_idx到達src_idx遊標,完成整個rebalance操作。

5.8.11. add-node將新節點加入集羣

add-node命令可以將新節點加入集羣,節點可以爲master,也可以爲某個master節點的slave。

add-node new_host:new_port existing_host:existing_port
–cluster-slave
–cluster-master-id

add-node有兩個可選參數:

參數 說明
new_host:new_port existing_host:existing_port new_host:new_port 新節點的ip:port;existing_host:existing_port,要加入集羣的一個master的ip:port,
–cluster-slave 設置該參數,則新節點以slave的角色加入集羣
–cluster-master-id 新加入的節點要放到哪個master下。這個參數需要設置了–cluster-slave才能生效,如果不設置該參數,則會隨機爲新節點選擇一個master節點。

可以看下add-node命令的執行示例:

[root@cache01 redis]# redis-cli --cluster add-node 192.168.75.187:7007 192.168.75.187:7003  --cluster-slave --cluster-master-id d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
>>> Adding node 192.168.75.187:7007 to cluster 192.168.75.187:7003
>>> Performing Cluster Check (using node 192.168.75.187:7003)
M: c276f98fb8f6b74cccceb3eb7399702fa6644cd9 192.168.75.187:7003
   slots:[0-4],[5461-5466],[10923-16383] (5472 slots) master
   1 additional replica(s)
M: d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143 192.168.75.187:7002
   slots:[5467-10922] (5456 slots) master
   1 additional replica(s)
S: e59bc95e8fadbcc1acaf95ada1621b8594c48007 192.168.75.187:7006
   slots: (0 slots) slave
   replicates d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
S: ac47bd2d21c50500cc59c0f35720801f49e8cbba 192.168.75.187:7005
   slots: (0 slots) slave
   replicates 97901b9d1281fb8b27b26898340ec1682dfffdba
S: 3605efaeea1afcfd373f17181cf09a02915aa098 192.168.75.187:7004
   slots: (0 slots) slave
   replicates c276f98fb8f6b74cccceb3eb7399702fa6644cd9
M: 97901b9d1281fb8b27b26898340ec1682dfffdba 192.168.75.187:7001
   slots:[5-5460] (5456 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

add-node流程如下

1、通過load_cluster_info_from_node方法轉載集羣信息,check_cluster方法檢查集羣是否健康。
2、如果設置了–slave,則需要爲該節點尋找master節點。設置了–master-id,則以該節點作爲新節點的master,如果沒有設置–master-id,則調用get_master_with_least_replicas方法,尋找slave數量最少的master節點。如果slave數量一致,則選取load_cluster_info_from_node順序發現的第一個節點。load_cluster_info_from_node順序的第一個節點是add-node設置的existing_host:existing_port節點,後面的順序根據在該節點執行cluster nodes返回的結果返回的節點順序。
3、連接新的節點並與集羣第一個節點握手。
4、如果沒設置–slave就直接返回ok,設置了–slave,則需要等待確認新節點加入集羣,然後執行cluster replicate命令複製master節點。
5、至此,完成了全部的增加節點的流程。

5.8.12. del-node從集羣中刪除節點

del-node可以把某個節點從集羣中刪除。del-node只能刪除沒有分配slot的節點。刪除命令傳遞兩個參數:

del-node       host:port node_id
host:port:從該節點獲取集羣信息。
node_id:需要刪除的節點id。

del-node執行結果示例如下:

[root@cache01 redis]# redis-cli --cluster del-node 192.168.75.187:7001 d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143
>>> Removing node d3316138a3d30dbaeceda65fc6fb8a2eeaeb2143 from cluster 192.168.75.187:7001

del-node流程如下

1、通過load_cluster_info_from_node方法轉載集羣信息。
2、根據傳入的node id獲取節點,如果節點沒找到,則直接提示錯誤並退出。
3、如果節點分配的slot不爲空,則直接提示錯誤並退出。
4、遍歷集羣內的其他節點,執行cluster forget命令,從每個節點中去除該節點。如果刪除的節點是master,而且它有slave的話,這些slave會去複製其他master,調用的方法是get_master_with_least_replicas,與add-node沒設置–master-id尋找master的方法一樣。

5、然後關閉該節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章