1. 程式人生 > >redis cluster 集群暢談(三) 之 水平擴容、slave自動化遷移

redis cluster 集群暢談(三) 之 水平擴容、slave自動化遷移

fig star init.d 物理 成功 其它 -i .html enabled

  

上一篇 http://www.cnblogs.com/qinyujie/p/9029522.html, 主要講解 實驗多master寫入、讀寫分離、實驗自動故障切換(高可用性),那麽本篇我們就來聊了聊redis cluster 水平擴容以及自動化 slave 遷移。

redis repliction 主從架構,一主多從更多的是為了提高 讀QPS 。而 redis cluster 集群中不建議或者沒有說做物理的讀寫分離了,redis cluster 集群更強調的是通過master的水平擴容,來橫向擴展 讀寫QPS,還有支撐更多的 海量數據

下面聊聊 redis cluster 集群如何水平擴容?

註意:水平擴容基於 redis cluster集群部署 基礎上來操作,新加的redis 實例博主就直接在192.168.43.18 機器上做了,真正生產環境應該在獨立機器上部署,具體根據自身公司需求而定,後面就不贅述了。

創建一個新master redis 實例

mkdir -p /var/redis/7007 //redis 的持久化文件地址

修改 redis 實例配置文件 7007.conf

cd /usr/local/redis-3.2.8 && cp redis.conf /etc/redis/7007.conf

port 7007
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7007.conf
cluster-node-timeout 15000
daemonize yes                           
pidfile /var/run/redis_7007.pid                         
dir  /var/redis/7007    
logfile /var/log/redis/7007.log
bind 192.168.43.18  
appendonly yes
修改redis 實例啟動腳本,REDISPORT=7007

cd redis-3.2.8 && cp utils/redis_init_script /etc/init.d/redis_7007 && chmod 777 /etc/init.d/redis_7007 && vim /etc/init.d/redis_7007

啟動7007 redis 實例

./etc/init.d/redis_7007 start

將 7007 redis 實例加入原有 redis cluster 集群中

redis-trib.rb add-node ip1:port ip2:port

ip1:port1: 需要加入redis cluster 中的 redis 實例 ip2:port2 : redis-trib.rb去拿集群狀態數據

redis-trib.rb add-node 192.168.43.18:7007 192.168.43.16:7001

redis-trib.rb check 192.168.43.16:7001 查看集群狀態信息

技術分享圖片 7007 redis 實例加入 redis cluster 集群

通過上圖可以看出,7007 redis 實例已經加入到集群中,作為master,但是我們也可以看到,7007 是沒有slot 的,這就意味著無法存儲數據,因此我們需要將其他master 中的部分 slot 遷移到7007 redis 上。怎麽做呢 ?

reshard slot 到 7007 redis

那需要遷移多少的slot 到 7007 redis 呢?

slot ( 4096 ) = 16384 / master 個數(4)

遷移slot

redis-trib.rb reshard 192.168.43.16:7001

技術分享圖片 遷移過程中 技術分享圖片 遷移過程中

然後 yes 即可,下圖表示遷移成功:

技術分享圖片 遷移成功

上面講了新增一個master redis 實例,那麽slave redis 實例又如何加入到集群中呢?

創建一個新slave redis (7008)實例

方法和上面創建一個新master redis 實例一樣,實例配置啟動後,就要加入到集群中了。

7008 slave redis 實例加入 redis cluster 集群

redis-trib.rb add-node --slave --master-id ID ip1:port1 ip2:port2
ID : master redis 實例ID ip1:port1: 需要加入redis cluster 中的 redis 實例 ip2:port2 : redis-trib.rb去拿集群狀態數據
下面將7008 redis 作為 7001 master redis 的 slave 中(特意放到 7001 master 為下面 slave自動化遷移做準備),如下圖:

redis-trib.rb add-node --slave --master-id a65e04974f47d110158a33c54c75ad8239fa6b10 192.168.43.18:7008 192.168.43.16:7001

技術分享圖片 加入slave

刪除 redis 實例

將某個 redis 實例從集群中移除,當先用resharding將數據都移除到其他節點,確保node為空之後,才能執行remove操作,當你清空了一個master的 hash slot 時,redis cluster就會自動將其slave掛載到其他master上去,這個時候只需要刪除掉master就可以了

當要刪除的redis node 為master 時,先講hash slot 遷移到其他三個master 中,

master1 slot(1365) + master2 slot(1365) + master3 slot(1366) = master4 slot(4096)

根據上面,需要分三次遷移,兩次遷移1365,一次1366 到其他master 節點中

redis-trib.rb reshard 192.168.43.16:7001

技術分享圖片 遷移中 技術分享圖片 遷移中 技術分享圖片 遷移中 技術分享圖片 slot 遷移完畢
將 redis 從 redis cluster 集群中移除

redis-trib.rb del-node 192.168.43.16:7001 cc9ef42e215c5cc1c8cf37acde4946997620f003

技術分享圖片 移除node 技術分享圖片 移除的node 已經shutdown

自動化 slave 遷移

如果說redis cluster 集群本身就具備高可用性,那麽當 6個節點,3 master 3 slave,當出現某個slave 宕機了,那麽就只有master了,這時候的高可用性就無法很好的保證了,萬一master 也宕機了,咋辦呢? 針對這種情況,如果說其他有多余的slave ,集群自動把多余的slave 遷移到 沒有slave 的master 中,那就好了,就可以說具備很好的高可用性了,沒錯,redis cluster 就是這麽NB,redis cluster 就支持自動化slave 遷移。下面我們演示下吧。

看下現在的集群狀態,如下圖:

技術分享圖片 集群狀態

上圖可以看到,7001 master 上有 2 slave 。

這時候我們將192.168.43.17:7003 master 的 slave kill 掉:

info Replication //查看redis 實例的主從信息

技術分享圖片 查看7003 master 的 slave
kill 進程 和 rm -rf /var/ run/redis_7006.pid,如下圖:
技術分享圖片 kill 7006 redis

再次看現在的集群狀態,如下圖:

技術分享圖片 集群狀態變化

從上圖結合前面的集群狀態信息,可以看出redis cluster 自動的將 7001 中多余的slave 遷移到了 7003 上。

當再度將7006 redis 實例啟動後,7003 master 就會有2個slave 了。

技術分享圖片 7006 redis 啟動後

總結:在redis cluster 集群中,如果某個master 下沒有了slave ,其他master 中有多余的slave 的話,集群會自動slave 遷移,由此可以見,可以利用該特性,在生產環境中,適當的添加冗余的slave 實例,可以很大程度上提高集群的高可用性

PS:有的小夥伴可能在做遷移的時候solt不是很好的均勻遷移出去。就像下面這樣 集群狀態會有一個警告,。當你再去做其它遷移solt的時候會不讓你繼續進行下去。

技術分享圖片

通過查資料發現可能是由於redis版本號的問題導致。

redis-server:3.2.8
ruby:2.4.1p111
redis.rb(使用:gem install redis安裝):4.0.0 < - 這是問題的原因

所以有時間再去試試4.0以上版本。

問題尚未解決!

redis cluster 集群暢談(三) 之 水平擴容、slave自動化遷移