Redis 5.0 redis-cli --cluster


背景:

      Redis Cluster 在5.0之后取消了ruby腳本 redis-trib.rb的支持(手動命令行添加集群的方式不變),集合到redis-cli里,避免了再安裝ruby的相關環境。直接使用redis-clit的參數--cluster 來取代。為方便自己后面查詢就說明下如何使用該命令進行Cluster的創建和管理,關於Cluster的相關說明可以查看官網或則Redis Cluster部署、管理和測試

環境:

系統版本:Ubuntu 14.04
Redis版本:5.0.5
機器IP:192.168.163.132

說明:redis-cli --cluster help

復制代碼
redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN   #創建集群
                 --cluster-replicas <arg>      #從節點個數
  check          host:port                     #檢查集群
                 --cluster-search-multiple-owners #檢查是否有槽同時被分配給了多個節點
  info           host:port                     #查看集群狀態
  fix            host:port                     #修復集群
                 --cluster-search-multiple-owners #修復槽的重復分配問題
  reshard        host:port                     #指定集群的任意一節點進行遷移slot,重新分slots
                 --cluster-from <arg>          #需要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還可以直接傳遞--from all,這樣源節點就是集群的所有節點,不傳遞該參數的話,則會在遷移過程中提示用戶輸入
                 --cluster-to <arg>            #slot需要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程中提示用戶輸入
                 --cluster-slots <arg>         #需要遷移的slot數量,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
                 --cluster-yes                 #指定遷移時的確認輸入
                 --cluster-timeout <arg>       #設置migrate命令的超時時間
                 --cluster-pipeline <arg>      #定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10
                 --cluster-replace             #是否直接replace到目標節點
  rebalance      host:port                                      #指定集群的任意一節點進行平衡集群節點slot數量 
                 --cluster-weight <node1=w1...nodeN=wN>         #指定集群節點的權重
                 --cluster-use-empty-masters                    #設置可以讓沒有分配slot的主節點參與,默認不允許
                 --cluster-timeout <arg>                        #設置migrate命令的超時時間
                 --cluster-simulate                             #模擬rebalance操作,不會真正執行遷移操作
                 --cluster-pipeline <arg>                       #定義cluster getkeysinslot命令一次取出的key數量,默認值為10
                 --cluster-threshold <arg>                      #遷移的slot閾值超過threshold,執行rebalance操作
                 --cluster-replace                              #是否直接replace到目標節點
  add-node       new_host:new_port existing_host:existing_port  #添加節點,把新節點加入到指定的集群,默認添加主節點
                 --cluster-slave                                #新節點作為從節點,默認隨機一個主節點
                 --cluster-master-id <arg>                      #給新節點指定主節點
  del-node       host:port node_id                              #刪除給定的一個節點,成功后關閉該節點服務
  call           host:port command arg arg .. arg               #在集群的所有節點執行相關命令
  set-timeout    host:port milliseconds                         #設置cluster-node-timeout
  import         host:port                                      #將外部redis數據導入集群
                 --cluster-from <arg>                           #將指定實例的數據導入到集群
                 --cluster-copy                                 #migrate時指定copy
                 --cluster-replace                              #migrate時指定replace
  help           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
復制代碼

注意:Redis Cluster最低要求是3個主節點,如果需要集群需要認證,則在最后加入 -a xx 即可。

① 創建集群主節點

redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381
  View Code

② 創建集群主從節點

/redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381 192.168.163.132:6382 192.168.163.132:6383 192.168.163.132:6384 --cluster-replicas 1

說明:--cluster-replicas 參數為數字,1表示每個主節點需要1個從節點。

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.163.132:6383 to 192.168.163.132:6379
Adding replica 192.168.163.132:6384 to 192.168.163.132:6380
Adding replica 192.168.163.132:6382 to 192.168.163.132:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 117457eab5071954faab5e81c3170600d5192270 192.168.163.132:6379
   slots:[0-5460] (5461 slots) master
M: 815da8448f5d5a304df0353ca10d8f9b77016b28 192.168.163.132:6380
   slots:[5461-10922] (5462 slots) master
M: 56005b9413cbf225783906307a2631109e753f8f 192.168.163.132:6381
   slots:[10923-16383] (5461 slots) master
