這可能是史上最全 Redis 高可用解決方案

本文主要針對(duì) Redis 常見(jiàn)的幾種使用方式及其優(yōu)缺點(diǎn)展開(kāi)分析煮仇。

一浦辨、常見(jiàn)使用方式

Redis 的幾種常見(jiàn)使用方式包括:

1.Redis 單副本;

2.Redis 多副本(主從);

3.Redis Sentinel(哨兵)慌闭;

4.Redis Cluster举畸;

5.Redis 自研查排。

二、各種使用方式的優(yōu)缺點(diǎn)

1抄沮、Redis 單副本

Redis 單副本跋核,采用單個(gè) Redis 節(jié)點(diǎn)部署架構(gòu),沒(méi)有備用節(jié)點(diǎn)實(shí)時(shí)同步數(shù)據(jù)叛买,不提供數(shù)據(jù)持久化和備份策略砂代,適用于數(shù)據(jù)可靠性要求不高的純緩存業(yè)務(wù)場(chǎng)景。


優(yōu)點(diǎn):

架構(gòu)簡(jiǎn)單率挣,部署方便刻伊;

高性價(jià)比:緩存使用時(shí)無(wú)需備用節(jié)點(diǎn)(單實(shí)例可用性可以用 supervisor 或 crontab 保證),當(dāng)然為了滿足業(yè)務(wù)的高可用性,也可以犧牲一個(gè)備用節(jié)點(diǎn)娃圆,但同時(shí)刻只有一個(gè)實(shí)例對(duì)外提供服務(wù)玫锋;

高性能。

缺點(diǎn):

不保證數(shù)據(jù)的可靠性讼呢;

在緩存使用撩鹿,進(jìn)程重啟后,數(shù)據(jù)丟失悦屏,即使有備用的節(jié)點(diǎn)解決高可用性节沦,但是仍然不能解決緩存預(yù)熱問(wèn)題,因此不適用于數(shù)據(jù)可靠性要求高的業(yè)務(wù)础爬;

高性能受限于單核 CPU 的處理能力(Redis 是單線程機(jī)制)甫贯,CPU 為主要瓶頸,所以適合操作命令簡(jiǎn)單看蚜,排序叫搁、計(jì)算較少的場(chǎng)景。也可以考慮用 Memcached 替代供炎。

2渴逻、Redis 多副本(主從)

Redis 多副本,采用主從(replication)部署結(jié)構(gòu)音诫,相較于單副本而言最大的特點(diǎn)就是主從實(shí)例間數(shù)據(jù)實(shí)時(shí)同步惨奕,并且提供數(shù)據(jù)持久化和備份策略。主從實(shí)例部署在不同的物理服務(wù)器上竭钝,根據(jù)公司的基礎(chǔ)環(huán)境配置梨撞,可以實(shí)現(xiàn)同時(shí)對(duì)外提供服務(wù)和讀寫(xiě)分離策略。


優(yōu)點(diǎn):

高可靠性:一方面香罐,采用雙機(jī)主備架構(gòu)卧波,能夠在主庫(kù)出現(xiàn)故障時(shí)自動(dòng)進(jìn)行主備切換,從庫(kù)提升為主庫(kù)提供服務(wù)穴吹,保證服務(wù)平穩(wěn)運(yùn)行幽勒;另一方面,開(kāi)啟數(shù)據(jù)持久化功能和配置合理的備份策略港令,能有效的解決數(shù)據(jù)誤操作和數(shù)據(jù)異常丟失的問(wèn)題啥容;

讀寫(xiě)分離策略:從節(jié)點(diǎn)可以擴(kuò)展主庫(kù)節(jié)點(diǎn)的讀能力,有效應(yīng)對(duì)大并發(fā)量的讀操作顷霹。

缺點(diǎn):

故障恢復(fù)復(fù)雜咪惠,如果沒(méi)有 RedisHA 系統(tǒng)(需要開(kāi)發(fā)),當(dāng)主庫(kù)節(jié)點(diǎn)出現(xiàn)故障時(shí)淋淀,需要手動(dòng)將一個(gè)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn)遥昧,同時(shí)需要通知業(yè)務(wù)方變更配置,并且需要讓其它從庫(kù)節(jié)點(diǎn)去復(fù)制新主庫(kù)節(jié)點(diǎn),整個(gè)過(guò)程需要人為干預(yù)炭臭,比較繁瑣永脓;

