【轉(zhuǎn)載】Redis 高可用解決方案總結(jié)

一蝇完、常見使用方式

Redis 的幾種常見使用方式包括:

Redis 單副本科乎;

Redis 多副本(主從)密强;

Redis Sentinel(哨兵);

Redis Cluster癣朗;

Redis 自研拾因。

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

1旷余、Redis 單副本

Redis 單副本绢记,采用單個 Redis 節(jié)點部署架構(gòu),沒有備用節(jié)點實時同步數(shù)據(jù)正卧,不提供數(shù)據(jù)持久化和備份策略庭惜,適用于數(shù)據(jù)可靠性要求不高的純緩存業(yè)務(wù)場景。

優(yōu)點:

架構(gòu)簡單穗酥,部署方便;

高性價比:緩存使用時無需備用節(jié)點(單實例可用性可以用 supervisor 或 crontab 保證)惠遏,當(dāng)然為了滿足業(yè)務(wù)的高可用性砾跃,也可以犧牲一個備用節(jié)點,但同時刻只有一個實例對外提供服務(wù)节吮;高性能抽高。

缺點:

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

在緩存使用透绩,進(jìn)程重啟后翘骂,數(shù)據(jù)丟失,即使有備用的節(jié)點解決高可用性帚豪,但是仍然不能解決緩存預(yù)熱問題碳竟,因此不適用于數(shù)據(jù)可靠性要求高的業(yè)務(wù);

高性能受限于單核 CPU 的處理能力(Redis 是單線程機制)狸臣,CPU 為主要瓶頸莹桅,所以適合操作命令簡單烛亦,排序诈泼、計算較少的場景懂拾。也可以考慮用 Memcached 替代。

2铐达、Redis 多副本(主從)

Redis 多副本岖赋,采用主從(replication)部署結(jié)構(gòu),相較于單副本而言最大的特點就是主從實例間數(shù)據(jù)實時同步瓮孙,并且提供數(shù)據(jù)持久化和備份策略唐断。主從實例部署在不同的物理服務(wù)器上,根據(jù)公司的基礎(chǔ)環(huán)境配置衷畦,可以實現(xiàn)同時對外提供服務(wù)和讀寫分離策略栗涂。

優(yōu)點:

高可靠性:一方面,采用雙機主備架構(gòu)祈争,能夠在主庫出現(xiàn)故障時自動進(jìn)行主備切換斤程,從庫提升為主庫提供服務(wù),保證服務(wù)平穩(wěn)運行菩混;另一方面忿墅,開啟數(shù)據(jù)持久化功能和配置合理的備份策略,能有效的解決數(shù)據(jù)誤操作和數(shù)據(jù)異常丟失的問題沮峡;

讀寫分離策略:從節(jié)點可以擴展主庫節(jié)點的讀能力疚脐,有效應(yīng)對大并發(fā)量的讀操作。

缺點:

故障恢復(fù)復(fù)雜邢疙,如果沒有 RedisHA 系統(tǒng)(需要開發(fā))棍弄,當(dāng)主庫節(jié)點出現(xiàn)故障時,需要手動將一個從節(jié)點晉升為主節(jié)點疟游,同時需要通知業(yè)務(wù)方變更配置呼畸,并且需要讓其它從庫節(jié)點去復(fù)制新主庫節(jié)點,整個過程需要人為干預(yù)颁虐,比較繁瑣蛮原;

主庫的寫能力受到單機的限制,可以考慮分片另绩;

主庫的存儲能力受到單機的限制儒陨,可以考慮 Pika;

原生復(fù)制的弊端在早期的版本中也會比較突出笋籽,如:Redis 復(fù)制中斷后蹦漠,Slave 會發(fā)起 psync,此時如果同步不成功车海,則會進(jìn)行全量同步津辩,主庫執(zhí)行全量備份的同時可能會造成毫秒或秒級的卡頓;又由于 COW 機制,導(dǎo)致極端情況下的主庫內(nèi)存溢出喘沿,程序異常退出或宕機闸度;主庫節(jié)點生成備份文件導(dǎo)致服務(wù)器磁盤 IO 和 CPU(壓縮)資源消耗;發(fā)送數(shù) GB 大小的備份文件導(dǎo)致服務(wù)器出口帶寬暴增蚜印,阻塞請求莺禁,建議升級到最新版本。

3窄赋、Redis Sentinel(哨兵)

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

