緩存架構(gòu)之19:對(duì)項(xiàng)目的redis cluster實(shí)驗(yàn)多master寫(xiě)入、讀寫(xiě)分離、高可用性

redis cluster搭建起來(lái)了

redis cluster,提供了多個(gè)master,數(shù)據(jù)可以分布式存儲(chǔ)在多個(gè)master上; 每個(gè)master都帶著slave,自動(dòng)就做讀寫(xiě)分離; 每個(gè)master如果故障,那么久會(huì)自動(dòng)將slave切換成master,高可用

redis cluster的基本功能,來(lái)測(cè)試一下

1、實(shí)驗(yàn)多master寫(xiě)入 -> 海量數(shù)據(jù)的分布式存儲(chǔ)

你在redis cluster寫(xiě)入數(shù)據(jù)的時(shí)候,其實(shí)是你可以將請(qǐng)求發(fā)送到任意一個(gè)master上去執(zhí)行

但是,每個(gè)master都會(huì)計(jì)算這個(gè)key對(duì)應(yīng)的CRC16值,然后對(duì)16384個(gè)hashslot取模,找到key對(duì)應(yīng)的hashslot,找到hashslot對(duì)應(yīng)的master

如果對(duì)應(yīng)的master就在自己本地的話,set mykey1 v1,mykey1這個(gè)key對(duì)應(yīng)的hashslot就在自己本地,那么自己就處理掉了

但是如果計(jì)算出來(lái)的hashslot在其他master上,那么就會(huì)給客戶端返回一個(gè)moved error,告訴你,你得到哪個(gè)master上去執(zhí)行這條寫(xiě)入的命令

什么叫做多master的寫(xiě)入,就是每條數(shù)據(jù)只能存在于一個(gè)master上,不同的master負(fù)責(zé)存儲(chǔ)不同的數(shù)據(jù),分布式的數(shù)據(jù)存儲(chǔ)

100w條數(shù)據(jù),5個(gè)master,每個(gè)master就負(fù)責(zé)存儲(chǔ)20w條數(shù)據(jù),分布式數(shù)據(jù)存儲(chǔ)

大型的java系統(tǒng)架構(gòu),還專(zhuān)注在大數(shù)據(jù)系統(tǒng)架構(gòu),分布式,分布式存儲(chǔ),hadoop hdfs,分布式資源調(diào)度,hadoop yarn,分布式計(jì)算,hadoop mapreduce/hive

分布式的nosql數(shù)據(jù)庫(kù),hbase,分布式的協(xié)調(diào),zookeeper,分布式通用計(jì)算引擎,spark,分布式的實(shí)時(shí)計(jì)算引擎,storm

如果你要處理海量數(shù)據(jù),就涉及到了一個(gè)名詞,叫做大數(shù)據(jù),只要涉及到大數(shù)據(jù),那么其實(shí)就會(huì)涉及到分布式

redis cluster,分布式

因?yàn)槲襾?lái)講java系統(tǒng)的架構(gòu),有時(shí)候跟其他人不一樣,純搞java,但是我因?yàn)楣ぷ鲿r(shí)間很長(zhǎng),早期專(zhuān)注做java架構(gòu),好多年,大數(shù)據(jù)興起,就一直專(zhuān)注大數(shù)據(jù)系統(tǒng)架構(gòu)

大數(shù)據(jù)相關(guān)的系統(tǒng),也涉及很多的java系統(tǒng)架構(gòu),高并發(fā)、高可用、高性能、可擴(kuò)展、分布式系統(tǒng)

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

redis,高并發(fā)、高性能、每日上億流量的大型電商網(wǎng)站的商品詳情頁(yè)系統(tǒng)的緩存架構(gòu),來(lái)講解的,redis是作為大規(guī)模緩存架構(gòu)中的底層的核心存儲(chǔ)的支持

高并發(fā)、高性能、每日上億流量,redis持久化 -> 災(zāi)難的時(shí)候,做數(shù)據(jù)恢復(fù),復(fù)制 -> 讀寫(xiě)分離,擴(kuò)容slave,支撐更高的讀吞吐,redis怎么支撐讀QPS超過(guò)10萬(wàn),幾十萬(wàn); 哨兵,在redis主從,一主多從,怎么保證99.99%可用性; redis cluster,海量數(shù)據(jù)

java架構(gòu)課,架構(gòu)思路和設(shè)計(jì)是很重要的,但是另外一點(diǎn),我希望能夠帶著大家用真正java架構(gòu)師的角度去看待一些技術(shù),而不是僅僅停留在技術(shù)的一些細(xì)節(jié)的點(diǎn)

給大家從一些大數(shù)據(jù)的角度,去分析一下我們java架構(gòu)領(lǐng)域中的一些技術(shù)

天下武功,都出自一脈,研究過(guò)各種大數(shù)據(jù)的系統(tǒng),redis cluster講解了很多原理,跟elasticsearch,很多底層的分布式原理,都是類(lèi)似的

