Redis叢集水平擴充套件(二)
原始叢集(見下圖)由6個節點組成,且6個節點都在一臺機器上(ip為192.168.0.61),採用偽分散式的三主三從模式。
1、啟動叢集
# 啟動整個叢集 /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8001/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8002/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8003/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8004/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8005/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8006/redis.conf # 客戶端連線8001埠的redis例項 /usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 8001 # 檢視叢集狀 /usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 8001 192.168.0.61:8001> cluster nodes
從上圖可以看出,整個叢集執行正常,三個master節點和三個slave節點,8001埠的例項節點儲存0-5460這些hash槽,8002埠的例項節點儲存5461-10922這些hash槽,8003埠的例項節點儲存10923-16383這些hash槽,這三個master節點儲存的所有hash槽組成redis叢集的儲存槽位,slave點是每個主節點的備份從節點,不顯示儲存槽位
2、叢集操作
我們在原始叢集基礎上再增加一主(8007)一從(8008),增加節點後的叢集參見下圖,新增節點用虛線框表示
1)增加redis例項8007和8008
# 在/usr/local/redis-cluster下建立8007和8008資料夾,並拷貝8001資料夾下的redis.conf檔案到8007和8008這兩個資料夾下 mkdir 8007 mkdir 8008 cd 8001 cp redis.conf /usr/local/redis-cluster/8007/ cp redis.conf /usr/local/redis-cluster/8008/ # 修改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 nodes8008.conf # 啟動8007和8008倆個服務並檢視服務狀態 /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8007/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/8008/redis.conf ps -el | grep redis
2)檢視redis-trib命令幫助
cd /usr/local/redis-3.0.0/src redis-trib.rb
1、create:建立一個叢集環境host1:port1 ... hostN:portN
2、call:可以執行redis命令
3、add-node:將一個節點新增到叢集裡,第一個引數為新節點的ip:port,第二個引數為叢集中任意一個已經存在的節點的ip:port
4、del-node:移除一個節點
5、reshard:重新分片
6、check:檢查叢集狀態
3)配置8007為叢集主節點
# 使用add-node命令新增一個主節點8007(master),綠色為新增節點,紅色為已知存在節點,看到日誌最後有"[OK] New node added correctly"提示代表新節點加入成功 /usr/local/redis-3.0.0/src/redis-trib.rb add-node 192.168.0.61:8007 192.168.0.61:8001
檢視叢集狀態
注意:當新增節點成功以後,新增的節點不會有任何資料,因為它還沒有分配任何的slot(hash槽),我們需要為新節點手工分配hash槽
# 使用redis-trib命令為8007分配hash槽,找到叢集中的任意一個主節點(紅色位置表現叢集中的任意一個主節點),對其進行重新分片工作。 /usr/local/redis-3.0.0/src/redis-trib.rb 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? eb57a5700ee6f9ff099b3ce0d03b1a50ff247c3c
(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確認開始執行分片任務)
... ......
檢視最新的叢集狀態
如上圖所示,現在我們的8007已經有hash槽了,也就是說可以在8007上進行讀寫資料啦!到此為止我們的8007已經加入到叢集中,並且是主節點(Master)
4)配置8008為8007的從節點
# 新增從節點8008到叢集中去並檢視叢集狀態 /usr/local/redis-3.0.0/src/redis-trib.rb add-node 192.168.0.61:8008 192.168.0.61:8001
如圖所示,還是一個master節點,沒有被分配任何的hash
我們需要執行replicate命令來指定當前節點(從節點)的主節點id為哪個,首先需要連線新加的8008節點的客戶端,然後使用叢集命令進行操作,把當前的8008(slave)節點指定到一個主節點下(這裡使用之前建立的8007主節點,紅色表示節點id)
/usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 8008 192.168.0.61:8008> cluster replicate eb57a5700ee6f9ff099b3ce0d03b1a50ff247c3c
檢視叢集狀態,8008節點已成功新增為8007的從節點
5)刪除8008從節點
# 用del-node命令刪除從節點8008,指定刪除節點ip和埠,以及節點id(紅色為8008節點id) /usr/local/redis-3.0.0/src/redis-trib.rb del-node 192.168.0.61:8008 1805b6339d91b0e051f46845eebacb9bc43baefe
再次檢視叢集狀態,如下圖所示,8008這個slave節點已經移除,並且該節點的redis服務也已被停止
6)刪除8007主節點
最後,我們嘗試刪除之前加入的主節點8007,這個步驟相對比較麻煩一些,因為主節點的裡面是有分配了hash槽的,所以我們這裡必須先把8007裡的hash槽放入到其他的可用主節點中去,然後再進行移除節點操作,不然會出現資料丟失問題(目前只能把master的資料遷移到一個節點上,暫時做不了平均分配功能),執行命令
/usr/local/redis-3.0.0/src/redis-trib.rb reshard 192.168.0.61:8007
輸出如下:
... ...
How many slots do you want to move (from 1 to 16384)? 599
(ps:這裡不會是正好600個槽)
What is the receiving node ID? deedad3c34e8437baa6ff013fd3d1461a0c2e761
(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:eb57a5700ee6f9ff099b3ce0d03b1a50ff247c3c
(ps:這裡是需要資料來源,也就是我們的8007節點id)
Source node 2: done
(ps:這裡直接輸入done 開始生成遷移計劃)
... ...
Do you want to proceed with the proposed reshard plan (yes/no)? y es
(ps:這裡輸入yes開始遷移)
至此,我們已經成功的把8007主節點的資料遷移到8001上去了,我們可以看一下現在的叢集狀態如下圖,你會發現8007下面已經沒有任何hash槽了,證明遷移成功!
# 最後我們直接使用del-node命令刪除8007主節點即可(紅色表示8007的節點id)。 /usr/local/redis-3.0.0/src/redis-trib.rb del-node 192.168.0.61:8007 eb57a5700ee6f9ff099b3ce0d03b1a50ff247c3c
檢視叢集狀態,一切還原為叢集最初狀態啦!大功告成!
參考連線: