RedisCluster集羣之動態增刪節點

RedisCluster集羣之動態增刪節點

前言:以前咱們嘗試搭建了cluster集羣,而且經過redis-cli客戶端查看了集羣狀態,下面咱們將會繼續介紹如何動態添加節點與刪除節點。node

預先準備內容:新增兩個節點,並啓動(步驟與前一文6個節點服務相似)redis

1、動態添加集羣節點

計劃添加 7007與7008兩個節點服務,而且分別對應master與slave。微信

./src/redis-server cluster-config/7007/redis.conf
./src/redis-server cluster-config/7008/redis.conf

1.1 先添加Master節點(7007)

1.1.1 新增節點

利用 redis-trib.rb 的命令 add-node newIP:port oldIP:port數據結構

# 第一個IP爲新添加的節點IP地址,第二個IP爲當前集羣中已經存在的任意一個節點,主要是爲了創建關係
./src/redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001

輸出.net

>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0d68dfae22060574a19712f2b6ee2608dbf1b471
S: bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 44c678a77a5181b99f6fe0a5e24a98462d687288
S: 88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 83e9712ba4520f949119b21a4ebb3de2d66ed2a0
M: 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1: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.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster. 
[OK] New node added correctly. // 提示新的節點成功加入

客戶端鏈接查看nodes節點3d

./src/redis-cli -c -h 127.0.0.1 -p 7001
127.0.0.1:7001> cluster nodes
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537151595086 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537151596091 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537151595086 5 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537151595588 6 connected
// 新節點,master,沒有槽點
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537151594000 0 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537151594077 2 connected 5461-10922
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537151594000 1 connected 0-5460

會發現新添加的節點爲master,可是並無分配槽點code

// 與其餘master相比,沒有槽點信息
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537151594000 0 connected
1.1.2 分配槽點

從新分片 reshardorm

./src/redis-trib.rb reshard 127.0.0.1:7007

提示server

// 打算分配多少槽點給當前節點
How many slots do you want to move (from 1 to 16384)?

輸入 200 (意思是給當前節點分配200個槽點)blog

// 接收節點的ID是多少,也就是當前節點的ID
What is the receiving node ID?

輸入 b062c61070542120c4cc6d6bb1e9c800a28f1be7

// 這裏支持從全部節點平均分配槽點,以及從指定節點分配槽點兩種方式
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.
Source node #1: // 這裏輸入槽點來源節點的ID,已done結束,或all(若是是all,則表示從全部節點獲取)

這裏提示 Source node #1: 咱們輸入 7001 對應的ID,回車後,輸入 done 執行提交

Source node #2: done

回車後會展現分配計劃,並提問是否確認分片計劃

Do you want to proceed with the proposed reshard plan (yes/no)? yes

輸入 yes 便可。

此時新節點添加完成,下面咱們驗證一下

1.1.3 驗證節點

進入客戶端,並輸入 cluster nodes 得出以下內容