主庫(kù)的寫(xiě)能力受到單機(jī)的限制,可以考慮分片鞋仍;

主庫(kù)的存儲(chǔ)能力受到單機(jī)的限制常摧,可以考慮 Pika;

原生復(fù)制的弊端在早期的版本中也會(huì)比較突出威创,如:Redis 復(fù)制中斷后落午,Slave 會(huì)發(fā)起 psync,此時(shí)如果同步不成功肚豺,則會(huì)進(jìn)行全量同步溃斋,主庫(kù)執(zhí)行全量備份的同時(shí)可能會(huì)造成毫秒或秒級(jí)的卡頓;又由于 COW 機(jī)制吸申,導(dǎo)致極端情況下的主庫(kù)內(nèi)存溢出梗劫,程序異常退出或宕機(jī);主庫(kù)節(jié)點(diǎn)生成備份文件導(dǎo)致服務(wù)器磁盤 IO 和 CPU(壓縮)資源消耗呛谜;發(fā)送數(shù) GB 大小的備份文件導(dǎo)致服務(wù)器出口帶寬暴增在跳,阻塞請(qǐng)求,建議升級(jí)到最新版本隐岛。

3、Redis Sentinel(哨兵)

Redis Sentinel 是社區(qū)版本推出的原生高可用解決方案瓷翻,其部署架構(gòu)主要包括兩部分:Redis Sentinel 集群和 Redis 數(shù)據(jù)集群聚凹。

其中 Redis Sentinel 集群是由若干 Sentinel 節(jié)點(diǎn)組成的分布式集群,可以實(shí)現(xiàn)故障發(fā)現(xiàn)齐帚、故障自動(dòng)轉(zhuǎn)移妒牙、配置中心和客戶端通知。Redis Sentinel 的節(jié)點(diǎn)數(shù)量要滿足 2n+1(n>=1)的奇數(shù)個(gè)对妄。


優(yōu)點(diǎn):

Redis Sentinel 集群部署簡(jiǎn)單湘今;

能夠解決 Redis 主從模式下的高可用切換問(wèn)題;

很方便實(shí)現(xiàn) Redis 數(shù)據(jù)節(jié)點(diǎn)的線形擴(kuò)展剪菱,輕松突破 Redis 自身單線程瓶頸摩瞎,可極大滿足 Redis 大容量或高性能的業(yè)務(wù)需求;

可以實(shí)現(xiàn)一套 Sentinel 監(jiān)控一組 Redis 數(shù)據(jù)節(jié)點(diǎn)或多組數(shù)據(jù)節(jié)點(diǎn)孝常。

缺點(diǎn):

部署相對(duì) Redis 主從模式要復(fù)雜一些旗们,原理理解更繁瑣;

資源浪費(fèi)构灸,Redis 數(shù)據(jù)節(jié)點(diǎn)中 slave 節(jié)點(diǎn)作為備份節(jié)點(diǎn)不提供服務(wù)上渴;

Redis Sentinel 主要是針對(duì) Redis 數(shù)據(jù)節(jié)點(diǎn)中的主節(jié)點(diǎn)的高可用切換,對(duì) Redis 的數(shù)據(jù)節(jié)點(diǎn)做失敗判定分為主觀下線和客觀下線兩種,對(duì)于 Redis 的從節(jié)點(diǎn)有對(duì)節(jié)點(diǎn)做主觀下線操作稠氮,并不執(zhí)行故障轉(zhuǎn)移曹阔。

不能解決讀寫(xiě)分離問(wèn)題,實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜隔披。

建議:

如果監(jiān)控同一業(yè)務(wù)次兆,可以選擇一套 Sentinel 集群監(jiān)控多組 Redis 數(shù)據(jù)節(jié)點(diǎn)的方案,反之選擇一套 Sentinel 監(jiān)控一組 Redis 數(shù)據(jù)節(jié)點(diǎn)的方案锹锰。

sentinel monitor配置中的建議設(shè)置成 Sentinel 節(jié)點(diǎn)的一半加 1芥炭,當(dāng) Sentinel 部署在多個(gè) IDC 的時(shí)候,單個(gè) IDC 部署的 Sentinel 數(shù)量不建議超過(guò)(Sentinel 數(shù)量 – quorum)恃慧。

合理設(shè)置參數(shù)园蝠,防止誤切,控制切換靈敏度控制:

a. quorum

b. down-after-milliseconds 30000

c. failover-timeout 180000

d. maxclient

e. timeout

