溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

發(fā)布時(shí)間:2022-01-12 16:58:12 來(lái)源:億速云 閱讀:106 作者:柒染 欄目:服務(wù)器

這篇文章將為大家詳細(xì)講解有關(guān)Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

 一、Redis簡(jiǎn)單介紹

Redis是一個(gè)高性能的key-value非關(guān)系型數(shù)據(jù)庫(kù),由于其具有高性能的特性,支持高可用、持久化、多種數(shù)據(jù)結(jié)構(gòu)、集群等,使其脫穎而出,成為常用的非關(guān)系型數(shù)據(jù)庫(kù)。

此外,Redis的使用場(chǎng)景也比較多。

會(huì)話(huà)緩存(Session Cache)

Redis緩存會(huì)話(huà)有非常好的優(yōu)勢(shì),因?yàn)镽edis提供持久化,在需要長(zhǎng)時(shí)間保持會(huì)話(huà)的應(yīng)用場(chǎng)景中,如購(gòu)物車(chē)場(chǎng)景這樣的場(chǎng)景中能提供很好的長(zhǎng)會(huì)話(huà)支持,能給用戶(hù)提供很好的購(gòu)物體驗(yàn)。

全頁(yè)緩存

在WordPress中,Pantheon提供了一個(gè)不錯(cuò)的插件wp-redis,這個(gè)插件能以最快的速度加載你曾經(jīng)瀏覽過(guò)的頁(yè)面。

隊(duì)列

Reids提供list和set操作,這使得Redis能作為一個(gè)很好的消息隊(duì)列平臺(tái)來(lái)使用。我們常通過(guò)Reids的隊(duì)列功能做購(gòu)買(mǎi)限制。比如到節(jié)假日或者推廣期間,進(jìn)行一些活動(dòng),對(duì)用戶(hù)購(gòu)買(mǎi)行為進(jìn)行限制,限制今天只能購(gòu)買(mǎi)幾次商品或者一段時(shí)間內(nèi)只能購(gòu)買(mǎi)一次。也比較適合適用。

排名

Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)得非常好。所以我們?cè)诤芏嗯琶膱?chǎng)景中會(huì)應(yīng)用Redis來(lái)進(jìn)行,比如小說(shuō)網(wǎng)站對(duì)小說(shuō)進(jìn)行排名,根據(jù)排名,將排名靠前的小說(shuō)推薦給用戶(hù)。

發(fā)布/訂閱

Redis提供發(fā)布和訂閱功能,發(fā)布和訂閱的場(chǎng)景很多,比如我們可以基于發(fā)布和訂閱的腳本觸發(fā)器,實(shí)現(xiàn)用Redis的發(fā)布和訂閱功能建立起來(lái)的聊天系統(tǒng)。

此外還有很多其它場(chǎng)景,Redis都表現(xiàn)的不錯(cuò)。

二、Redis使用中單點(diǎn)故障問(wèn)題

正是由于Redis具備多種優(yōu)良特新,且應(yīng)用場(chǎng)景非常豐富,以至于Redis在各個(gè)公司都有它存在的身影。那么隨之而來(lái)的問(wèn)題和風(fēng)險(xiǎn)也就來(lái)了。Redis雖然應(yīng)用場(chǎng)景豐富,但部分公司在實(shí)踐Redis應(yīng)用的時(shí)候還是相對(duì)保守使用單節(jié)點(diǎn)部署,那為日后的維護(hù)帶來(lái)了安全風(fēng)險(xiǎn)。

在2015年的時(shí)候,曾處理過(guò)一個(gè)因?yàn)閱吸c(diǎn)故障原因?qū)е碌臉I(yè)務(wù)中斷問(wèn)題。當(dāng)時(shí)的Redis都未采用分布式部署,采用單實(shí)例部署,并未考慮容災(zāi)方面的問(wèn)題。

當(dāng)時(shí)我們通過(guò)Redis服務(wù)器做用戶(hù)購(gòu)買(mǎi)優(yōu)惠商品的行為控制,但后來(lái)由于未知原因Redis節(jié)點(diǎn)的服務(wù)器宕機(jī)了,導(dǎo)致我們無(wú)法對(duì)用戶(hù)購(gòu)買(mǎi)行為進(jìn)行控制,造成了用戶(hù)能夠在一段時(shí)間內(nèi)多次購(gòu)買(mǎi)優(yōu)惠商品的行為。