其中 Redis Sentinel 集群是由若干 Sentinel 節(jié)點組成的分布式集群忆绰,可以實現(xiàn)故障發(fā)現(xiàn)浩峡、故障自動轉(zhuǎn)移、配置中心和客戶端通知错敢。Redis Sentinel 的節(jié)點數(shù)量要滿足 2n+1(n>=1)的奇數(shù)個翰灾。

優(yōu)點:

Redis Sentinel 集群部署簡單;

能夠解決 Redis 主從模式下的高可用切換問題稚茅;

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

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

缺點:

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

資源浪費侈沪,Redis 數(shù)據(jù)節(jié)點中 slave 節(jié)點作為備份節(jié)點不提供服務(wù);

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

不能解決讀寫分離問題,實現(xiàn)起來相對復(fù)雜扣墩。

建議:

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

sentinel monitor配置中的建議設(shè)置成 Sentinel 節(jié)點的一半加 1荆责,當(dāng) Sentinel 部署在多個 IDC 的時候,單個 IDC 部署的 Sentinel 數(shù)量不建議超過(Sentinel 數(shù)量 – quorum)亚脆。

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

a. quorum

b. down-after-milliseconds 30000

c. failover-timeout 180000

d. maxclient

e. timeout

部署的各個節(jié)點服務(wù)器時間盡量要同步,否則日志的時序性會混亂键耕。

Redis 建議使用 pipeline 和 multi-keys 操作寺滚,減少 RTT 次數(shù),提高請求效率屈雄。

自行搞定配置中心(zookeeper)村视,方便客戶端對實例的鏈接訪問。

4酒奶、Redis Cluster

Redis Cluster 是社區(qū)版推出的 Redis 分布式集群解決方案蚁孔,主要解決 Redis 分布式方面的需求,比如惋嚎,當(dāng)遇到單機內(nèi)存杠氢,并發(fā)和流量等瓶頸的時候,Redis Cluster 能起到很好的負(fù)載均衡的目的另伍。

Redis Cluster 集群節(jié)點最小配置 6 個節(jié)點以上(3 主 3 從)鼻百,其中主節(jié)點提供讀寫操作,從節(jié)點作為備用節(jié)點质况,不提供請求愕宋,只作為故障轉(zhuǎn)移使用。

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

優(yōu)點:

無中心架構(gòu)臼朗;

數(shù)據(jù)按照 slot 存儲分布在多個節(jié)點邻寿,節(jié)點間數(shù)據(jù)共享,可動態(tài)調(diào)整數(shù)據(jù)分布视哑;

可擴展性:可線性擴展到 1000 多個節(jié)點绣否,節(jié)點可動態(tài)添加或刪除;

高可用性:部分節(jié)點不可用時挡毅,集群仍可用蒜撮。通過增加 Slave 做 standby 數(shù)據(jù)副本,能夠?qū)崿F(xiàn)故障自動 failover跪呈,節(jié)點之間通過 gossip 協(xié)議交換狀態(tài)信息段磨,用投票機制完成 Slave 到 Master 的角色提升;

降低運維成本耗绿,提高系統(tǒng)的擴展性和可用性苹支。

缺點:

Client 實現(xiàn)復(fù)雜,驅(qū)動要求實現(xiàn) Smart Client误阻,緩存 slots mapping 信息并及時更新债蜜,提高了開發(fā)難度晴埂,客戶端的不成熟影響業(yè)務(wù)的穩(wěn)定性。目前僅 JedisCluster 相對成熟寻定,異常處理部分還不完善儒洛,比如常見的“max redirect exception”。

節(jié)點會因為某些原因發(fā)生阻塞(阻塞時間大于 clutser-node-timeout)特姐,被判斷下線晶丘,這種 failover 是沒有必要的。

數(shù)據(jù)通過異步復(fù)制唐含,不保證數(shù)據(jù)的強一致性浅浮。

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

Slave 在集群中充當(dāng)“冷備”淮捆,不能緩解讀壓力郁油,當(dāng)然可以通過 SDK 的合理設(shè)計來提高 Slave 資源的利用率。

Key 批量操作限制攀痊,如使用 mset桐腌、mget 目前只支持具有相同 slot 值的 Key 執(zhí)行批量操作。對于映射為不同 slot 值的 Key 由于 Keys 不支持跨 slot 查詢苟径,所以執(zhí)行 mset案站、mget、sunion 等操作支持不友好棘街。

Key 事務(wù)操作支持有限蟆盐,只支持多 key 在同一節(jié)點上的事務(wù)操作,當(dāng)多個 Key 分布于不同的節(jié)點上時無法使用事務(wù)功能遭殉。

