上一篇 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 實例已經加入到集群中,作為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

刪除 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




將 redis 從 redis cluster 集群中移除
redis-trib.rb del-node 192.168.43.16:7001 cc9ef42e215c5cc1c8cf37acde4946997620f003


自動化 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 實例的主從信息

kill 進程 和 rm -rf /var/ run/redis_7006.pid,如下圖:

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

從上圖結合前面的集群狀態信息,可以看出redis cluster 自動的將 7001 中多余的slave 遷移到了 7003 上。
當再度將7006 redis 實例啟動后,7003 master 就會有2個slave 了。

總結:在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以上版本。
問題尚未解決!