S: 3a1d04983ab6c4ae853f9602dd922d4ebadc4dbf 192.168.163.132:6382
   replicates 56005b9413cbf225783906307a2631109e753f8f
S: 0c21b6cee354594a23f4d5abf0d01b48bdc96d55 192.168.163.132:6383
   replicates 117457eab5071954faab5e81c3170600d5192270
S: f6a6957421b80409106cb36be3c7ba41f3b603ff 192.168.163.132:6384
   replicates 815da8448f5d5a304df0353ca10d8f9b77016b28
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 192.168.163.132:6379)
M: 117457eab5071954faab5e81c3170600d5192270 192.168.163.132:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 815da8448f5d5a304df0353ca10d8f9b77016b28 192.168.163.132:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 3a1d04983ab6c4ae853f9602dd922d4ebadc4dbf 192.168.163.132:6382
   slots: (0 slots) slave
   replicates 56005b9413cbf225783906307a2631109e753f8f
S: 0c21b6cee354594a23f4d5abf0d01b48bdc96d55 192.168.163.132:6383
   slots: (0 slots) slave
   replicates 117457eab5071954faab5e81c3170600d5192270
M: 56005b9413cbf225783906307a2631109e753f8f 192.168.163.132:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: f6a6957421b80409106cb36be3c7ba41f3b603ff 192.168.163.132:6384
   slots: (0 slots) slave
   replicates 815da8448f5d5a304df0353ca10d8f9b77016b28
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

通過該方式創建的帶有從節點的機器不能夠自己手動指定主節點,所以如果需要指定的話,需要自己手動指定,先使用①或③創建好主節點后,再通過④來處理。

③ 添加集群主節點

redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 

說明:為一個指定集群添加節點,需要先連到該集群的任意一個節點IP(192.168.163.132:6379),再把新節點加入。該2個參數的順序有要求:新加入的節點放前

  View Code

④ 添加集群從節點

redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d5192270

說明:把6382節點加入到6379節點的集群中,並且當做node_id為 117457eab5071954faab5e81c3170600d5192270 的從節點。如果不指定 --cluster-master-id 會隨機分配到任意一個主節點。

  View Code

⑤ 刪除節點

redis-cli --cluster del-node 192.168.163.132:6384 f6a6957421b80409106cb36be3c7ba41f3b603ff

說明:指定IP、端口和node_id 來刪除一個節點,從節點可以直接刪除,主節點不能直接刪除,刪除之后,該節點會被shutdown。

  View Code

注意:當被刪除掉的節點重新起來之后不能自動加入集群,但其和主的復制還是正常的,也可以通過該節點看到集群信息(通過其他正常節點已經看不到該被del-node節點的信息)。

如果想要再次加入集群,則需要先在該節點執行cluster reset,再用add-node進行添加,進行增量同步復制。

到此,目前整個集群的狀態如下:

復制代碼
192.168.163.132:6379> cluster nodes
815da8448f5d5a304df0353ca10d8f9b77016b28 192.168.163.132:6380@16380 master - 0 1569748297177 2 connected 5461-10922
0c21b6cee354594a23f4d5abf0d01b48bdc96d55 192.168.163.132:6383@16383 slave 56005b9413cbf225783906307a2631109e753f8f 0 1569748295000 4 connected
3a1d04983ab6c4ae853f9602dd922d4ebadc4dbf 192.168.163.132:6382@16382 slave 815da8448f5d5a304df0353ca10d8f9b77016b28 0 1569748295000 5 connected
117457eab5071954faab5e81c3170600d5192270 192.168.163.132:6379@16379 myself,master - 0 1569748297000 1 connected 0-5460
56005b9413cbf225783906307a2631109e753f8f 192.168.163.132:6381@16381 master - 0 1569748295000 3 connected 10923-16383
f6a6957421b80409106cb36be3c7ba41f3b603ff 192.168.163.132:6384@16384 slave 117457eab5071954faab5e81c3170600d5192270 0 1569748298185 6 connected
復制代碼

⑥ 檢查集群

redis-cli --cluster check 192.168.163.132:6384 --cluster-search-multiple-owners

說明:任意連接一個集群節點,進行集群狀態檢查

  View Code

⑦ 集群信息查看

redis-cli --cluster info 192.168.163.132:6384

說明:檢查key、slots、從節點個數的分配情況

