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