中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis-trib.rb命令詳解

發布時間:2020-05-26 01:56:57 來源:網絡 閱讀:1889 作者:898009427 欄目:關系型數據庫

redis-trib.rb命令詳解
redis-trib.rb是官方提供的Redis Cluster的管理工具,無需額外下載,默認位于源碼包的src目錄下,但因該工具是用ruby開發的,所以需要準備相關的依賴環境。

官網:https://redis.io/documentation
中文官網:http://www.redis.cn/documentation.html

1 redis-trib.rb支持的操作

[root@node1 src]# ./redis-trib.rb help
Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  info            host:port
  fix             host:port
                  --timeout <arg>
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
                  --timeout <arg>
                  --pipeline <arg>
  rebalance       host:port
                  --weight <arg>
                  --auto-weights
                  --use-empty-masters
                  --timeout <arg>
                  --simulate
                  --pipeline <arg>
                  --threshold <arg>
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
                  --copy
                  --replace
  help            (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
[root@node1 src]#

支持的操作如下:

  • create:創建集群
  • check:檢查集群
  • info:查看集群信息
  • fix:修復集群
  • reshard:在線遷移slot
  • rebalance:平衡集群節點slot數量
  • add-node:將新節點加入集群
  • del-node:從集群中刪除節點
  • set-timeout:設置集群節點間心跳連接的超時時間
  • call:在集群全部節點上執行命令
  • import:將外部redis數據導入集群

對于check,fix,reshard,del-node,set-timeout,您可以指定集群中任何工作節點的主機和端口。

2 創建集群

用戶無需指定哪臺節點為master,哪臺節點為slave,因為redis內部算法幫我們實現了,也可以先創建主節點,然后再指定從節點;

  • create
  • --replicas # 可選參數,replicas表示每個master需要有幾個slave。

  • 只有master節點的創建方式
./redis-trib.rb create 192.168.1.101:7000 192.168.1.102:7000 192.168.1.103:7000 192.168.1.104:7000 192.168.1.105:7000 192.168.1.106:7000
  • 使用 --replicas 1 創建 每個master帶一個 slave 指令
./redis-trib.rb create --replicas 1 192.168.1.101:7000 192.168.1.102:7000 192.168.1.103:7000 192.168.1.104:7000 192.168.1.105:7000 192.168.1.106:7000

16384個槽全部被分配,集群創建成功。注意:給redis-trib.rb的節點地址必須是不包含任何槽/數據的節點,否則會拒絕創建集群。

關于主從節點的選擇及槽的分配,其算法如下:

把節點按照host分類,這樣保證master節點能分配到更多的主機中。
遍歷host列表,從每個host列表中彈出一個節點,放入interleaved數組。直到所有的節點都彈出為止。
將interleaved數組中前master個數量的節點保存到masters數組中。
計算每個master節點負責的slot數量,16384除以master數量取整,這里記為N。
遍歷masters數組,每個master分配N個slot,最后一個master,分配剩下的slot。
接下來為master分配slave,分配算法會盡量保證master和slave節點不在同一臺主機上。對于分配完指定slave數量的節點,還有多余的節點,也會為這些節點尋找master。分配算法會遍歷兩次masters數組。
第一次遍歷master數組,在余下的節點列表找到replicas數量個slave。每個slave為第一個和master節點host不一樣的節點,如果沒有不一樣的節點,則直接取出余下列表的第一個節點。
第二次遍歷是分配節點數除以replicas不為整數而多出的一部分節點。

3 檢查集群情況:check

指定任意一個節點即可。

./redis-trib.rb check 192.168.1.101:7000

顯示:

[root@NUC-2 src]# ./redis-trib.rb check 192.168.1.101:7000
>>> Performing Cluster Check (using node 192.168.1.101:7000)
S: afaa82815a7fc2d0e19ffa664677dde03aa8ab36 192.168.1.101:7000
   slots: (0 slots) slave
   replicates 845674c71b1f43f9297501903e616140b2a0a1f6
M: b7cada75939d960f8ca98aad875b8f2e49020b19 192.168.1.102:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: f1946135289c8c76bb9817213cbb1730d9a0b052 192.168.1.103:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 9f9a36f2da46bd18f9df785900b5a8e3c53b5ca3 192.168.1.106:7000
   slots: (0 slots) slave
   replicates b7cada75939d960f8ca98aad875b8f2e49020b19
M: 845674c71b1f43f9297501903e616140b2a0a1f6 192.168.1.105:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 15fc1bd754a2e02ec571e23c7d81a80c7322a100 192.168.1.104:7000
   slots: (0 slots) slave
   replicates f1946135289c8c76bb9817213cbb1730d9a0b052
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@NUC-2 src]#

4 查看集群信息:info

[root@NUC-2 src]# ./redis-trib.rb info 192.168.20.61:7000
192.168.20.62:7000 (b7cada75...) -> 2 keys | 5462 slots | 1 slaves.
192.168.20.63:7000 (f1946135...) -> 2 keys | 5461 slots | 1 slaves.
192.168.20.65:7000 (845674c7...) -> 4 keys | 5461 slots | 1 slaves.
[OK] 8 keys in 3 masters.
0.00 keys per slot on average.
[root@NUC-2 src]#

