上一篇 http://www.cnblogs.com/qinyujie/p/9029482.html, 主要講解 redis cluster 集羣 搭建,本篇主要講解實驗多master寫入、讀寫分離、實驗自動故障切換(高可用性),下面直接開始吧。html
上一篇咱們搭建完了redis cluster 集羣,下面進行數據存儲測試redis
當咱們set 數據的時候會發現以下圖問題:架構
經過上圖發現,當插入key一、key二、key3 時報錯,它要求咱們到相應的master 節點去進行寫入,沒錯,這就是多master寫入,以上就驗證了,實際的數據寫入是要到相應的master 進行操做的,每一個master 均可以計算,而後將請求轉發至真正的操做節點進行。分佈式
根據上圖redis 切換到 192.168.43.17:7003 進行key1 1 的寫入,以下圖測試
總結:redis cluster寫入數據的時候,能夠將請求發送到任意一個master上去執行,可是每一個 master 都會計算這個 key 對應的 CRC16 值,而後對16384個 hashslot 取模,找到 key 對應的 hashslot,根據 hashslot 尋找對應的master。若是對應的master就在本身本地的話,set key4 4,key4 這個 key 對應的 hashslot 就在本身本地,那麼本身就進行寫入了。可是若是計算出來的 hashslot 在其餘 master 上,那麼就會給客戶端返回一個 moved error,告訴你,你獲得哪一個 master 上去執行這條寫入的命令。code
多master的寫入保持每一個master均可以進行數據的寫入,每條數據只能存在於一個 master 和相應的 slave 上,每條數據只能由對應的 master 負責。orm
上面說了,每次寫入一條數據,若是不在本地 master ,還須要手動切換到對應的master 上去執行,這就至關麻煩了。能不能將手動的方式交給redis 自動切換執行呢 ?htm
redis-cli -h 192.168.43.16 -p 7001 -c // -c 表示將數據寫入move err 手動切換的方式讓 redis 自身自動去作blog
上圖能夠看出,redis 作了redirected 重定向,讀取數據也是同樣的。get
前面說過,redis cluster 支持讀寫分離,實際上這個概念在cluster 中已經不是那麼重要了,由於水平擴容(多master就已經解決或者實現了 redis replication 主從架構 一主多從的讀寫分離效果),咱們在生產環境中都會發現,直接使用 master 進行讀寫了。固然redis cluster 仍是支持 slave 讀的(默認是不支持slave節點讀,在讀的時候咱們須要先執行下 readonly
,以下圖所示:
上圖能夠看出,redis cluster 默認slave 也是不能讀的,若是要讀取,須要執行 readonly
,就能夠了。
注意:在redis cluster的核心的理念裏,slave 主要是用作高可用的,每一個master掛一兩個slave,主要是作數據的熱備,還有master故障時的主備切換,實現高可用的。
查看集羣信息
redis-trib.rb check 192.168.43.16:7001
下面咱們來測試將 192.168.43.16:7001 master kill 掉,看看 192.168.43.16:7002 slave 是否自動切換爲master,以下圖所示:
經過上圖能夠看出,redis cluster 集羣自身具有了redis repliction + sentinal 哨兵 的故障切換功能,從而實現了高可用性。