/redis-cli --cluster info 192.168.163.132:6384
192.168.163.132:6380 (815da844...) -> 0 keys | 5462 slots | 1 slaves.
192.168.163.132:6381 (56005b94...) -> 0 keys | 5461 slots | 1 slaves.
192.168.163.132:6379 (117457ea...) -> 2 keys | 5461 slots | 1 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.

⑧ 修復集群

redis-cli --cluster fix 192.168.163.132:6384 --cluster-search-multiple-owners

說明:修復集群和槽的重復分配問題

  View Code

⑨ 設置集群的超時時間 

redis-cli --cluster set-timeout 192.168.163.132:6382 10000

說明:連接到集群的任意一節點來設置集群的超時時間參數cluster-node-timeout

復制代碼
redis-cli --cluster set-timeout 192.168.163.132:6382 10000
>>> Reconfiguring node timeout in every cluster node...
*** New timeout set for 192.168.163.132:6382
*** New timeout set for 192.168.163.132:6384
*** New timeout set for 192.168.163.132:6383
*** New timeout set for 192.168.163.132:6379
*** New timeout set for 192.168.163.132:6381
*** New timeout set for 192.168.163.132:6380
>>> New node timeout set. 6 OK, 0 ERR.
復制代碼

⑩ 集群中執行相關命令

redis-cli --cluster call 192.168.163.132:6381 config set requirepass cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config set masterauth cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config rewrite

說明:連接到集群的任意一節點來對整個集群的所有節點進行設置。

復制代碼
redis-cli --cluster call 192.168.163.132:6381 config set cluster-node-timeout 12000
>>> Calling config set cluster-node-timeout 12000
192.168.163.132:6381: OK
192.168.163.132:6383: OK
192.168.163.132:6379: OK
192.168.163.132:6384: OK
192.168.163.132:6382: OK
192.168.163.132:6380: OK
...
...
復制代碼

到此,相關集群的基本操作已經介紹完,現在說明集群遷移的相關操作。

遷移相關

① 在線遷移slot :在線把集群的一些slot從集群原來slot節點遷移到新的節點,即可以完成集群的在線橫向擴容和縮容。有2種方式進行遷移

一是根據提示來進行操作:

直接連接到集群的任意一節點
redis-cli -a cc --cluster reshard 192.168.163.132:6379

信息如下:

  View Code

二是根據參數進行操作:

redis-cli -a cc --cluster reshard 192.168.163.132:6379 --cluster-from 117457eab5071954faab5e81c3170600d5192270 --cluster-to 815da8448f5d5a304df0353ca10d8f9b77016b28 --cluster-slots 10 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace

說明:連接到集群的任意一節點來對指定節點指定數量的slot進行遷移到指定的節點。 

  View Code

② 平衡(rebalance)slot 

1)平衡集群中各個節點的slot數量

redis-cli -a cc --cluster rebalance 192.168.163.132:6379
  View Code

 2)根據集群中各個節點設置的權重等平衡slot數量(不執行,只模擬)

redis-cli -a cc --cluster rebalance --cluster-weight 117457eab5071954faab5e81c3170600d5192270=5 815da8448f5d5a304df0353ca10d8f9b77016b28=4 56005b9413cbf225783906307a2631109e753f8f=3 --cluster-simulate 192.168.163.132:6379

③ 導入集群

redis-cli --cluster import 192.168.163.132:6379 --cluster-from 192.168.163.132:9021 --cluster-replace

說明:外部Redis實例(9021)導入到集群中的任意一節點。

  View Code

注意:測試下來發現參數--cluster-replace沒有用,如果集群中已經包含了某個key,在導入的時候會失敗,不會覆蓋,只有清空集群key才能導入。

*** Importing 97847 keys from DB 0
Migrating 9223372011174675807 to 192.168.163.132:6381: Source 192.168.163.132:9021 replied with error:
ERR Target instance replied with error: BUSYKEY Target key name already exists

並且發現如果集群設置了密碼,也會導入失敗,需要設置集群密碼為空才能進行導入(call)。通過monitor(9021)的時候發現,在migrate的時候需要密碼進行auth認證。 

總結:

      Redis Cluster 通過redis-cli --cluster來創建和管理集群的方式和 redis-trib.rb腳本絕大部分都是一樣的,所以對於比較熟悉 redis-trib.rb 腳本的,使用--cluster也非常順手。


免責聲明!

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



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