1. 程式人生 > >快取架構之19:對專案的redis cluster實驗多master寫入、讀寫分離、高可用性

快取架構之19:對專案的redis cluster實驗多master寫入、讀寫分離、高可用性

redis cluster搭建起來了

redis cluster,提供了多個master,資料可以分散式儲存在多個master上; 每個master都帶著slave,自動就做讀寫分離; 每個master如果故障,那麼久會自動將slave切換成master,高可用

redis cluster的基本功能,來測試一下

1、實驗多master寫入 -> 海量資料的分散式儲存

你在redis cluster寫入資料的時候,其實是你可以將請求傳送到任意一個master上去執行

但是,每個master都會計算這個key對應的CRC16值,然後對16384個hashslot取模,找到key對應的hashslot,找到hashslot對應的master

如果對應的master就在自己本地的話,set mykey1 v1,mykey1這個key對應的hashslot就在自己本地,那麼自己就處理掉了

但是如果計算出來的hashslot在其他master上,那麼就會給客戶端返回一個moved error,告訴你,你得到哪個master上去執行這條寫入的命令

什麼叫做多master的寫入,就是每條資料只能存在於一個master上,不同的master負責儲存不同的資料,分散式的資料儲存

100w條資料,5個master,每個master就負責儲存20w條資料,分散式資料儲存

大型的java系統架構,還專注在大資料系統架構,分散式,分散式儲存,hadoop hdfs,分散式資源排程,hadoop yarn,分散式計算,hadoop mapreduce/hive

分散式的nosql資料庫,hbase,分散式的協調,zookeeper,分散式通用計算引擎,spark,分散式的實時計算引擎,storm

如果你要處理海量資料,就涉及到了一個名詞,叫做大資料,只要涉及到大資料,那麼其實就會涉及到分散式

redis cluster,分散式

因為我來講java系統的架構,有時候跟其他人不一樣,純搞java,但是我因為工作時間很長,早期專注做java架構,好多年,大資料興起,就一直專注大資料系統架構

大資料相關的系統,也涉及很多的java系統架構,高併發、高可用、高效能、可擴充套件、分散式系統

會給大家稍微拓展一下知識面,從不同的角度去講解一塊知識

redis,高併發、高效能、每日上億流量的大型電商網站的商品詳情頁系統的快取架構,來講解的,redis是作為大規模快取架構中的底層的核心儲存的支援

高併發、高效能、每日上億流量,redis持久化 -> 災難的時候,做資料恢復,複製 -> 讀寫分離,擴容slave,支撐更高的讀吞吐,redis怎麼支撐讀QPS超過10萬,幾十萬; 哨兵,在redis主從,一主多從,怎麼保證99.99%可用性; redis cluster,海量資料

java架構課,架構思路和設計是很重要的,但是另外一點,我希望能夠帶著大家用真正java架構師的角度去看待一些技術,而不是僅僅停留在技術的一些細節的點

給大家從一些大資料的角度,去分析一下我們java架構領域中的一些技術

天下武功,都出自一脈,研究過各種大資料的系統,redis cluster講解了很多原理,跟elasticsearch,很多底層的分散式原理,都是類似的

redis AOF,fsync

elasticsearch建立索引的時候,先寫記憶體快取,每秒鐘把資料刷入os cache,接下來再每隔一定時間fsync到磁碟上去

redis cluster,寫可以到任意master,任意master計算key的hashslot以後,告訴client,重定向,路由到其他mater去執行,分散式儲存的一個經典的做法

elasticsearch,建立索引的時候,也會根據doc id/routing value,做路由,路由到某個其他節點,重定向到其他節點去執行

分散式的一些,hadoop,spark,storm裡面很多核心的思想都是類似的

後面,馬上把redis架構給講完之後,就開始講解業務系統的開發,包括高併發的商品詳情頁系統的大型的快取架構,jedis cluster相關api去封裝和測試對redis cluster的訪問

jedis cluster api,就可以自動針對多個master進行寫入和讀取

2、實驗不同master各自的slave讀取 -> 讀寫分離

在這個redis cluster中,如果你要在slave讀取資料,那麼需要帶上readonly指令,get mykey1

redis-cli -c啟動,就會自動進行各種底層的重定向的操作

實驗redis cluster的讀寫分離的時候,會發現有一定的限制性,預設情況下,redis cluster的核心的理念,主要是用slave做高可用的,每個master掛一兩個slave,主要是做資料的熱備,還有master故障時的主備切換,實現高可用的

redis cluster預設是不支援slave節點讀或者寫的,跟我們手動基於replication搭建的主從架構不一樣的

slave node,readonly,get,這個時候才能在slave node進行讀取

redis cluster,主從架構是出來,讀寫分離,複雜了點,也可以做,jedis客戶端,對redis cluster的讀寫分離支援不太好的

預設的話就是讀和寫都到master上去執行的

如果你要讓最流行的jedis做redis cluster的讀寫分離的訪問,那可能還得自己修改一點jedis的原始碼,成本比較高

要不然你就是自己基於jedis,封裝一下,自己做一個redis cluster的讀寫分離的訪問api

核心的思路,就是說,redis cluster的時候,就沒有所謂的讀寫分離的概念了

讀寫分離,是為了什麼,主要是因為要建立一主多從的架構,才能橫向任意擴充套件slave node去支撐更大的讀吞吐量

redis cluster的架構下,實際上本身master就是可以任意擴充套件的,你如果要支撐更大的讀吞吐量,或者寫吞吐量,或者資料量,都可以直接對master進行橫向擴充套件就可以了

也可以實現支撐更高的讀吞吐的效果

不會去跟大家直接講解的,很多東西都要帶著一些疑問,未知,實際經過一些實驗和操作之後,讓你體會的更加深刻一些

redis cluster,主從架構,讀寫分離,沒說錯,沒有撒謊

redis cluster,不太好,server層面,jedis client層面,對master做擴容,所以說擴容master,跟之前擴容slave,效果是一樣的

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

redis-trib.rb check 192.168.31.187:7001

比如把master1,187:7001,殺掉,看看它對應的19:7004能不能自動切換成master,可以自動切換

切換成master後的19:7004,可以直接讀取資料

再試著把187:7001給重新啟動,恢復過來,自動作為slave掛載到了19:7004上面去