部署的各個(gè)節(jié)點(diǎn)服務(wù)器時(shí)間盡量要同步痢士,否則日志的時(shí)序性會(huì)混亂彪薛。

Redis 建議使用 pipeline 和 multi-keys 操作,減少 RTT 次數(shù)怠蹂,提高請(qǐng)求效率善延。

自行搞定配置中心(zookeeper),方便客戶端對(duì)實(shí)例的鏈接訪問(wèn)城侧。

4易遣、Redis Cluster

Redis Cluster 是社區(qū)版推出的 Redis 分布式集群解決方案,主要解決 Redis 分布式方面的需求嫌佑,比如豆茫,當(dāng)遇到單機(jī)內(nèi)存,并發(fā)和流量等瓶頸的時(shí)候屋摇,Redis Cluster 能起到很好的負(fù)載均衡的目的揩魂。

Redis Cluster 集群節(jié)點(diǎn)最小配置 6 個(gè)節(jié)點(diǎn)以上(3 主 3 從),其中主節(jié)點(diǎn)提供讀寫(xiě)操作炮温,從節(jié)點(diǎn)作為備用節(jié)點(diǎn)火脉,不提供請(qǐng)求,只作為故障轉(zhuǎn)移使用柒啤。

Redis Cluster 采用虛擬槽分區(qū)倦挂,所有的鍵根據(jù)哈希函數(shù)映射到 0~16383 個(gè)整數(shù)槽內(nèi),每個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所印映射的鍵值數(shù)據(jù)白修。


優(yōu)點(diǎn):

無(wú)中心架構(gòu)妒峦;

數(shù)據(jù)按照 slot 存儲(chǔ)分布在多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)間數(shù)據(jù)共享兵睛,可動(dòng)態(tài)調(diào)整數(shù)據(jù)分布肯骇;

可擴(kuò)展性:可線性擴(kuò)展到 1000 多個(gè)節(jié)點(diǎn)窥浪,節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除;

高可用性:部分節(jié)點(diǎn)不可用時(shí)笛丙,集群仍可用漾脂。通過(guò)增加 Slave 做 standby 數(shù)據(jù)副本,能夠?qū)崿F(xiàn)故障自動(dòng) failover胚鸯,節(jié)點(diǎn)之間通過(guò) gossip 協(xié)議交換狀態(tài)信息骨稿,用投票機(jī)制完成 Slave 到 Master 的角色提升;

降低運(yùn)維成本姜钳,提高系統(tǒng)的擴(kuò)展性和可用性坦冠。

缺點(diǎn):

Client 實(shí)現(xiàn)復(fù)雜,驅(qū)動(dòng)要求實(shí)現(xiàn) Smart Client哥桥,緩存 slots mapping 信息并及時(shí)更新辙浑,提高了開(kāi)發(fā)難度,客戶端的不成熟影響業(yè)務(wù)的穩(wěn)定性拟糕。目前僅 JedisCluster 相對(duì)成熟判呕,異常處理部分還不完善,比如常見(jiàn)的“max redirect exception”送滞。

節(jié)點(diǎn)會(huì)因?yàn)槟承┰虬l(fā)生阻塞(阻塞時(shí)間大于 clutser-node-timeout)侠草,被判斷下線,這種 failover 是沒(méi)有必要的犁嗅。

數(shù)據(jù)通過(guò)異步復(fù)制边涕,不保證數(shù)據(jù)的強(qiáng)一致性。

多個(gè)業(yè)務(wù)使用同一套集群時(shí)愧哟,無(wú)法根據(jù)統(tǒng)計(jì)區(qū)分冷熱數(shù)據(jù)奥吩,資源隔離性較差,容易出現(xiàn)相互影響的情況蕊梧。

Slave 在集群中充當(dāng)“冷備”,不能緩解讀壓力腮介,當(dāng)然可以通過(guò) SDK 的合理設(shè)計(jì)來(lái)提高 Slave 資源的利用率肥矢。

Key 批量操作限制,如使用 mset叠洗、mget 目前只支持具有相同 slot 值的 Key 執(zhí)行批量操作甘改。對(duì)于映射為不同 slot 值的 Key 由于 Keys 不支持跨 slot 查詢,所以執(zhí)行 mset灭抑、mget十艾、sunion 等操作支持不友好。

Key 事務(wù)操作支持有限腾节,只支持多 key 在同一節(jié)點(diǎn)上的事務(wù)操作忘嫉,當(dāng)多個(gè) Key 分布于不同的節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能荤牍。

