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上面去。