redis cluster集羣架構詳解(十九)- redis cluster實驗: 多master寫入、讀寫分離、高可用性

5.11.redis cluster實驗: 多master寫入、讀寫分離、高可用性

​ redis cluster,提供了多個master,數據可以分佈式存儲在多個master上; 每個master都帶有slave,自動就做讀寫分離; 某個master如果出現故障,就會自動將其slave切換成master,達到高可用。

5.11.1. 多master的寫入-海量數據的分佈式存儲原理

​ 多master的寫入,能實現海量數據分佈式存儲。

​ 在redis cluster寫入數據的時候,可以將請求發送到任意一個master上去執行。

​ 當執行寫入set key1 value1的時候,每個master都會計算key1對應的CRC16值,並對16384個hash slot取模,找到key1對應的hash slot,然後找到對應的master,如果對應的master就是自己,自己就做寫入操作,如果不在此master上,就會給client返回一個moved error,並告訴client到哪個master上去執行這條寫入的命令,如下:

[root@cache01 data]# redis-cli -h 192.168.75.187 -p 7001 
192.168.75.187:7001> 
192.168.75.187:7001> set key1 value1
(error) MOVED 9189 192.168.75.187:7002
192.168.75.187:7001> 

我們到192.168.75.187服務器上,啓動7002端口的master

[root@cache01 data]# redis-cli -h 192.168.75.187 -p 7002
192.168.75.187:7002> set key1 value1
OK
192.168.75.187:7002> 

​ 什麼叫做多master的寫入,就是每條數據只能存在於一個master上,不同的master負責存儲不同的數據,分佈式的數據存儲200w條數據,10個master,每個master就負責存儲20w條數據。

​ 牽涉到海量數據,就會涉及到大數據,同時就會涉及到分佈式。

大型的java系統架構,或者大數據系統架構,一般都專注分佈式,與分佈式有關的技術有:

1、分佈式存儲hadoop hdfs。

2、分佈式資源調度hadoop yarn。

3、分佈式計算hadoop mapreduce/hive。

4、分佈式的nosql數據庫hbase。

5、分佈式協調zookeeper。

6、分佈式通用計算引擎spark。

7、分佈式實時計算引擎storm。

8、搜索引擎elasticsearch

​ elasticsearch建立索引的時候,先寫內存緩存,每秒鐘把數據刷入os cache,接下來再每隔一定時間fsync到磁盤。elasticsearch,建立索引時也會根據doc id/routing value,去路由到某個節點去執行。而redis cluster,可以寫到任意master,任意master計算key的hash slot以後,告訴client,重定向到其他mater去執行。elasticsearch與redis cluster 的分佈式調度是相似的,並且分佈式的相關技術,如hadoop,spark,storm裏面很多核心的思想都是類似的。

5.11.2. 實驗一:不同master與其slave讀寫分離

​ 在這個redis cluster中,如果你要在slave讀取數據,需要使用redis-cli -c 啓動,然後發送readonly指令,再讀取數據 get key1.

[root@cache01 data]# redis-cli -c -h 192.168.75.187 -p 7001 
192.168.75.187:7001> get key1
-> Redirected to slot [9189] located at 192.168.75.187:7002
"value1"
192.168.75.187:7002> 

​ 使用redis-cli -c 命令啓動後,redis cluster 就會根據key自動進行底層的重定向的操作,以上,get key1命令,就重定向到192.168.75.187:7002服務器上獲取數據 。

​ 以下,set key2 value2 命令,就重定向到192.168.75.187:7003服務器上進行寫操作。

192.168.75.187:7002> set key2 value2
-> Redirected to slot [4998] located at 192.168.75.187:7003
OK
192.168.75.187:7003> 

​ 對redis cluster做讀寫分離的時候,會發現有一定的限制性,默認情況下,redis cluster的核心理念:

  • 主要是用slave做高可用的,每個master掛一兩個slave,主要功能是:

    • 做數據的熱備;

    • master故障時的主備切換,實現高可用的。

  • redis cluster默認是不支持slave節點讀或者寫的,跟我們手動基於replication搭建的主從架構不一樣。

    爲什麼redis cluster默認不支持slave節點的讀或寫?

​ redis cluster的主從架構,如果做讀寫分離,會很複雜,jedis客戶端對redis cluster的讀寫分離支持不太好,它默認就是讀和寫都到master上去執行,如果你要讓最流行的jedis做redis cluster的讀寫分離的訪問,那可能還得自己修改一點jedis的源碼,成本比較高,自己基於jedis,封裝一下,自己做一個redis cluster的讀寫分離的訪問api。

讀寫分離,是爲了什麼,主要是因爲要建立一主多從的架構,才能橫向任意擴展slave node,去支撐更大的讀吞吐量,而redis cluster的架構下,master是可以任意擴展的,如果要支撐更大的讀吞吐量,或者寫吞吐量,都可以直接對master進行橫向擴展,這樣就可以實現支撐更高的讀吞吐的效果,跟之前使用redis replication擴容slave,效果是一樣的。

5.11.3. 實驗二:master與的slave自動切換

實驗自動故障切換 -> 高可用性

[root@cache01 redis]# redis-cli --cluster check 192.168.75.187:7001

在這裏插入圖片描述

redis集羣檢測發現,redis master 192.168.75.187:7001 對應的 redis slave是:192.168.75.187:7004,我們將192.168.75.187:7001殺掉,看它對應的slave能不能自動切換成master。

在這裏插入圖片描述

192.168.75.187:7004已經自動切換成master。

再試着把187:7001給重新啓動,恢復過來,自動作爲slave掛載到了19:7004上面去。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章