????????Redis3.0以后的版本雖然有了集群功能,提供了比之前版本的哨兵模式更高的性能與可用性,但是集群的水平擴展卻比較麻煩,今天就來帶大家看看redis高可用集群如何做水平擴展,原始集群(見下圖)由6個節點組成,6個節點分布在三臺機器上,采用三主三從的模式
1、啟動集群
# 啟動整個集群
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8006/redis.conf
# 客戶端連接8001端口的redis實例
/usr/local/redis-5.0.3/src/redis-cli -a zhuge -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),增加節點后的集群參見下圖,新增節點用虛線框表示
-
增加redis實例
# 在/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/# 修改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# 啟動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
-
查看redis集群的命令幫助
cd /usr/local/redis-5.0.3
src/redis-cli --cluster help
1.create:創建一個集群環境host1:port1 ... hostN:portN
2.call:可以執行redis命令
3.add-node:將一個節點添加到集群里,第一個參數為新節點的ip:port,第二個參數為集群中任意一個已經存在的節點的ip:port
4.del-node:移除一個節點
5.reshard:重新分片
6.check:檢查集群狀態
-
配置8007為集群主節點
# 使用add-node命令新增一個主節點8007(master),前面的ip:port為新增節點,后面的ip:port為已知存在節點,看到日志最后有"[OK] New node added correctly"提示代表新節點加入成功
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --cluster add-node 192.168.0.61:8007 192.168.0.61:8001
# 查看集群狀態
/usr/local/redis-5.0.3/src/redis-cli -a zhuge -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes
注意:當添加節點成功以后,新增的節點不會有任何數據,因為它還沒有分配任何的slot(hash槽),我們需要為新節點手工分配hash槽
# 使用redis-cli命令為8007分配hash槽,找到集群中的任意一個主節點,對其進行重新分片工作。
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --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確認開始執行分片任務)
... ...
# 查看下最新的集群狀態
/usr/local/redis-5.0.3/src/redis-cli -a zhuge -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes
如上圖所示,現在我們的8007已經有hash槽了,也就是說可以在8007上進行讀寫數據啦!到此為止我們的8007已經加入到集群中,并且是主節點(Master)
-
配置8008為8007的從節點
# 添加從節點8008到集群中去并查看集群狀態
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --cluster add-node 192.168.0.61:8008 192.168.0.61:8001
如圖所示,還是一個master節點,沒有被分配任何的hash槽。
# 我們需要執行replicate命令來指定當前節點(從節點)的主節點id為哪個,首先需要連接新加的8008節點的客戶端,然后使用集群命令進行操作,把當前的8008(slave)節點指定到一個主節點下(這里使用之前創建的8007主節點)
/usr/local/redis-5.0.3/src/redis-cli -a zhuge -c -h 192.168.0.61 -p 8008
192.168.0.61:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 #后面這串id為8007的節點id
# 查看集群狀態,8008節點已成功添加為8007節點的從節點
-
?刪除8008從節點
# 用del-node刪除從節點8008,指定刪除節點ip和端口,以及節點id(紅色為8008節點id)
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --cluster del-node 192.168.0.61:8008 a1cfe35722d151cf70585cee21275565393c0956
# 再次查看集群狀態,如下圖所示,8008這個slave節點已經移除,并且該節點的redis服務也已被停止
-
刪除8007主節點
????????最后,我們嘗試刪除之前加入的主節點8007,這個步驟相對比較麻煩一些,因為主節點的里面是有分配了hash槽的,所以我們這里必須先把8007里的hash槽放入到其他的可用主節點中去,然后再進行移除節點操作,不然會出現數據丟失問題(目前只能把master的數據遷移到一個節點上,暫時做不了平均分配功能),執行命令如下:
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --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槽了,證明遷移成功!
# 最后我們直接使用del-node命令刪除8007主節點即可
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --cluster del-node 192.168.0.61:8007 2728a594a0498e98e4b83a537e19f9a0a3790f38