在這篇文章中,我們將揭示Redis集群的擴容和縮容操作,讓您的Redis集群發揮最佳性能和可伸縮性。通過增加主節點和從節點,並將它們無縫添加到集群中,您將能夠輕鬆擴展您的Redis集群以滿足不斷增長的需求。同時,我們還將探討如何進行縮容操作,即刪除節點,以優化集群資源的利用。無論您是初學者還是經驗豐... ...
擴展集群操作
擴容
在我們原始的集群基礎上,我們決定增加一臺主節點(8007)和一臺從節點(8008),這樣新增的節點將會在下圖中以虛線框的形式顯示在集群中。
1: 首先,在 /usr/local/redis-cluster 目錄下創建兩個文件夾,分別命名為 8007 和 8008。接下來,將 8001 文件夾下的 redis.conf 文件複製到 8007 和 8008 這兩個文件夾中。
mkdir 8007 8008
cd 8001
cp redis.conf /usr/local/redis‐cluster/8007/
cp redis.conf /usr/local/redis‐cluster/8008/
2: 為了修改 8007 文件夾下的 redis.conf 配置文件,可以按照以下步驟進行操作:
vim /usr/local/redis‐cluster/8007/redis.conf
# 修改如下內容:
port:8007
dir /usr/local/redis‐cluster/8007/
cluster‐config‐file nodes‐8007.conf
# 修改8008文件夾下的redis.conf配置文件
vim /usr/local/redis‐cluster/8008/redis.conf
# 修改內容如下:
port:8008
dir /usr/local/redis‐cluster/8008/
cluster‐config‐file nodes‐8008.conf
3: 啟動 8007 和 8008 兩個服務並查看它們的狀態
/usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/8007/redis.conf
/usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/8008/redis.conf
ps ‐el | grep redis
4: 查看redis集群的命令幫助
cd /usr/local/redis‐5.0.3
src/redis‐cli ‐‐cluster help
- create:用於創建一個集群環境,需要指定主機和埠號,例如:create host1:port1 ... hostN:portN。
- call:用於執行Redis命令,可以在集群中的任意一個節點上執行,例如:call
。 - add-node:用於將新的節點添加到集群中,需要提供新節點的IP和埠號,以及集群中任意一個已經存在的節點的IP和埠號作為參數,例如:add-node <new_node_ip:port> <existing_node_ip:port>。
- del-node:用於移除集群中的一個節點,需要指定要移除的節點的IP和埠號作為參數,例如:del-node <node_ip:port>。
- reshard:用於重新分片,可以根據需要重新分配集群中的槽位。
- check:用於檢查集群的狀態,可以獲取當前集群的信息和狀態。
5: 配置8007為集群主節點
使用add-node命令新增一個主節點8007(master)。新增節點的ip:port應該放在命令的前面,已知存在節點的ip:port應該放在命令的後面。當你在日誌的最後看到[OK] New node added correctly這個提示時,代表新節點加入成功。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster add‐node 192.168.0.61:8007 192.168.0.61:8001
6: 查看集群狀態
192.168.0.61:8001> /usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8001
192.168.0.61:8001> cluster nodes
請註意:當成功添加節點後,新增的節點將不包含任何數據,因為它尚未分配任何哈希槽。因此,我們需要手動為新節點分配哈希槽。
7: 我將使用redis-cli命令為8007分配hash槽,並找到集群中的任意一個主節點,然後對該主節點進行重新分片工作。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster reshard 192.168.0.61:8001
輸出如下:
... ...
How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少個槽移動到新的節點上,自己設置,比如600個hash槽)
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把這600個hash槽移動到哪個節點上去,需要指定節點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
(ps:輸入all為從所有主節點(8001,8002,8003)中分別抽取相應的槽數指定到新節點中,抽取的總槽數為600個)
... ...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:輸入yes確認開始執行分片任務)
... ...
8: 查看下最新的集群狀態
192.168.0.61:8001> /usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8001
192.168.0.61:8001> cluster nodes
如上圖所示,我們可以得出結論:在集群中,我們已經成功為8007分配了hash槽,這意味著我們可以在8007上進行數據的讀寫操作了!因此,我們可以確認8007已經成功加入到集群中,並且作為一個主節點(Master)存在。
9: 配置8008為8007的從節點
添加從節點8008到集群中去並查看集群狀態
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster add‐node 192.168.0.61:8008 192.168.0.61:8001
如圖所示,還是一個master節點,沒有被分配任何的hash槽。
10: 為了將當前的8008節點作為從節點(slave)指向之前創建的8007主節點,我們需要執行replicate命令。首先,我們需要連接到8008節點的客戶端,然後使用集群命令來執行操作。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8008
192.168.0.61:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 #後面這串id為8007的節點id
查看下目前的集群狀態,8008節點已成功添加為8007節點的從節點了
縮容
1: 刪除8008從節點
請使用del-node命令來刪除節點8008。指定節點的IP地址為[IP地址],埠為[埠號],節點ID為[8008]。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster del‐node 192.168.0.61:8008 a1cfe35722d151cf70585cee21275565393c0956
再次使用cluster nodes命令查看集群狀態。根據下圖所示,可以看到已成功移除節點8008,而且該節點的redis服務也已經停止。
2: 刪除8007主節點
最後,我們嘗試刪除之前加入的主節點8007。這個步驟相對比較麻煩一些,因為主節點裡面分配了hash槽。因此,我們必須先將8007里的hash槽放入其他可用主節點中,然後再進行移除節點操作,以避免數據丟失問題。目前只能將master的數據遷移到一個節點上,暫時無法實現平均分配功能。執行命令如下:
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster reshard 192.168.0.61:8007
輸出如下:
... ...
How many slots do you want to move (from 1 to 16384)? 600
What is the receiving node ID? dfca1388f124dec92f394a7cc85cf98cfa02f86f
(ps:這裡是需要把數據移動到哪?8001的主節點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:2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:這裡是需要數據源,也就是我們的8007節點id)
Source node 2:done
(ps:這裡直接輸入done 開始生成遷移計劃)
... ...
Do you want to proceed with the proposed reshard plan (yes/no)? Yes
(ps:這裡輸入yes開始遷移)
至此,我們已經成功將主節點8007的數據遷移到8001上。現在,讓我們來查看一下集群的當前狀態,如下圖所示。你會註意到,8007下麵已經沒有任何hash槽了,這證明遷移已經成功完成!
3: 最後,我們可以直接使用del-node命令刪除8007主節點。這樣就可以完全移除該節點了。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster del‐node 192.168.0.61:8007 2728a594a0498e98e4b83a537e19f9a0a3790f38
現在,讓我們來查看一下集群的當前狀態,你會發現一切都已經還原到最初的狀態了!這代表我們的工作取得了巨大的成功,大功告成!
總結
通過本文,我們學習瞭如何擴展和縮容Redis集群。擴容操作包括增加新的主節點和從節點,並將它們添加到集群中。我們首先創建了新的文件夾,並將原始節點的配置文件複製到新的文件夾中。然後,我們修改了新節點的配置文件,指定新的埠和目錄。接下來,我們啟動了新的節點,並使用redis-cli命令添加新的主節點和從節點到集群中。為了確保新節點成功加入集群,我們手動為它們分配了hash槽。最後,我們查看了集群狀態,確保所有操作都成功完成。
縮容操作涉及刪除節點。我們首先使用del-node命令從集群中刪除從節點,並查看集群狀態以確認節點已成功刪除。然後,我們嘗試刪除主節點,這需要先將其hash槽遷移到其他節點上,然後再刪除主節點。我們使用reshard命令將主節點的hash槽遷移到其他主節點上,並查看集群狀態以確認遷移成功。最後,我們使用del-node命令刪除主節點,並再次查看集群狀態以確認節點已成功刪除。
通過學習擴展和縮容操作,我們可以更好地管理和優化Redis集群,提高其性能和可伸縮性。