0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537152323501 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537152323198 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537152322000 5 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537152322190 6 connected
// 7007 多出 0-199
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537152322000 7 connected 0-199
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537152323098 2 connected 5461-10922
// 7001 少了0-199,變爲200-5460
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537152323000 1 connected 200-5460
  • 7007節點的後面比以前多出了 0-199 的內容,標識分配0~199共200個槽點。
  • 7001節點少了200個節點(如今的範圍是200~5460

1.2 先添加Slave節點(7008)

1.2.1 新增節點

利用 redis-trib.rb 的命令 add-node 添加節點

./src/redis-trib.rb add-node 127.0.0.1:7008 127.0.0.1:7001

經過上面咱們已經知道,新添加的節點是master,這裏咱們須要將7008節點變爲7007節點的slave節點

1.2.2 切換身份

客戶端鏈接進入7008

./src/redis-cli -c -h 127.0.0.1 -p 7008

將7008節點變爲7007節點的slave節點

# 最後輸入的是 目標Master對應的IP
127.0.0.1:7008> cluster replicate b062c61070542120c4cc6d6bb1e9c800a28f1be7

至此,slave節點已經添加完成了

1.2.3 驗證節點

進入客戶端,並輸入 cluster nodes 得出以下內容

b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537153050731 7 connected 0-199
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153049000 1 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537153049522 2 connected
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537153050227 3 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537153049000 2 connected 5461-10922
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 master - 0 1537153050000 1 connected 200-5460
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537153049522 3 connected 10923-16383
// 變爲Slave
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 myself,slave b062c61070542120c4cc6d6bb1e9c800a28f1be7 0 1537153049000 0 connected

可見當前節點(7008)已成爲Slave

2、動態刪除集羣節點

2.1 刪除Master節點(7007)

2.1.1 移出槽點

步驟與分配槽點同樣

輸入從新分片命令

./src/redis-trib.rb reshard 127.0.0.1:7007

提示

// 移出200
How many slots do you want to move (from 1 to 16384)?  200
// 輸入接收槽點的節點的ID,這裏輸入的是7001的ID
What is the receiving node ID? 44c678a77a5181b99f6fe0a5e24a98462d687288
// 輸入移出槽點的節點的ID,這裏先輸入7007的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.
// 輸入7007的ID
Source node #1:b062c61070542120c4cc6d6bb1e9c800a28f1be7
// 輸入done執行指定節點的模式提交,all表示從全部節點上面平均分配
Source node #2:done
// 是否執行從新分片計劃,輸入yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes

此時經過客戶端查看 cluster nodes

// 7007 這裏沒有了以前的槽點
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537153624000 7 connected 
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153624350 8 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537153625000 2 connected
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537153625565 3 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537153625565 2 connected 5461-10922
// 7001 恢復如初
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 master - 0 1537153623846 8 connected 0-5460 
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537153625000 3 connected 10923-16383
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 myself,slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153625000 0 connected

可見

  • 7007節點的槽點已經沒有了,此時7007節點的數據已經遷移完畢,能夠隨時刪除7007節點。
  • 7001節點的槽點已經恢復爲0-5460了。
2.1.2 集羣移除節點

直接使用命令 del-node ip:port id

./src/redis-trib.rb del-node 127.0.0.1:7007 b062c61070542120c4cc6d6bb1e9c800a28f1be7

提示以下,說明刪除成功

>>> Removing node b062c61070542120c4cc6d6bb1e9c800a28f1be7 from cluster 127.0.0.1:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
2.1.3 驗證結果

進入客戶端輸入命令 cluster nodes

0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537154183000 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537154183391 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537154183592 8 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537154183000 6 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537154183895 2 connected 5461-10922
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537154182080 8 connected
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537154182000 8 connected 0-5460

發現7007成功移除了

2.2 刪除Slave節點(7008)

slave節點,直接移除便可

./src/redis-trib.rb del-node 127.0.0.1:7008 99496d346dd4ab3b1b40ec1b802245a80ab9b1cd

3、綜上

至此,實現動態添加、刪除節點的功能。

咱們總結一下添加和刪除的步驟

添加節點

  • 添加Master節點
    • 加入集羣:使用 redis-trib.rb add-node newIP:port oldIP:port
    • 分配槽點:使用 redis-trib.rb reshard ip:port 進行從新分片
  • 添加Slave節點
    • 加入集羣:使用 redis-trib.rb add-node newIP:port oldIP:port
    • 更換角色:客戶端鏈接進入當前節點,cluster replicate masterIP

刪除節點

  • 刪除Master節點
    • 移出槽點:使用redis-trib.rb reshard ip:port 進行從新分片,並移出
    • 移出集羣:使用redis-trib.rb del-node ip:port id
  • 刪除Slave節點
    • 移出集羣:使用redis-trib.rb del-node ip:port id

博客

開源中國博客地址

https://my.oschina.net/gmarshal

我的博客地址

http://blog.foruo.top

歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)

輸入圖片說明

相關文章
相關標籤/搜索