redis AOF,fsync

elasticsearch建立索引的時(shí)候,先寫(xiě)內(nèi)存緩存,每秒鐘把數(shù)據(jù)刷入os cache,接下來(lái)再每隔一定時(shí)間fsync到磁盤(pán)上去

redis cluster,寫(xiě)可以到任意master,任意master計(jì)算key的hashslot以后,告訴client,重定向,路由到其他mater去執(zhí)行,分布式存儲(chǔ)的一個(gè)經(jīng)典的做法

elasticsearch,建立索引的時(shí)候,也會(huì)根據(jù)doc id/routing value,做路由,路由到某個(gè)其他節(jié)點(diǎn),重定向到其他節(jié)點(diǎn)去執(zhí)行

分布式的一些,hadoop,spark,storm里面很多核心的思想都是類(lèi)似的

后面,馬上把redis架構(gòu)給講完之后,就開(kāi)始講解業(yè)務(wù)系統(tǒng)的開(kāi)發(fā),包括高并發(fā)的商品詳情頁(yè)系統(tǒng)的大型的緩存架構(gòu),jedis cluster相關(guān)api去封裝和測(cè)試對(duì)redis cluster的訪問(wèn)

jedis cluster api,就可以自動(dòng)針對(duì)多個(gè)master進(jìn)行寫(xiě)入和讀取

2、實(shí)驗(yàn)不同master各自的slave讀取 -> 讀寫(xiě)分離

在這個(gè)redis cluster中,如果你要在slave讀取數(shù)據(jù),那么需要帶上readonly指令,get mykey1

redis-cli -c啟動(dòng),就會(huì)自動(dòng)進(jìn)行各種底層的重定向的操作

實(shí)驗(yàn)redis cluster的讀寫(xiě)分離的時(shí)候,會(huì)發(fā)現(xiàn)有一定的限制性,默認(rèn)情況下,redis cluster的核心的理念,主要是用slave做高可用的,每個(gè)master掛一兩個(gè)slave,主要是做數(shù)據(jù)的熱備,還有master故障時(shí)的主備切換,實(shí)現(xiàn)高可用的

redis cluster默認(rèn)是不支持slave節(jié)點(diǎn)讀或者寫(xiě)的,跟我們手動(dòng)基于replication搭建的主從架構(gòu)不一樣的

slave node,readonly,get,這個(gè)時(shí)候才能在slave node進(jìn)行讀取

redis cluster,主從架構(gòu)是出來(lái),讀寫(xiě)分離,復(fù)雜了點(diǎn),也可以做,jedis客戶端,對(duì)redis cluster的讀寫(xiě)分離支持不太好的

默認(rèn)的話就是讀和寫(xiě)都到master上去執(zhí)行的

如果你要讓最流行的jedis做redis cluster的讀寫(xiě)分離的訪問(wèn),那可能還得自己修改一點(diǎn)jedis的源碼,成本比較高

要不然你就是自己基于jedis,封裝一下,自己做一個(gè)redis cluster的讀寫(xiě)分離的訪問(wèn)api

核心的思路,就是說(shuō),redis cluster的時(shí)候,就沒(méi)有所謂的讀寫(xiě)分離的概念了

讀寫(xiě)分離,是為了什么,主要是因?yàn)橐⒁恢鞫鄰牡募軜?gòu),才能橫向任意擴(kuò)展slave node去支撐更大的讀吞吐量

redis cluster的架構(gòu)下,實(shí)際上本身master就是可以任意擴(kuò)展的,你如果要支撐更大的讀吞吐量,或者寫(xiě)吞吐量,或者數(shù)據(jù)量,都可以直接對(duì)master進(jìn)行橫向擴(kuò)展就可以了

也可以實(shí)現(xiàn)支撐更高的讀吞吐的效果

不會(huì)去跟大家直接講解的,很多東西都要帶著一些疑問(wèn),未知,實(shí)際經(jīng)過(guò)一些實(shí)驗(yàn)和操作之后,讓你體會(huì)的更加深刻一些

redis cluster,主從架構(gòu),讀寫(xiě)分離,沒(méi)說(shuō)錯(cuò),沒(méi)有撒謊

redis cluster,不太好,server層面,jedis client層面,對(duì)master做擴(kuò)容,所以說(shuō)擴(kuò)容master,跟之前擴(kuò)容slave,效果是一樣的

3、實(shí)驗(yàn)自動(dòng)故障切換 -> 高可用性

redis-trib.rb check 192.168.31.187:7001

比如把master1,187:7001,殺掉,看看它對(duì)應(yīng)的19:7004能不能自動(dòng)切換成master,可以自動(dòng)切換

切換成master后的19:7004,可以直接讀取數(shù)據(jù)

再試著把187:7001給重新啟動(dòng),恢復(fù)過(guò)來(lái),自動(dòng)作為slave掛載到了19:7004上面去

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容