上一篇 http://www.cnblogs.com/qinyujie/p/9029522.html, 主要講解 實驗多master寫入、讀寫分離、實驗自動故障切換(高可用性),那麼本篇咱們就來聊了聊redis cluster 水平擴容以及自動化 slave 遷移。html
redis repliction 主從架構,一主多從更多的是爲了提升 讀QPS 。而 redis cluster 集羣中不建議或者沒有說作物理的讀寫分離了,redis cluster 集羣更強調的是經過master的水平擴容,來橫向擴展 讀寫QPS,還有支撐更多的 海量數據。java
注意:水平擴容基於 redis cluster集羣部署 基礎上來操做,新加的redis 實例博主就直接在192.168.43.18 機器上作了,真正生產環境應該在獨立機器上部署,具體根據自身公司需求而定,後面就不贅述了。node
mkdir -p /var/redis/7007 //redis 的持久化文件地址redis
cd /usr/local/redis-3.2.8 && cp redis.conf /etc/redis/7007.confvim
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
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_7007ruby
./etc/init.d/redis_7007 start架構
redis-trib.rb add-node ip1:port ip2:portapp
ip1:port1: 須要加入redis cluster 中的 redis 實例 ip2:port2 : redis-trib.rb去拿集羣狀態數據spa
redis-trib.rb add-node 192.168.43.18:7007 192.168.43.16:70013d
redis-trib.rb check 192.168.43.16:7001 查看集羣狀態信息
經過上圖能夠看出,7007 redis 實例已經加入到集羣中,做爲master,可是咱們也能夠看到,7007 是沒有slot 的,這就意味着沒法存儲數據,所以咱們須要將其餘master 中的部分 slot 遷移到7007 redis 上。怎麼作呢 ?
那須要遷移多少的slot 到 7007 redis 呢?
slot ( 4096 ) = 16384 / master 個數(4)
redis-trib.rb reshard 192.168.43.16:7001
而後 yes 便可,下圖表示遷移成功:
上面講了新增一個master redis 實例,那麼slave redis 實例又如何加入到集羣中呢?
方法和上面建立一個新master redis 實例同樣,實例配置啓動後,就要加入到集羣中了。
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 實例從集羣中移除,當先用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-trib.rb del-node 192.168.43.16:7001 cc9ef42e215c5cc1c8cf37acde4946997620f003
若是說redis cluster 集羣自己就具有高可用性,那麼當 6個節點,3 master 3 slave,當出現某個slave 宕機了,那麼就只有master了,這時候的高可用性就沒法很好的保證了,萬一master 也宕機了,咋辦呢? 針對這種狀況,若是說其餘有多餘的slave ,集羣自動把多餘的slave 遷移到 沒有slave 的master 中,那就行了,就能夠說具有很好的高可用性了,沒錯,redis cluster 就是這麼NB,redis cluster 就支持自動化slave 遷移。下面咱們演示下吧。
看下如今的集羣狀態,以下圖:
上圖能夠看到,7001 master 上有 2 slave 。
info Replication //查看redis 實例的主從信息
再次看如今的集羣狀態,以下圖:
從上圖結合前面的集羣狀態信息,能夠看出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以上版本。
問題還沒有解決!