Key 作為數(shù)據(jù)分區(qū)的最小粒度,不能將一個(gè)很大的鍵值對(duì)象如 hash庆冕、list 等映射到不同的節(jié)點(diǎn)康吵。

不支持多數(shù)據(jù)庫(kù)空間,單機(jī)下的 redis 可以支持到 16 個(gè)數(shù)據(jù)庫(kù)访递,集群模式下只能使用 1 個(gè)數(shù)據(jù)庫(kù)空間晦嵌,即 db 0。

復(fù)制結(jié)構(gòu)只支持一層拷姿,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn)惭载,不支持嵌套樹(shù)狀復(fù)制結(jié)構(gòu)。

避免產(chǎn)生 hot-key响巢,導(dǎo)致主庫(kù)節(jié)點(diǎn)成為系統(tǒng)的短板描滔。

避免產(chǎn)生 big-key,導(dǎo)致網(wǎng)卡撐爆抵乓、慢查詢等伴挚。

重試時(shí)間應(yīng)該大于 cluster-node-time 時(shí)間。

Redis Cluster 不建議使用 pipeline 和 multi-keys 操作灾炭,減少 max redirect 產(chǎn)生的場(chǎng)景茎芋。

5、Redis 自研

Redis 自研的高可用解決方案蜈出,主要體現(xiàn)在配置中心田弥、故障探測(cè)和 failover 的處理機(jī)制上,通常需要根據(jù)企業(yè)業(yè)務(wù)的實(shí)際線上環(huán)境來(lái)定制化铡原。


優(yōu)點(diǎn):

高可靠性偷厦、高可用性;

自主可控性高燕刻;

貼切業(yè)務(wù)實(shí)際需求只泼,可縮性好,兼容性好卵洗。

缺點(diǎn):

實(shí)現(xiàn)復(fù)雜请唱,開(kāi)發(fā)成本高;

需要建立配套的周邊設(shè)施过蹂,如監(jiān)控十绑,域名服務(wù),存儲(chǔ)元數(shù)據(jù)信息的數(shù)據(jù)庫(kù)等酷勺;

維護(hù)成本高本橙。

分享一份面試寶典《Java核心知識(shí)點(diǎn)整理.pdf》“,覆蓋了JVM脆诉、鎖甚亭、高并發(fā)贷币、反射、Spring原理狂鞋、微服務(wù)片择、Zookeeper、數(shù)據(jù)庫(kù)骚揍、數(shù)據(jù)結(jié)構(gòu)等等”字管,還有Java208道面試題(含答案)加入群(Java高級(jí)架構(gòu)進(jìn)階)736-351-661 即可免費(fèi)獲取到!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信不,一起剝皮案震驚了整個(gè)濱河市嘲叔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抽活,老刑警劉巖硫戈,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異下硕,居然都是意外死亡丁逝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門梭姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霜幼,“玉大人,你說(shuō)我怎么就攤上這事誉尖∽锛龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碗暗,道長(zhǎng),這世上最難降的妖魔是什么驹针? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮诀艰,結(jié)果婚禮上牌捷,老公的妹妹穿的比我還像新娘。我一直安慰自己涡驮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布喜滨。 她就那樣靜靜地躺著捉捅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虽风。 梳的紋絲不亂的頭發(fā)上棒口,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天寄月,我揣著相機(jī)與錄音,去河邊找鬼无牵。 笑死漾肮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茎毁。 我是一名探鬼主播克懊,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼七蜘!你這毒婦竟也來(lái)了谭溉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橡卤,失蹤者是張志新(化名)和其女友劉穎扮念,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碧库,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柜与,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嵌灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄匕。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伞鲫,靈堂內(nèi)的尸體忽然破棺而出粘茄,到底是詐尸還是另有隱情,我是刑警寧澤秕脓,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布柒瓣,位于F島的核電站,受9級(jí)特大地震影響吠架,放射性物質(zhì)發(fā)生泄漏芙贫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一傍药、第九天 我趴在偏房一處隱蔽的房頂上張望磺平。 院中可真熱鬧,春花似錦拐辽、人聲如沸拣挪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菠劝。三九已至,卻和暖如春睁搭,著一層夾襖步出監(jiān)牢的瞬間赶诊,已是汗流浹背笼平。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舔痪,地道東北人寓调。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锄码,于是被迫代替她去往敵國(guó)和親夺英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359