5 修復集群

目前fix命令能修復兩種異常:

  1. 節點中存在處于遷移中(importing或migrating狀態)的slot。
  2. 節點中存在未分配的slot。
    其它異常不能通過fix命令修復。
[root@NUC-2 src]# ./redis-trib.rb fix 192.168.20.61:7000
>>> Performing Cluster Check (using node 192.168.20.61:7000)
S: afaa82815a7fc2d0e19ffa664677dde03aa8ab36 192.168.20.61:7000
   slots: (0 slots) slave
   replicates 845674c71b1f43f9297501903e616140b2a0a1f6
M: b7cada75939d960f8ca98aad875b8f2e49020b19 192.168.20.62:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: f1946135289c8c76bb9817213cbb1730d9a0b052 192.168.20.63:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 9f9a36f2da46bd18f9df785900b5a8e3c53b5ca3 192.168.20.66:7000
   slots: (0 slots) slave
   replicates b7cada75939d960f8ca98aad875b8f2e49020b19
M: 845674c71b1f43f9297501903e616140b2a0a1f6 192.168.20.65:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 15fc1bd754a2e02ec571e23c7d81a80c7322a100 192.168.20.64:7000
   slots: (0 slots) slave
   replicates f1946135289c8c76bb9817213cbb1730d9a0b052
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@NUC-2 src]#

6 在線遷移:slot

格式:

redis-trib.rb reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg>

選項:

  • reshard
  • host:port:必傳參數,集群內任意節點地址,用來獲取整個集群信息。
  • --from <arg>:需要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還可以直接傳遞--from all,這樣源節點就是集群的所有節點,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
  • --to <arg>:slot需要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
  • --slots <arg>:需要遷移的slot數量,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
  • --yes:設置該參數,可以在打印執行reshard計劃的時候,提示用戶輸入yes確認后再執行reshard。
  • --timeout <arg>:控制每次migrate操作的超時時間,默認為60000毫秒。
  • --pipeline <arg>:定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10。

例:

./redis-trib.rb reshard --from all --to 845674c71b1f43f9297501903e616140b2a0a1f6 --slots 11 

7 平衡集群節點slot數量

選項:

rebalance       host:port
                  --weight <arg>
                  --auto-weights
                  --use-empty-masters
                  --timeout <arg>
                  --simulate
                  --pipeline <arg>
                  --threshold <arg>

說明

  • rebalance
  • host:port:這個是必傳參數,用來從一個節點獲取整個集群信息,相當于獲取集群信息的入口。
  • --weight <arg>:節點的權重,格式為node_id=weight,如果需要為多個節點分配權重的話,需要添加多個--weight <arg>參數,即--weight b31e3a2e=5 --weight 60b8e3a1=5,node_id可為節點名稱的前綴,只要保證前綴位數能唯一區分該節點即可。沒有傳遞–weight的節點的權重默認為1。
  • --auto-weights:這個參數在rebalance流程中并未用到。
  • --threshold <arg>:只有節點需要遷移的slot閾值超過threshold,才會執行rebalance操作。具體計算方法可以參考下面的rebalance命令流程的第四步。
  • --use-empty-masters:rebalance是否考慮沒有節點的master,默認沒有分配slot節點的master是不參與rebalance的,設置--use-empty-masters可以讓沒有分配slot的節點參與rebalance。
  • --timeout <arg>:設置migrate命令的超時時間。
  • --simulate:設置該參數,可以模擬rebalance操作,提示用戶會遷移哪些slots,而不會真正執行遷移操作。
  • --pipeline <arg>:與reshar的pipeline參數一樣,定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10。

例:

redis-trib.rb rebalance --weight 845674c71b1f43f9297501903e616140b2a0a1f6=3 --weight b7cada75939d960f8ca98aad875b8f2e49020b19=2 --use-empty-masters  192.168.20.61:7000

增加一個主節點

./redis-trib.rb add-node 192.168.1.107:7000 192.168.1.108:7000

# 添加成功,但是并沒有指定 slot ,所以必須遷移slot節點
./redis-trib.rb reshard 192.168.1.108:7000

# 提示一 :How many slots do you want to move (from 1 to 16384)?
為了平衡每個master管理的slot的個數,所以輸入 16384/master  的數量。如這里為4 那么就是 16384/4 = 4096個。
輸入 4096

# 提示二:What is the receiving node ID?(接受的node ID是多少)
            890d2c8d989cce50e5fa48e37cd35738887f3f7d # 107的ID

# 提示三: Please enter all the source node IDs.
           Type 'all' to use all the nodes as source nodes for the hash slots.
           Type 'done' once you entered all the source nodes IDs.
                  (要從哪個節點中獲取lost ?)
不打算從特定的節點上取出指定數量的哈希槽, 那么可以輸入 all
否則輸入某個節點的 node ID

# 檢查是否成功
./redis-trib.rb check 192.168.1.108:7000

添加新節點

格式:

redis-trib add-node new_host:new_port existing_host:existing_port --slave --master-id <arg>

其中,
new_host:new_port:待添加的節點,必須確保其為空或不在其它集群中。否則,會提示以下錯誤。

[ERR] Node 192.168.1.101:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

所以,線上建議使用redis-trib.rb添加新節點,因為其會對新節點的狀態進行檢查。如果手動使用cluster meet命令加入已經存在于其它集群的節點,會造成被加入節點的集群合并到現有集群的情況,從而造成數據丟失和錯亂,后果非常嚴重,線上謹慎操作。

existing_host:existing_port:集群中任意一個節點的地址。

如果添加的是主節點,只需指定源節點和目標節點的地址即可。

redis-trib.rb add-node 192.168.1.101:7000 127.0.0.1:6384

如果添加的是從節點,其語法如下,

redis-trib.rb add-node --slave --master-id f413fb7e6460308b17cdb71442798e1341b56cbc 192.168.1.101:7000 127.0.0.1:6384

注意:--slave和--master-id必須寫在前面,同樣的參數,如果是下面這樣寫法,會提示錯誤,

# redis-trib.rb add-node 192.168.1.101:7000 127.0.0.1:6384 --slave --master-id f413fb7e6460308b17cdb71442798e1341b56cbc
[ERR] Wrong number of arguments for specified sub command

添加從節點,可不設置--master-id,此時會隨機選擇主節點。

  • 從節點會自動匹配主節點
./redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000
  • 增加從節點的時候指定主節點。
./redis-trib.rb add-node --slave --master-id 890d2c8d989cce50e5fa48e37cd35738887f3f7d 192.168.66.3:7008 192.168.66.2:7000

刪除節點

格式

redis-trib.rb del-node host:port node_id
參數:
  • del-node:刪除節點的指令;
  • host:port:從該節點獲取集群信息;
  • node_id:需要刪除的節點id。

在刪除節點之前,其對應的槽必須為空,所以,在進行節點刪除動作之前,必須使用redis-trib.rb reshard將其遷移出去。

需要注意的是,如果某個節點的槽被完全遷移出去,其對應的slave也會隨著更新,指向遷移的目標節點。

./redis-trib.rb del-node 192.168.66.2:7000 d5f6d1d17426bd564a6e309f32d0f5b96962fe53

設置節點的超時時間

redis-trib.rb set-timeout host:port milliseconds

其實就是批量修改集群各節點的cluster-node-timeout參數。

# redis-trib.rb set-timeout 192.168.1.101:7000 20000
/usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated
>>> Reconfiguring node timeout in every cluster node...
*** New timeout set for 192.168.1.101:7000
*** New timeout set for 192.168.1.102:7000
*** New timeout set for 192.168.1.103:7000
*** New timeout set for 192.168.1.104:7000
*** New timeout set for 192.168.1.105:7000
*** New timeout set for 192.168.1.106:7000
>>> New node timeout set. 6 OK, 0 ERR.

將外部redis數據導入集群

redis-trib.rb import --from 127.0.0.1:6378 127.0.0.1:6379

其內部處理流程如下:

1> 通過load_cluster_info_from_node方法加載集群信息,check_cluster方法檢查集群是否健康。

2> 連接外部redis節點,如果外部節點開啟了cluster_enabled,則提示錯誤([ERR] The source node should not be a cluster node.)

3> 通過scan命令遍歷外部節點,一次獲取1000條數據。

4> 遍歷這些key,計算出key對應的slot。

5> 執行migrate命令,源節點是外部節點,目的節點是集群slot對應的節點,如果設置了--copy參數,則傳遞copy參數,其會保留源節點的key,如果設置了--replace,則傳遞replace參數。如果目標節點中存在同名key,其值會被覆蓋。兩個參數可同時指定。

6> 不停執行scan命令,直到遍歷完所有key。

7> 遷移完成。

宕機情況

當某個從節點掛掉之后,對于redis集群來說幾乎沒有什么影響,相當于這個從節點對應的 主節點少了一個備份而已。
當某一個主節點掛掉之后,redis 會從這個 主節點 的 多個從節點 中推選一個出來,擔當master的工作,并且把之前依附在
主節點的從節點調整依附到新的master上。如果新任的master也掛掉并且他沒有從節點了,那么這個集群也真正的掛掉了。

集群創建時 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

參考

https://www.cnblogs.com/ivictor/p/9768010.html

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

务川| 易门县| 彰化县| 临朐县| 鄂托克前旗| 贡觉县| 河西区| 武乡县| 新源县| 沙洋县| 台东县| 青川县| 长岛县| 通渭县| 益阳市| 海门市| 景宁| 海口市| 鄱阳县| 镇康县| 晋州市| 双牌县| 壤塘县| 康平县| 修水县| 珠海市| 禹州市| 元阳县| 天祝| 抚州市| 晋江市| 勃利县| 朝阳县| 客服| 措美县| 濉溪县| 沽源县| 新和县| 文山县| 土默特左旗| 呼玛县|