流程
redis cluster
模式下,不建議做物理的讀寫分離;- 建議通過
master的水平擴容
,來橫向擴展讀寫吞吐量,還有支撐更多的海量數據
redis單機,假設讀吞吐是5w/s,寫吞吐2w/s,擴展redis更多master,那麼如果有5臺master,不就讀吞吐可以達到總量25/s QPS,寫可以達到10w/s QPS
- redis單機,內存,6G,8G,fork類操作的時候很耗時,會導致請求延時的問題,擴容到5臺master,能支撐的總的緩存數據量就是30G,40G -> 100臺,600G,800G,甚至1T+,海量數據
redis cluster master擴容
增加新的master node
- 增加一個新的master服務,直接在
eshop-cache03
上啓動7007節點,和之前的7005,7006一樣;
mkdir -p /var/redis/7007
- 配置文件:
/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.0.108
appendonly yes
- 啓動腳本:
/etc/init.d/redis_7007
- 手動啓動一個新的redis實例,在7007端口上
- 將新的
master node
添加到redis cluster
集羣中
redis-trib.rb add-node 192.168.0.108:7007 192.168.0.106:7001
redis-trib.rb check 192.168.0.106:7001
連接到新的redis實例上,
cluster nodes
,確認自己是否加入了集羣,作爲了一個新的master
reshard 遷移slot到新的master
resharding
的意思就是把一部分hash slot
從一些master node
上遷移到另外一些node上
- 執行命令:
redis-trib.rb reshard 192.168.0.106:7001
總共
16384
,要把之前3個master上,總共4096個hashslot
遷移到新的第四個master上去
增加新的slave node
- 爲新的
master node
服務增加slave node
,也是在eshop-cache03
上啓動192.168.0.108:7008
節點,和master 節點7008一樣:
mkdir -p /var/redis/7008
- 配置文件:
/etc/redis/7008.conf
port 7008
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.0.108
appendonly yes
- 啓動腳本:
/etc/init.d/redis_7007
- 啓動成功後,掛載到master node
192.168.0.108:7007
上面
redis-trib.rb add-node --slave --master-id 13e17e3a2331369b2fcbf8755129fd95ea8784b9 192.168.0.108:7008 192.168.0.106:7001
5. 重新查看redis cluster
狀態:7004 已經有2個slave node了
刪除node
- 先用
resharding
將數據都移除到其他節點;
redis-trib.rb reshard 192.168.0.106:7001
目前每個節點都是
4096
個,所以移動其他節點,2個1365,1個1366
- 確保node爲空之後,執行remove操作,命令後+master節點的id
redis-trib.rb del-node 192.168.0.106:7001 13e17e3a2331369b2fcbf8755129fd95ea8784b9
可以發現,7007進程也已經被幹掉了。
slave 自動遷移
介紹
-
比如現在有10個master,每個有1個slave,然後新增了3個slave作爲冗餘,有的master就有2個slave了,有的master出現了salve冗餘
-
如果某個master的slave掛了,那麼redis cluster會自動遷移一個冗餘的slave給那個master
-
多加冗餘的slave
每個master只有一個slave,如果一個slave死了,然後很快,master也死了,那可用性還是降低了,但是如果整個集羣掛載了一些冗餘slave,那麼某個master的slave死了,冗餘的slave會被自動遷移過去,作爲master的新slave,此時即使那個master也死了,還是有一個slave會切換成master的
實測
之前有一個master是有冗餘slave的,直接讓其他master其中的一個slave死掉,然後看有冗餘slave會不會自動掛載到那個master
- 之前
7004
master 有兩個 slave;
master 7003
的slave 7002
kill 掉
7004
master 現在還有一個slave了,分給了7003
。
- 如果之前kill掉的
slave 7002
重新啓動,又會有一個master 有兩個 savle了,不再演示…