Redis3.0之後的版本雖然有了集羣功能,提供了比以前版本的哨兵模式更高的性能與可用性,可是集羣的水平擴展卻比較麻煩,今天就來帶你們看看redis高可用集羣如何作水平擴展,原始集羣(見下圖)由6個節點組成,且6個節點都在一臺機器上(ip爲192.168.0.61),採用僞分佈式的三主三從模式,集羣搭建方法請參考<輕鬆搭建Redis緩存高可用集羣>node
redis
# 啓動整個集羣 /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點是每一個主節點的備份從節點,不顯示存儲槽位vim
咱們在原始集羣基礎上再增長一主(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
cd /usr/local/redis-3.0.0/src redis-trib.rb
1.create:建立一個集羣環境host1:port1 ... hostN:portNbash
2.call:能夠執行redis命令微信
3.add-node:將一個節點添加到集羣裏,第一個參數爲新節點的ip:port,第二個參數爲集羣中任意一個已經存在的節點的ip:port分佈式
4.del-node:移除一個節點性能
5.reshard:從新分片學習
6.check:檢查集羣狀態spa
# 使用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)
# 添加從節點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的從節點
# 用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服務也已被中止
最後,咱們嘗試刪除以前加入的主節點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)? Yes
(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
# 查看集羣狀態,一切還原爲集羣最初狀態啦!大功告成!
更多關於Redis深刻學習的文章請掃描下方二維碼關注微信公號「輕風吟」