上一篇 redis cluster集群部署 , 主要講解 redis cluster 集群 搭建,本篇主要講解實驗多master寫入、讀寫分離、實驗自動故障切換(高可用性),下面直接開始吧。
上一篇我們搭建完了redis cluster 集群,下面進行數據存儲測試
多master寫入 - 海量數據的分布式存儲
當我們set 數據的時候會發現如下圖問題:
通過上圖發現,當插入key1、key2、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 上去執行這條寫入的命令。
多master的寫入保持每個master都可以進行數據的寫入,每條數據只能存在于一個 master 和相應的 slave 上,每條數據只能由對應的 master 負責。
上面說了,每次寫入一條數據,如果不在本地 master ,還需要手動切換到對應的master 上去執行,這就相當麻煩了。能不能將手動的方式交給redis 自動切換執行呢 ?
redis-cli -h 192.168.43.16 -p 7001 -c // -c 表示將數據寫入move err 手動切換的方式讓 redis 自身自動去做
上圖可以看出,redis 做了redirected 重定向,讀取數據也是一樣的。
slave數據讀取 - 讀寫分離
前面說過,redis cluster 支持讀寫分離,實際上這個概念在cluster 中已經不是那么重要了,因為水平擴容(多master就已經解決或者實現了 redis replication 主從架構 一主多從的讀寫分離效果),我們在生產環境中都會發現,直接使用 master 進行讀寫了。當然redis cluster 還是支持 slave 讀的(默認是不支持slave節點讀,在讀的時候我們需要先執行下 readonly
,如下圖所示:
- 先看下 192.168.43.16:7001 對應的 slave 是啥
- 192.168.43.16:7002 slave 上讀取數據
上圖可以看出,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 哨兵 的故障切換功能,從而實現了高可用性。
好了,本章 redis cluster 集群暢談二 就到這里。
以上就是本章內容,如有不對的地方,請多多指教,謝謝!
為了方便有需要的人,本系列全部軟件都在 https://pan.baidu.com/s/1qYsJZfY
下章預告:主要講解 redis cluster 集群暢談三 之 水平擴容、slave自動化遷移
作者:逐暗者 (轉載請注明出處)