這種宕機(jī)事故可以說(shuō)已經(jīng)對(duì)公司造成了不可挽回的損失了,安全風(fēng)險(xiǎn)問(wèn)題非常嚴(yán)重,作為當(dāng)時(shí)運(yùn)維這個(gè)系統(tǒng)的我來(lái)說(shuō)有必要對(duì)這個(gè)問(wèn)題進(jìn)行修復(fù)和在架構(gòu)上的改進(jìn)。于是我開(kāi)始了解決非分布式應(yīng)用下Redis單點(diǎn)故障方面的研究學(xué)習(xí)。

三、非分布式場(chǎng)景下Redis應(yīng)用的備份與容災(zāi)

Redis主從復(fù)制現(xiàn)在應(yīng)該是很普遍了。常用的主從復(fù)制架構(gòu)有如下兩種架構(gòu)方案。

常用Redis主從復(fù)制

方案一

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

這是最常見(jiàn)的一種架構(gòu),一個(gè)Master節(jié)點(diǎn),兩個(gè)Slave節(jié)點(diǎn)??蛻?hù)端寫(xiě)數(shù)據(jù)的時(shí)候是寫(xiě)Master節(jié)點(diǎn),讀的時(shí)候,是讀取兩個(gè)Slave,這樣實(shí)現(xiàn)讀的擴(kuò)展,減輕了Master節(jié)點(diǎn)讀負(fù)載。

方案二

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

這種架構(gòu)同樣是一個(gè)Master和兩個(gè)Slave。不同的是Master和Slave1使用keepalived進(jìn)行VIP轉(zhuǎn)移。Client連接Master的時(shí)候是通過(guò)VIP進(jìn)行連接的。避免了方案一IP更改的情況。

Redis主從復(fù)制優(yōu)點(diǎn)與不足

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

實(shí)現(xiàn)了對(duì)master數(shù)據(jù)的備份,一旦master出現(xiàn)故障,slave節(jié)點(diǎn)可以提升為新的master,頂替舊的master繼續(xù)提供服務(wù)

實(shí)現(xiàn)讀擴(kuò)展。使用主從復(fù)制架構(gòu), 一般都是為了實(shí)現(xiàn)讀擴(kuò)展。Master主要實(shí)現(xiàn)寫(xiě)功能, Slave實(shí)現(xiàn)讀的功能

不足

架構(gòu)方案一

當(dāng)Master出現(xiàn)故障時(shí),Client就與Master端斷開(kāi)連接,無(wú)法實(shí)現(xiàn)寫(xiě)功能,同時(shí)Slave也無(wú)法從Master進(jìn)行復(fù)制。

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

此時(shí)需要經(jīng)過(guò)如下操作(假設(shè)提升Slave1為Master):

  1. 在Slave1上執(zhí)slaveof no one命令提升Slave1為新的Master節(jié)點(diǎn)。

  2. 在Slave1上配置為可寫(xiě),這是因?yàn)榇蠖鄶?shù)情況下,都將slave配置只讀。

  3. 告訴Client端(也就是連接Redis的程序)新的Master節(jié)點(diǎn)的連接地址。

  4. 配置Slave2從新的Master進(jìn)行數(shù)據(jù)復(fù)制。

架構(gòu)方案二

當(dāng)master出現(xiàn)故障后,Client可以連接到Slave1上進(jìn)行數(shù)據(jù)操作,但是Slave1就成了一個(gè)單點(diǎn),就出現(xiàn)了經(jīng)常要避免的單點(diǎn)故障(single  point of failure)。

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

之后需要經(jīng)過(guò)如下操作:

  1. 在Slave1上執(zhí)行slaveof no one命令提升Slave1為新的Master節(jié)點(diǎn)

  2. 在Slave1上配置為可寫(xiě),這是因?yàn)榇蠖鄶?shù)情況下,都將Slave配置只讀

  3. 配置Slave2從新的Master進(jìn)行數(shù)據(jù)復(fù)制

可以發(fā)現(xiàn),無(wú)論是哪種架構(gòu)方案都需要人工干預(yù)來(lái)進(jìn)行故障轉(zhuǎn)移(failover)。需要人工干預(yù)就增加了運(yùn)維工作量,同時(shí)也對(duì)業(yè)務(wù)造成了巨大影響。這時(shí)候可以使用Redis的高可用方案-Sentinel

四、Redis Sentinel介紹