Key 作為數(shù)據(jù)分區(qū)的最小粒度石挂,不能將一個很大的鍵值對象如 hash、list 等映射到不同的節(jié)點险污。

不支持多數(shù)據(jù)庫空間痹愚,單機下的 redis 可以支持到 16 個數(shù)據(jù)庫,集群模式下只能使用 1 個數(shù)據(jù)庫空間蛔糯,即 db 0拯腮。

復(fù)制結(jié)構(gòu)只支持一層,從節(jié)點只能復(fù)制主節(jié)點渤闷,不支持嵌套樹狀復(fù)制結(jié)構(gòu)。

避免產(chǎn)生 hot-key脖镀,導(dǎo)致主庫節(jié)點成為系統(tǒng)的短板飒箭。

避免產(chǎn)生 big-key狼电,導(dǎo)致網(wǎng)卡撐爆、慢查詢等弦蹂。

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

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

5削祈、Redis 自研

Redis 自研的高可用解決方案,主要體現(xiàn)在配置中心脑漫、故障探測和 failover 的處理機制上髓抑,通常需要根據(jù)企業(yè)業(yè)務(wù)的實際線上環(huán)境來定制化。

優(yōu)點:

高可靠性优幸、高可用性吨拍;

自主可控性高;

貼切業(yè)務(wù)實際需求网杆,可縮性好羹饰,兼容性好。

缺點:

實現(xiàn)復(fù)雜碳却,開發(fā)成本高队秩;

需要建立配套的周邊設(shè)施,如監(jiān)控昼浦,域名服務(wù)馍资,存儲元數(shù)據(jù)信息的數(shù)據(jù)庫等;

維護(hù)成本高座柱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迷帜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子色洞,更是在濱河造成了極大的恐慌戏锹,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火诸,死亡現(xiàn)場離奇詭異锦针,居然都是意外死亡,警方通過查閱死者的電腦和手機置蜀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門奈搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盯荤,你說我怎么就攤上這事馋吗。” “怎么了秋秤?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵宏粤,是天一觀的道長脚翘。 經(jīng)常有香客問我,道長绍哎,這世上最難降的妖魔是什么来农? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮崇堰,結(jié)果婚禮上沃于,老公的妹妹穿的比我還像新娘。我一直安慰自己海诲,他們只是感情好繁莹,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饿肺,像睡著了一般蒋困。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敬辣,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天雪标,我揣著相機與錄音,去河邊找鬼溉跃。 笑死村刨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撰茎。 我是一名探鬼主播嵌牺,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼龄糊!你這毒婦竟也來了逆粹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤炫惩,失蹤者是張志新(化名)和其女友劉穎僻弹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體他嚷,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蹋绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筋蓖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卸耘。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粘咖,靈堂內(nèi)的尸體忽然破棺而出蚣抗,到底是詐尸還是另有隱情,我是刑警寧澤瓮下,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布翰铡,位于F島的核電站设哗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏两蟀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一震缭、第九天 我趴在偏房一處隱蔽的房頂上張望赂毯。 院中可真熱鬧,春花似錦拣宰、人聲如沸党涕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膛堤。三九已至,卻和暖如春晌该,著一層夾襖步出監(jiān)牢的瞬間肥荔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工朝群, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燕耿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓姜胖,卻偏偏與公主長得像誉帅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子右莱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1.1 Redis集群的設(shè)計原則和初衷 在官方文檔Cluster Spec中蚜锨,作者詳細(xì)介紹了Redis集群為什么要...
    Flame_1109閱讀 2,120評論 1 5
  • 一、常見使用方式 Redis 的幾種常見使用方式包括: Redis 單副本慢蜓; Redis 多副本(主從)亚再; Red...
    java成功之路閱讀 552評論 0 4
  • 感謝倪仙小柔的邀請! 5年艱辛減肥真實經(jīng)歷胀瞪,現(xiàn)在已經(jīng)瘦身成功针余,(附經(jīng)歷)純經(jīng)驗分享。真心想減肥瘦身的朋友凄诞,請抽3分...
    仙仙小柔閱讀 925評論 0 0
  • 你說不想開始 這沒有愛情的故事 如何來演示 我們彼此的夢想 擱淺 成了詩 冬日 漫天飄落的雪花 無法繼續(xù)寫下的日志...
    非凡殿下閱讀 270評論 0 0
  • 長安御召聲圆雁,忽出少年僧。 踽踽何言悔帆谍,行難磨復(fù)蹭伪朽。 匹馬星光黯,銀盤起照冰汛蝙。 天山未有靈烈涮,四顧涯云盛朴肺。
    玉蕨閱讀 285評論 3 3