1. 程式人生 > >Redis系列(三):Redis叢集的水平擴充套件與伸縮

Redis系列(三):Redis叢集的水平擴充套件與伸縮

一、Redis叢集的水平擴充套件

  Redis3.0版本以後,有了叢集的功能,提供了比之前版本的哨兵模式更高的效能與可用性,但是叢集的水平擴充套件卻比較麻煩,接下來介紹下Redis高可用叢集如何做水平擴充套件,在原叢集的6個節點的基礎上新增2個節點,由原來的3主3從變成4主4從,原先的3主3從部署詳見Redis系列(二):Redis高可用叢集,如下圖:

 二、水平擴充套件具體操作

  ① 將redis-5.0.2資料夾拷貝到新的主機192.168.160.154上去,(1)scp -r /usr/local/redis-5.0.2 [email protected]:/usr/local/ 進去到192.168.160.154主機 (2)cd /usr/local

   ② 新啟動2個redis例項,然後檢查是否啟動成功 (1)/usr/local/redis-5.0.2/bin/redis-server /usr/local/redis-5.0.2/redis-cluster/700*/redis.conf (2)ps -ef | grep redis 檢視是否啟動成功

   ③ 檢視redis叢集的命令幫助 (1)cd /usr/local/redis-5.0.2 (2)bin/redis-cli --cluster help

create:建立一個叢集host1:port1 ... hostN:portN
call:可以執行redis命令
add-node:將一個節點新增到叢集裡,第一個引數為新節點的ip:port,第二個引數為叢集中任意一個已經存在的節點的ip:port
del-node:移除一個節點
reshard:重新分片
check:檢查叢集狀態

  ④ 使用add-node命令新增一個主節點192.168.160.154:7001(master),前面的ip:port為新增節點,後面的ip:port為叢集中已存在節點(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster add-node 192.168.160.154:7001 192.168.160.146:7001

   ⑤(1)連線任意一個客戶端即可:./redis-cli -c -h -p (-a訪問服務端密碼,-c表示叢集模式,指定ip地址和埠號)如:/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* (2)進行驗證: cluster info(檢視叢集資訊)、cluster nodes(檢視節點列表)

   ⑥ 使用redis-cli命令為192.168.160.154:7001分配slots槽位,找到叢集中的任意一個主節點,對其進行重新分片工作。(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster reshard 192.168.160.146:7001

How many slots do you want to move (from 1 to 16384)? 4000
(ps:需要多少個槽移動到新的節點上,自己設定,比如4000個hash槽)
What is the receiving node ID? 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
(ps:把這4000個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為從所有主節點中分別抽取相應的槽數指定到新節點中,抽取的總槽數為4000個;或者輸入原節點ID然後輸入done,意思將輸入的節點ID,抽取的總槽數為4000個)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:輸入yes確認開始執行分片任務)

  ⑦ 檢視下最新的叢集狀態

 

   ⑧ 新增從節點192.168.160.154:7002到叢集中去並檢視叢集狀態

  (1)/usr/local/redis-5.0.2/bin/redis-cli --cluster add-node 192.168.160.154:7002 192.168.160.146:7001

  (2)cluster nodes

  (3)如上圖所示,還是一個master節點,沒有被分配任何的hash槽。我們需要執行replicate命令來指定當前節點(從節點)的主節點id為哪個,首先需要連線新加的192.168.160.154:7002節點的客戶端,然後使用叢集命令進行操作,把當前的192.168.160.154:7002(slave)節點指定到一個主節點下(這裡使用之前建立的192.168.160.154:7001主節點)

  (3-1)/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.154 -p 7002

  (3-2)cluster replicate 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d #後面這串id為192.168.160.154:7001的節點id

   (3-2)cluster nodes

 三、水平伸縮具體操作

  目的還原成原始叢集,如下圖:

   ① 刪除192.168.160.154:7002從節點,用del-node刪除從節點192.168.160.154:7002,指定刪除節點ip和埠,以及節點id(192.168.160.154:7002節點id) 

  (1)/usr/local/redis-5.0.2/bin/redis-cli --cluster del-node 192.168.160.154:7002 564963541c243365cbb20aed69e98048d21d68fd

   (2)cluster nodes

   ② 刪除192.168.160.154:7001主節點,這個步驟相對麻煩一些,因為主節點的裡面是有分配了slots槽位,所以必須先把192.168.160.154:7001裡的slots槽位放入到其他的可用主節點中去,然後再進行移除節點操作,不然會出現資料丟失問題(目前只能把master的資料遷移到一個節點上,暫時做不了平均分配功能)

  (1)/usr/local/redis-5.0.2/bin/redis-cli --cluster reshard 192.168.160.154:7001

How many slots do you want to move (from 1 to 16384)? 4000
(ps:需要多少個槽移動到新的節點上,自己設定,比如4000個hash槽)
What is the receiving node ID? e7f80ba80749904838b6d779a0646e7f22313624
(ps:把這4000個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:44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
Source node 1:done
(ps:輸入all為從所有主節點中分別抽取相應的槽數指定到新節點中,抽取的總槽數為4000個;或者輸入原節點ID然後輸入done,意思將輸入的節點ID,抽取的總槽數為4000個)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:輸入yes確認開始執行分片任務)

  (2)cluster nodes 已經成功的把192.168.160.154:7001主節點的資料遷移到192.168.160.146:7001上去了

    (3)最後我們直接使用del-node命令刪除192.168.160.154:7001主節點即可

 

   (4)最後執行cluster nodes