1. 程式人生 > >redis3.0 運維(動態增加、刪除、重新分配節點)

redis3.0 運維(動態增加、刪除、重新分配節點)

上一篇,我介紹了怎樣搭建redis 3.0叢集環境,本篇繼續學習怎樣人工干預redis 叢集環境,動態的增加、刪除、重新分配節點。

一、redis cluster 命令列

//叢集(cluster)  
CLUSTER INFO 列印叢集的資訊  
CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。   

//節點(node)  
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。  
CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。  
CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。  
CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。   

//槽(slot)  
CLUSTER ADDSLOTS <slot> [slot ...
] 將一個或多個槽(slot)指派(assign)給當前節點。 CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。 CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。 CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。 //鍵 (key) CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。

這些命令是叢集所獨有的。執行上述命令要先登入,可以從叢集的任意一個節點進行登入:

redis-cli -c -p 7002 -h 127.0.0.1    //登入叢集
127.0.0.1:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:
3 cluster_stats_messages_sent:249371 cluster_stats_messages_received:88204

二、新增節點

1,新配置二個測試節點

[root@localhost cluster]# cp -r 7000 ./7006
[root@localhost 7006]# rm -rf appendonly.aof dump.rdb nodes.conf //刪除7000節點的相關檔案
vi redis.conf
修改
port 7006
pidfile /var/run/redis_7006.pid

同樣操作建立7007節點,然後啟動兩個redis節點:

[root@localhost 7006]# redis-server redis.conf 

2,新增主節點

[root@localhost local]# cd redis-3.0.0/src/
[root@localhost src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7001 

註釋:

127.0.0.1:7006 是新增的節點

127.0.0.1:7001 叢集任一個舊節點

3,新增從節點

#檢視 7006節點的node id
127.0.0.1:7001> cluster nodes
5da7b4b37f4e14638d9558e66166c042b752d417 127.0.0.1:7006 master - 0 1458724292695 0 connected
bda1c8d3dacc62fd3f94e681056d24df9c9509d5 127.0.0.1:7005 slave 56dbded984085df8ab3565828a5a8fad02560988 0 1458724292184 6 connected
ed3afe6671e902df9572eae4d3364007344c0c71 127.0.0.1:7001 myself,master - 0 0 2 connected 5461-10922
0e7b636594a7ef4d575d8160225b2e1ca90ac375 127.0.0.1:7000 slave 49ed626134079dc301f586ff4edb1670a3a42a8c 0 1458724291672 7 connected
56dbded984085df8ab3565828a5a8fad02560988 127.0.0.1:7002 master - 0 1458724291672 3 connected 10923-16383
49ed626134079dc301f586ff4edb1670a3a42a8c 127.0.0.1:7003 master - 0 1458724293202 7 connected 0-5460
62dea9349dd9b53be602f653b62ab21adad06d26 127.0.0.1:7004 slave ed3afe6671e902df9572eae4d3364007344c0c71 0 1458724292694 5 connected
#新增7007成為7006的slave
[root@localhost src]# ./redis-trib.rb add-node --slave --master-id 5da7b4b37f4e14638d9558e66166c042b752d417 127.0.0.1:7007 127.0.0.1:7001

註釋:

–slave,表示新增的是從節點

–master-id 5da7b4b37f4e14638d9558e66166c042b752d417 ,主節點的node id,在這裡是前面新新增的7006的node id

127.0.0.1:7007,新節點

127.0.0.1:7001叢集任一個舊節點

4,重新分配slot

[[email protected] src]# redis-trib.rb reshard 127.0.0.1:7001 //下面是主要過程  

How many slots do you want to move (from 1 to 16384)? 1000 //設定slot數1000  
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新節點node 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.  
Source node #1:all //表示全部節點重新洗牌  
Do you want to proceed with the proposed reshard plan (yes/no)? yes //確認重新分 

在檢視叢集nodes資訊,得到如下結果:
這裡寫圖片描述
新新增的主節點是沒有slot的,主節點如果沒有slots的話,存取資料就都不會被選中。所以重新洗牌後就新加的master node 就有slot了。 注意:如果用’all’則會將其他每個master節點的slot 分給目標節點。最好別用‘all’, 會造成slot 分割碎片。圖為用’all’的情況。

三、刪除節點

1,刪除從節點

redis-trib.rb del-node 127.0.0.1:7001 '9c240333476469e8e2c8e80b089c48f389827265'  

2,刪除主節點

注意:如果主節點有從節點,將從節點轉移到其他主節點在刪除

127.0.0.1:7007> cluster replicate 49ed626134079dc301f586ff4edb1670a3a42a8c

注:49ed626134079dc301f586ff4edb1670a3a42a8c 為master節點7003的node id

如果主節點有slot,去掉分配的slot,然後在刪除主節點

# redis-trib.rb reshard 127.0.0.1:7006 //取消分配的slot,下面是主要過程  

How many slots do you want to move (from 1 to 16384)? 1000 //被刪除master的所有slot數量  
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收7007節點slot的master  
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:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被刪除master的node-id  
Source node #2:done   

Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot後,reshard 

注意:source node 要用 ‘done’,如果用all 則會全部洗牌,7006還是會得到slot.
最後刪除主節點7006:

redis-trib.rb del-node 127.0.0.1:7001 '5da7b4b37f4e14638d9558e66166c042b752d417' 

注:
127.0.0.1:7001 代表cluster的一個node
5da7b4b37f4e14638d9558e66166c042b752d417 為要刪除的7006這個節點的id.