redis專題:redis集羣的動態擴容縮容,水平擴展

 

 

 

1. 擴容背景介紹

        在電商項目雙11期間,一般有更多的併發,對redis的請求壓力激增,須要更多的redis對外提供服務,可是過了雙11,redis壓力驟降,爲了節省成本,須要撤出部分redis服務!咱們能夠經過增長和刪除redis集羣節點來實現redis集羣的動態擴容、縮容,增長redis集羣的高可用性。node

原始集羣(見下圖)由6個節點組成,6個節點分佈在三臺機器上(本案例僅在一臺機器演示!),採用三主三從的模式
在這裏插入圖片描述
爲了模擬集羣擴容,咱們在原始集羣基礎上再增長一主(8007)一從(8008),增長節點後的集羣參見下圖,新增節點用虛線框表示
在這裏插入圖片描述redis

在集羣擴容以前,咱們須要啓動原redis集羣,並觀察集羣狀態是否正常,若是正常纔可進行擴容、縮容。點此處查看如何 配置和啓動redis集羣!vim

啓動成功後經過cluster nodes命令查看節點狀態
在這裏插入圖片描述
         從上圖能夠看出,整個集羣運行正常,三個master節點和三個slave節點,8001端口的實例節點存儲0-5460這些hash槽,8002端口的實例節點存儲5461-10922這些hash槽,8003端口的實例節點存儲10923-16383這些hash槽,這三個master節點存儲的全部hash槽組成redis集羣的存儲槽位,slave點是每一個主節點的備份從節點,不顯示存儲槽位!併發

2. redis集羣擴容

        原集羣啓動並確認健康後,咱們在原始集羣基礎上再增長一主(8007)一從(8008),實現集羣擴容,步驟以下:ide

2.1 增長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
pidfile /var/run/redis_8007.pid


# 修改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
pidfile /var/run/redis_8008.pid


# 啓動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

啓動完成後,8007 和 8008 兩個節點還處於遊離狀態,還未加入redis集羣中!3d

 

2.2 配置8007爲master節點

使用redis-cli的add-node命令新增一個主節點8007(master),前面的ip:port爲新增節點,後面的ip:port爲集羣中已存在的節點。日誌

src/redis-cli --cluster add-node 192.168.100.100:8007 192.168.100.100:8001

這個過程是經過gossip協議的meet命令進行操做的!code

meet:某個節點發送meet給新加入的節點,讓新節點加入集羣中,而後新節點就會開始與其餘節點進行通訊;

最後看到日誌最後有"[OK] New node added correctly"提示表明新節點加入成功
在這裏插入圖片描述server

添加成功後經過cluster nodes命令查看節點狀態以下
在這裏插入圖片描述
注意:當添加節點成功之後,新增的節點不會有任何數據,由於它尚未分配任何的slot(hash槽),咱們須要爲新節點手工分配hash槽。使用redis-cli的rehash命令爲8007分配hash槽,找到集羣中的任意一個主節點,對其進行從新分片工做。

src/redis-cli --cluster reshard 192.168.100.100: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確認開始執行分片任務)
... ...

槽位分配完成後,再次經過cluster nodes命令查看節點狀態以下:
在這裏插入圖片描述
注意:槽位遷移後,對應槽位中的數據也會遷移!

至此!8007master節點加入集羣成功!

 

2.3 配置8008爲8007的從節點

重複8007節點加入集羣命令add-node

src/redis-cli --cluster add-node 192.168.100.100:8008 192.168.100.100:8001

經過cluster nodes命令查看節點狀態
在這裏插入圖片描述
能夠看到,8008一樣是無槽位分配的,但因爲8008節點要做爲8007的從節點,因此不用給8008節點分配槽位。爲8008節點配置主從關係須要鏈接8008節點的客戶端,而後使用集羣命令replicate進行操做,把當前的8008(slave)節點指定到一個主節點下(這裏使用以前建立的8007主節點),命令以下:

# 進入8008的客戶端
[root@CentOS7 redis-6.0.9]# src/redis-cli  -p 8008

# 在8008客戶端下指定8008節點的主從關係
# 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b 是8007節點的id
127.0.0.1:8008> cluster replicate 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b

再經過cluster nodes命令查看節點狀態
在這裏插入圖片描述
能夠看到8008已成爲8007的從節點,完成了集羣節點的擴容!

 

3. redis集羣縮容

redis集羣縮容其實就是刪除某些集羣節點,在這裏咱們經過把上面加入的800七、和8008組成的集羣節點刪除來測試集羣縮容!

3.1 先返還槽位數據

由於主節點8007的裏面是有分配了hash槽的,因此咱們這裏必須先把8007裏的hash槽放入到其餘的可用主節點中去,而後再進行移除節點操做,否則會出現數據丟失問題(目前只能把master的數據遷移到一個節點上,暫時作不了平均分配功能),執行命令以下:

src/redis-cli  --cluster reshard 192.168.100.100:8007

輸入以下:

... ...
How many slots do you want to move (from 1 to 16384)? 600
What is the receiving node ID? baf0c2f3afde2410e34351a8261a703f1394cee9
(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:4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b
(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.2 刪除8007節點

最後咱們直接使用del-node命令刪除8007主節點便可

src/redis-cli  --cluster del-node 192.168.100.100:8007 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b

最後cluster nodes命令查看節點狀態,若是還原如初,則說明縮容成功!

相關文章
相關標籤/搜索