天天看點

Redis高可用叢集之水準擴充

作者:強函數

Redis叢集是一個由多個主從節點群組成的分布式伺服器群,它具有複制、高可用和分片等特性,叢集模式沒有中心節點,可水準擴充,根據官方文檔稱可以線性擴充到上萬個節點(官方推薦不超過1000個節點),但是水準擴充相對比較麻煩,接下來帶大家看看如何做Redis高可用叢集水準擴充。

原叢集由6個Redis節點組成,分布在三台機器上,采用三主(master)三從(slave)的模式:

IP為192.168.1.6的機器Redis執行個體分别為,master:6380;slave:6379。

IP為192.168.1.7的機器Redis執行個體分别為,master:6381;master:6382。

IP為192.168.1.8的機器Redis執行個體分别為,master:6383;slave:6384。

接下來做Redis高可用叢集水準擴充,在IP為192.168.1.6的機器上建立兩個Redis執行個體,水準擴充之後變成四主(master)四從(slave)的叢集模式,如下圖:

Redis高可用叢集之水準擴充

1.通過用戶端連接配接Redis執行個體

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

2.檢視叢集狀态

192.168.1.6:6379>cluster nodes
Redis高可用叢集之水準擴充

從叢集結果中可以看出整個redis叢集運作正常,三個master主節點和三個slave從節點,主節點master配置設定了存儲資料的hash槽位, 而slave節點是每個主節點的備份從節點,不顯示存儲槽位。

3.水準擴充叢集操作

3.1 建立一主(master)一從(slave)Redis執行個體

cd /usr/local/redis/etc

#複制配置檔案

cp redis-6380.conf redis-6385.conf

cp redis-6380.conf redis-6386.conf

#修改配置檔案

vim redis-6385.conf

#端口号

port 6385

#pidfile的路徑

pidfile /usr/local/redis/logs/redis-6385.pid

#日志檔案的路徑

logfile /usr/local/redis/logs/redis-6385.log

#持久化資料存放的目錄

dir /usr/local/redis/data/6385/

#叢集節點資訊檔案,最好與port端口對應

cluster‐config‐file nodes‐6385.conf

配置檔案redis-6386.conf和Redis執行個體6385修改方法一樣。

3.2 啟動新增的兩個Redis執行個體并檢視

cd /usr/local/redis/bin

#啟動Redis執行個體

./redis-server /usr/local/redis/etc/redis-6385.conf

./redis-server /usr/local/redis/etc/redis-6386.conf

#檢視服務狀态

ps -ef|grep redis

Redis高可用叢集之水準擴充

3.3 檢視Redis叢集指令幫助

/usr/local/redis/bin/redis-cli --cluster help
Redis高可用叢集之水準擴充

幫助說明如下:

create:建立一個叢集環境host1:port1 ... hostN:portN。

check:檢查叢集狀态。

reshard:叢集環境重新分片。

rebalance:平衡叢集節點slot數量。

add-node:将一個節點添加到叢集裡,參數:new_host:new_port existing_host:existing_port,第一個參數為新節點(new_host)的ip:port,第二個參數為叢集中任意一個已經存在的節點(existing_host)的ip:port。

del-node:移除一個節點。

call:可以執行redis指令。

3.4 配置Redis執行個體6385為叢集主節點

#使用指令add-node新增一個主節點6385。

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6385 192.168.1.6:6380

Redis高可用叢集之水準擴充

#檢視叢集狀态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

192.168.1.6:6379>cluster nodes

Redis高可用叢集之水準擴充

當新節點加入叢集後,節點沒有任何資料,因為它還沒有配置設定存儲hash槽位(slot),需要手工為新節點配置設定hash槽位。

#使用指令reshard重新為節點配置設定槽位

/usr/local/redis/bin/redis‐cli ‐a 123456 ‐‐cluster reshard 192.168.1.6:6380

Redis高可用叢集之水準擴充

3.5 配置Redis執行個體6386為主節點6386的從節點

#将redis執行個體6386節點添加到叢集中

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6386 192.168.1.6:6380

Redis高可用叢集之水準擴充

#檢視叢集狀态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用叢集之水準擴充

已經成功将redis執行個體6386添加到叢集,并且還是master,還沒有配置設定hash槽位。

#通過執行replicate指令來指定目前從節點的主節點為哪個,首先需要連接配接新加的6386節點的用戶端,然後使用叢集指令進行操作,把目前的6386(master)節點指定到一個主節點6385(master)下成為從節點。

#連接配接用戶端

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6386

#執行replicate指令來指定

192.168.1.6:6386> cluster replicate 6a14670fcf844b7ea35177a40b49ea50e36286fe

Redis高可用叢集之水準擴充

至此Redis高可用叢集水準擴充完成。

4.水準擴充叢集删除操作

4.1.先删除從節點

#通過指令del-node先删除從節點6386,指定删除節點ip和端口,以及節點id

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6386 58ddf8c9ff21225dea479f3cc1b158ed78b00829

Redis高可用叢集之水準擴充

#檢視叢集狀态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用叢集之水準擴充

redis從節點6385已經移除,并且該節點的redis服務已經停止服務。

4.2.最後删除主節點

#删除主節點相對麻煩,因為主節點裡配置設定了hash槽位,先要把主節點裡的hash槽位移除到其他可用的主節點中去,然後再進行移除節點,不然會出現資料丢失問題

/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.1.6:6385

操作如下:

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

#遷移量

How many slots do you want to move (from 1 to 16384)? 900

#需要把資料遷移到那個可用的主節點id(6380)

What is the receiving node ID? 5d25be4b68237e66b78b50f712a9bb410a3dde60

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.

#資料源節點ID(6385)

Source node #1: 6a14670fcf844b7ea35177a40b49ea50e36286fe

Source node #2: done

Do you want to proceed with the proposed reshard plan (yes/no)? yes

#檢視叢集狀态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用叢集之水準擴充

通過上圖可以看出已經成功的把主節點6385的資料遷移到6380上去了,6385節點已經沒有任何hash槽了,證明遷移成功!

#通過指令del-node删除6385主節點

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6385 6a14670fcf844b7ea35177a40b49ea50e36286fe

Redis高可用叢集之水準擴充

#檢視叢集狀态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用叢集之水準擴充

#平衡叢集節點slot數量

/usr/local/redis/bin/redis-cli -a 123456 --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 192.168.1.6:6380

Redis高可用叢集之水準擴充

話說一招回到解放前,但是Redis高可用叢集水準擴充比較麻煩,删除水準擴充的節點同樣比較麻煩,因為存在節點資料遷移,不然會存在資料丢失問題。

繼續閱讀