Redis Sentinel為Redis提供了高可用方案。從實(shí)踐方面來(lái)說(shuō),使用Redis  Sentinel可以創(chuàng)建一個(gè)無(wú)需人為干預(yù)就可以預(yù)防某些故障的Redis環(huán)境。

Redis  Sentinel設(shè)計(jì)為分布式的架構(gòu),運(yùn)行多個(gè)Sentinel進(jìn)程來(lái)共同合作的。運(yùn)行多個(gè)Sentinel進(jìn)程合作,當(dāng)多個(gè)Sentinel同一給定的master無(wú)法再繼續(xù)提供服務(wù),就會(huì)執(zhí)行故障檢測(cè),這會(huì)降低誤報(bào)的可能性。

五、Redis Sentinel功能

Redis Sentinel在Redis高可用方案中主要作用有如下功能:

監(jiān)控

Sentinel會(huì)不斷的檢查master和slave是否像預(yù)期那樣正常運(yùn)行

通知

通過(guò)API,Sentinel能夠通知系統(tǒng)管理員、程序監(jiān)控的Redis實(shí)例出現(xiàn)了故障

自動(dòng)故障轉(zhuǎn)移

如果master不像預(yù)想中那樣正常運(yùn)行,Sentinel可以啟動(dòng)故障轉(zhuǎn)移過(guò)程,其中的一個(gè)slave會(huì)提成為master,其它slave會(huì)重新配置來(lái)使用新的master,使用Redis服務(wù)的應(yīng)用程序,當(dāng)連接時(shí),也會(huì)被通知使用新的地址。

配置提供者

Sentinel可以做為客戶(hù)端服務(wù)發(fā)現(xiàn)的認(rèn)證源:客戶(hù)端連接Sentinel來(lái)獲取目前負(fù)責(zé)給定服務(wù)的Redis  master地址。如果發(fā)生故障轉(zhuǎn)移,Sentinel會(huì)報(bào)告新的地址。

六、Redis Sentinel架構(gòu)

Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

七、Redis Sentinel實(shí)現(xiàn)原理

Sentinel集群對(duì)自身和Redis主從復(fù)制進(jìn)行監(jiān)控。當(dāng)發(fā)現(xiàn)Master節(jié)點(diǎn)出現(xiàn)故障時(shí),會(huì)經(jīng)過(guò)如下步驟:

  • 1)Sentinel之間進(jìn)行選舉,選舉出一個(gè)leader,由選舉出的leader進(jìn)行failover

  • 2)Sentinel leader選取slave節(jié)點(diǎn)中的一個(gè)slave作為新的Master節(jié)點(diǎn)。對(duì)slave選舉需要對(duì)slave進(jìn)行選舉的方法如下:a)  與master斷開(kāi)時(shí)間

如果與master斷開(kāi)的時(shí)間超過(guò)down-after-milliseconds(sentinel配置) *  10秒加上從sentinel判定master不可用到sentinel開(kāi)始執(zhí)行故障轉(zhuǎn)移之間的時(shí)間,就認(rèn)為該slave不適合提升為master。

b) slave優(yōu)先級(jí)

每個(gè)slave都有優(yōu)先級(jí),保存在redis.conf配置文件里。如果優(yōu)先級(jí)相同,則繼續(xù)進(jìn)行。

c) 復(fù)制偏移位置

復(fù)制偏移紀(jì)錄著從master復(fù)制數(shù)據(jù)復(fù)制到哪里,復(fù)制偏移越大表明從master接受的數(shù)據(jù)越多,如果復(fù)制偏移量也一樣,繼續(xù)進(jìn)行選舉

d) Run ID

選舉具有最小Run ID的Slave作為新的Master

流程圖如下:


Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析

  • 3) Sentinel leader會(huì)在上一步選舉的新master上執(zhí)行slaveof no one操作,將其提升為master節(jié)點(diǎn)

  • 4)Sentinel leader向其它slave發(fā)送命令,讓剩余的slave成為新的master節(jié)點(diǎn)的slave

  • 5)Sentinel leader會(huì)讓原來(lái)的master降級(jí)為slave,當(dāng)恢復(fù)正常工作,Sentinel  leader會(huì)發(fā)送命令讓其從新的master進(jìn)行復(fù)制

以上failover操作均有sentinel自己獨(dú)自完成,完全無(wú)需人工干預(yù)。

關(guān)于Redis 備份、容災(zāi)及高可用實(shí)戰(zhàn)的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI