Redis Cluster日常操作命令梳理

散盡浮華發表於2017-11-28

  

在之前的一篇文章已經介紹了Redis Cluster及其部署,下面說下Redis Cluster日常操作命令:

一、以下命令是Redis Cluster叢集所獨有的,執行下面命令需要先登入redis:
[root@manage redis]# redis-cli -c -p 6382 -h 192.168.10.12     (客戶端命令:redis-cli -c -p port -h ip)
192.168.10.12:6382>  登入redis後,在裡面可以進行下面命令操作

叢集
cluster info :列印叢集的資訊
cluster nodes :列出叢集當前已知的所有節點( node),以及這些節點的相關資訊。
節點
cluster meet <ip> <port> :將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。
cluster forget <node_id> :從叢集中移除 node_id 指定的節點。
cluster replicate <master_node_id> :將當前從節點設定為 node_id 指定的master節點的slave節點。只能針對slave節點操作。
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)。

cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。
cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵 。

二、叢集中Master的下線及恢復
1)Master下線後,其對應的Slaver節點會自動變為Master節點,如下截圖:

2)原來的Master重啟後變成Slaver節點,並是原來Master節點的Slaver節點

三,新增節點

1)新配置二個測試節點
# cd /etc/redis  

//新增配置  
# cp redis-6379.conf redis-6378.conf && sed -i "s/6379/6378/g" redis-6378.conf  
# cp redis-6382.conf redis-6385.conf && sed -i "s/6382/6385/g" redis-6385.conf  
  
//啟動  
# redis-server /etc/redis/redis-6385.conf > /var/log/redis/redis-6385.log 2>&1 &  
# redis-server /etc/redis/redis-6378.conf > /var/log/redis/redis-6378.log 2>&1 &  

2)新增主節點
# redis-trib.rb add-node 192.168.10.219:6378 192.168.10.219:6379  
註釋:
192.168.10.219:6378是新增的節點
192.168.10.219:6379叢集任一個舊節點

3)新增從節點
# redis-trib.rb add-node --slave --master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.220:6385 192.168.10.219:6379  
註釋:
--slave,表示新增的是從節點
--master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2,主節點的node id,在這裡是前面新新增的6378的node id
192.168.10.220:6385,新節點
192.168.10.219:6379叢集任一個舊節點

4)重新分配slot
# redis-trib.rb reshard 192.168.10.219:6378               //下面是主要過程  
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 //確認重新分  

新增加的主節點,是沒有slots的,
M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378
slots:0-332,5461-5794,10923-11255 (0 slots) master
主節點如果沒有slots的話,存取資料就都不會被選中。
可以把分配的過程理解成打撲克牌,all表示大家重新洗牌;輸入某個主節點的node id,然後在輸入done的話,就好比從某個節點,抽牌。

5)檢視一下,叢集情況
[root@slave2 redis]# redis-trib.rb check 192.168.10.219:6379  
Connecting to node 192.168.10.219:6379: OK  
Connecting to node 192.168.10.220:6385: OK  
Connecting to node 192.168.10.219:6378: OK  
Connecting to node 192.168.10.220:6382: OK  
Connecting to node 192.168.10.220:6383: OK  
Connecting to node 192.168.10.219:6380: OK  
Connecting to node 192.168.10.219:6381: OK  
Connecting to node 192.168.10.220:6384: OK  
>>> Performing Cluster Check (using node 192.168.10.219:6379)  
M: 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 192.168.10.219:6379  
 slots:5795-10922 (5128 slots) master  
 1 additional replica(s)  
S: 9c240333476469e8e2c8e80b089c48f389827265 192.168.10.220:6385  
 slots: (0 slots) slave  
 replicates 03ccad2ba5dd1e062464bc7590400441fafb63f2  
M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378  
 slots:0-332,5461-5794,10923-11255 (1000 slots) master  
 1 additional replica(s)  
M: 19b042c17d2918fade18a4ad2efc75aa81fd2422 192.168.10.220:6382  
 slots:333-5460 (5128 slots) master  
 1 additional replica(s)  
M: b2c50113db7bd685e316a16b423c9b8abc3ba0b7 192.168.10.220:6383  
 slots:11256-16383 (5128 slots) master  
 1 additional replica(s)  
S: 6475e4c8b5e0c0ea27547ff7695d05e9af0c5ccb 192.168.10.219:6380  
 slots: (0 slots) slave  
 replicates 19b042c17d2918fade18a4ad2efc75aa81fd2422  
S: 1ee01fe95bcfb688a50825d54248eea1e6133cdc 192.168.10.219:6381  
 slots: (0 slots) slave  
 replicates b2c50113db7bd685e316a16b423c9b8abc3ba0b7  
S: 9a2a1d75b8eb47e05eee1198f81a9edd88db5aa1 192.168.10.220:6384  
 slots: (0 slots) slave  
 replicates 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  
[OK] All nodes agree about slots configuration.  
>>> Check for open slots...  
>>> Check slots coverage...  
[OK] All 16384 slots covered.  

三、手動改變slave從節點所屬的master主節點(一個slave只能屬於一個master,而一個master可以有多個slave)

//檢視一下6378的從節點  
# redis-cli -p 6378 cluster nodes | grep slave | grep 03ccad2ba5dd1e062464bc7590400441fafb63f2  
  
//將6385加入到新的master  
# redis-cli -c -p 6385 -h 192.168.10.220  
192.168.10.220:6385> cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  //新master的node id  
OK  
192.168.10.220:6385> quit  
  
//檢視新master的slave  
# redis-cli -p 6379 cluster nodes | grep slave | grep 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  

四、刪除節點

1)刪除從節點
# redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265'  

2)刪除主節點
如果主節點有從節點,將從節點轉移到其他主節點
如果主節點有slot,去掉分配的slot,然後在刪除主節點
# redis-trib.rb reshard 192.168.10.219:6378                             //取消分配的slot,下面是主要過程  
How many slots do you want to move (from 1 to 16384)? 1000              //被刪除master的所有slot數量  
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378節點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  


新增master節點後,也進行了這一步操作,當時是分配,現在去掉。反著的。
# redis-trib.rb del-node 192.168.10.219:6378 '03ccad2ba5dd1e062464bc7590400441fafb63f2'  

新的master節點被刪除了,這樣就回到了,就是這篇文章開頭,還沒有新增節點的狀態

五、複製遷移

在redis叢集中通過"cluster replicate <master_node_id> "命令可以將一個slave節點重新配置為另外一個master的slave。
注意:這個只是針對slave節點,即登入到slave節點的reids中,執行這個命令。

比如172.16.60.204:7003是172.16.60.202:7000主節點的slave節點,也可以把他設定成172.16.60.205:7004主節點的slave節點。
172.16.60.205:7004主節點的ID是48cbab906141dd26241ccdbc38bee406586a8d03

則操作為
[root@redis-new01 ~]# /data/redis-4.0.6/src/redis-cli -h 172.16.60.204 -c -p 7003 
172.16.60.204:7003> cluster replicate 48cbab906141dd26241ccdbc38bee406586a8d03
OK
172.16.60.204:7003>

這樣172.16.60.204:7003節點就變成了172.16.60.205:7004主節點的slave節點,而不再是172.16.60.202:7000主節點的slave節點!

這樣可以自動的將一個複製節點從一個master下移動到另外一個master下。 這種情況下的複製節點的自動重配置被稱為複製遷移。
複製遷移可以提升系統的可靠性和抗災性。

在某種情況下,你想讓叢集的複製節點從一個master遷移到另一個master的原因可能是:
叢集的抗崩潰能力總是跟叢集中master 擁有的平均slave數量成正比。
比如,如果一個叢集中每個master只有一個slave,當master和slave都掛掉的時候這個叢集就崩潰了。因為此時有一些雜湊槽無法找到了。
雖然網路分裂會把一堆節點從叢集中孤立出來(這樣你一下就會知道叢集出問題了),但是其他的更常見的硬體或者軟體的問題並不會在多臺機器上同時發生,
所以很 可能在你的這個叢集(平均每個master只有一個slave)有一個slave在早上4點掛掉,然後他的master在隨後的早上6點掛掉。這樣依然會 導致叢集崩潰。

可以通過給每個master都再多加一個slave節點來改進系統的可靠性,但是這樣很昂貴。複製遷移允許只給某些master增加slave。比方說你的叢集有20個節點,
10個master,每個master都有1個slave。然後你增加3個 slave到叢集中並把他們分配給某幾個master節點,這樣某些master就會擁有多於1個slave。

當某個 master失去了slave的時候,複製遷移可以將slave節點從擁有富餘slave的master旗下遷移給沒有slave的master。所以當 你的slave在早上4點掛掉的時候,
另一個slave會被遷移過來取代它的位置,這樣當master節點在早上5點掛掉的時候,依然有一個slave可 以被選舉為master,叢集依然可以正常執行。

所以簡而言之,關於複製遷移應該注意下面幾個方面:
-  叢集在遷移的時候會嘗試去遷移擁有最多slave數量的master旗下的slave。
-  想利用複製遷移特性來增加系統的可用性,你只需要增加一些slave節點給單個master(哪個master節點並不重要)。
-  複製遷移是由配置項cluster-migration-barrier控制的

六、升級節點

升級從伺服器節點很簡單,因為你只需要停止節點然後用已更新的Redis版本重啟。如果有客戶端使用從伺服器節點分離讀請求,它們應該能夠在某個節點
不可用時重新連線另一個從伺服器。
    
升級主伺服器要稍微複雜一些,建議的步驟是:
1)使用cluster failover來觸發一次手工故障轉移主伺服器(請看本文件的手工故障轉移小節)。
2)等待主伺服器變為從伺服器。
3)像升級從伺服器那樣升級這個節點。
4)如果你想讓你剛剛升級的節點成為主伺服器,觸發一次新的手工故障轉移,讓升級的節點重新變回主伺服器。

可以按照這些步驟來一個節點一個節點的升級,直到全部節點升級完畢。

目前redis cluster叢集的啟動只能空節點啟動,當節點有資料時會有err警告,但是隻要進行fix就好了 redis-trib.rb fix 用這個命令修復下就OK了。

七、Redis快取清理

1)登陸redis
# src/redis-cli -c -h 192.168.1.100 -p 6379

2)執行:
192.168.1.100:6379> dbsize

3)
192.168.1.100:6379> flushall

================================================================
redis叢集指定key值得快取清理:
1)登入至指定埠的redis伺服器
# src/redis-cli -c -h 192.168.1.100 -p 6379

2)檢視所有key值 (或者使用info命令也能檢視出來)
keys *

3)刪除指定索引的值
del key

相關文章