溫馨提示×

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

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

Redis持久化實(shí)現(xiàn)的方法是什么

發(fā)布時(shí)間:2021-12-27 17:38:42 來(lái)源:億速云 閱讀:129 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Redis持久化實(shí)現(xiàn)的方法是什么”,在日常操作中,相信很多人在Redis持久化實(shí)現(xiàn)的方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Redis持久化實(shí)現(xiàn)的方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

持久化套路

OK,一般我們?cè)谏a(chǎn)上采用的持久化策略為

  • (1)master關(guān)閉持久化

  • (2)slave開(kāi)RDB即可,必要的時(shí)候AOF和RDB都開(kāi)啟

該策略能夠適應(yīng)絕大部分場(chǎng)景,絕大部分集群架構(gòu)。
為什么是絕大部分場(chǎng)景?
因?yàn)檫@套策略存在部分的數(shù)據(jù)丟失可能性。redis的主從復(fù)制是異步的,master執(zhí)行完客戶端請(qǐng)求的命令后會(huì)立即返回結(jié)果給客戶端,然后異步的方式把命令同步給slave。因此master可能還未來(lái)得及將命令傳輸給slave,就宕機(jī)了,此時(shí)slave變?yōu)閙aster,數(shù)據(jù)就丟了。
幸運(yùn)的是,絕大部分業(yè)務(wù)場(chǎng)景,都能容忍數(shù)據(jù)的部分丟失。假設(shè),真的遇到緩存雪崩的情況,代碼中也有熔斷器來(lái)進(jìn)行資源保護(hù),不至于所有的請(qǐng)求都轉(zhuǎn)發(fā)到數(shù)據(jù)庫(kù)上,導(dǎo)致我們的服務(wù)崩潰!
ps:這里的緩存雪崩是指同一時(shí)間來(lái)了一堆請(qǐng)求,請(qǐng)求的key在redis中不存在,導(dǎo)致請(qǐng)求全部轉(zhuǎn)發(fā)到數(shù)據(jù)庫(kù)上。
為什么是絕大部分集群架構(gòu)?
因?yàn)樵诩褐写嬖趓edis讀寫(xiě)分離的情況,就不適合這套方案了。
幸運(yùn)的是,由于采用redis讀寫(xiě)分離架構(gòu),就必須要考慮主從同步的延遲性問(wèn)題,徒增系統(tǒng)復(fù)雜度。目前業(yè)內(nèi)采用redis讀寫(xiě)分離架構(gòu)的項(xiàng)目,真的太少了。

 

為什么這么做

 
(1)master關(guān)閉持久化

原因很簡(jiǎn)單,因?yàn)闊o(wú)論哪種持久化方式都會(huì)影響redis的性能,哪一種持久化都會(huì)造成CPU卡頓,影響對(duì)客戶端請(qǐng)求的處理。為了保證讀寫(xiě)最佳性能,將master的持久化關(guān)閉!
RDB持久化
RDB持久化是將當(dāng)前進(jìn)程中的數(shù)據(jù)生成快照保存到硬盤(pán)(因此也稱(chēng)作快照持久化),保存的文件后綴是rdb;當(dāng)Redis重新啟動(dòng)時(shí),可以讀取快照文件恢復(fù)數(shù)據(jù)。
那么RDB持久化的過(guò)程,相當(dāng)于在執(zhí)行bgsave命令。該命令執(zhí)行過(guò)程如下圖所示

Redis持久化實(shí)現(xiàn)的方法是什么

如圖所示,主線程需要調(diào)用系統(tǒng)函數(shù)fork(),構(gòu)建出一個(gè)子進(jìn)程進(jìn)行持久化!很不幸的是,在構(gòu)建子進(jìn)程的過(guò)程中,父進(jìn)程就會(huì)阻塞,無(wú)法響應(yīng)客戶端的請(qǐng)求!  
而且,在測(cè)試中發(fā)現(xiàn),fork函數(shù)在虛擬機(jī)上較慢,真機(jī)上較快??紤]到現(xiàn)在都是部署在docker容器中,很少部署在真機(jī)上,為了性能,master不建議打開(kāi)RDB持久化!  
 AOF持久化  
RDB持久化是將進(jìn)程數(shù)據(jù)寫(xiě)入文件,而AOF持久化(即Append Only File持久化),則是將Redis執(zhí)行的每次寫(xiě)命令記錄到單獨(dú)的日志文件中。  
隨著時(shí)間的流逝,你會(huì)發(fā)現(xiàn)這個(gè)AOF文件越來(lái)越大,于是redis有一套rewrite機(jī)制,來(lái)縮小AOF文件的體積。然而,在rewrite的過(guò)程中也是需要父進(jìn)程來(lái)fork出一個(gè)子進(jìn)程進(jìn)行rewrite操作。至于fork函數(shù)的影響,上面提到過(guò)了。  
還有一個(gè)就是刷盤(pán)策略fsync,這個(gè)值推薦是配everysec,也就是Redis會(huì)默認(rèn)每隔一秒進(jìn)行一次fsync調(diào)用,將緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)。  
然而,如果磁盤(pán)性能不穩(wěn)定,fsync的調(diào)用時(shí)間超過(guò)1秒鐘。此時(shí)主線程進(jìn)行AOF的時(shí)候會(huì)對(duì)比上次fsync成功的時(shí)間;如果距上次不到2s,主線程直接返回;如果超過(guò)2s,則主線程阻塞直到fsync同步完成。  
因此AOF也是會(huì)影響redis的性能的。

ps  :linux函數(shù)中,wrtie函數(shù)將數(shù)據(jù)寫(xiě)入文件的時(shí)候,是將數(shù)據(jù)寫(xiě)入操作系統(tǒng)的緩沖區(qū),還并未刷入磁盤(pán)。而fsync函數(shù),可以強(qiáng)制讓操作系統(tǒng)將緩沖區(qū)數(shù)據(jù)刷入磁盤(pán)。  

綜上所述,我們?yōu)榱吮WC讀寫(xiě)性能最大化,將master的持久化關(guān)閉。

 
(2)slave開(kāi)RDB即可,必要的時(shí)候AOF和RDB都開(kāi)啟

首先,我先說(shuō)明一下,我不推薦單開(kāi)AOF的原因是,基于AOF的數(shù)據(jù)恢復(fù)太慢。
你要想,我們已經(jīng)做了主從復(fù)制,數(shù)據(jù)已經(jīng)實(shí)現(xiàn)備份,為什么slave還需要開(kāi)持久化?
因?yàn)槟骋惶炜赡芤驗(yàn)槟衬彻こ?,把機(jī)房的電線挖斷了,就會(huì)導(dǎo)致master和slave機(jī)器同時(shí)宕機(jī)。
那么這個(gè)時(shí)候,我們需要迅速恢復(fù)集群,而RDB文件文件小、恢復(fù)快,因此災(zāi)難恢復(fù)常用RDB文件。

其次,官網(wǎng)也不推薦單開(kāi)AOF,地址如下:
https://redis.io/topics/persistence
截圖如下

Redis持久化實(shí)現(xiàn)的方法是什么

所以,如果實(shí)在對(duì)數(shù)據(jù)安全有一定要求,將AOF和RDB持久化都開(kāi)啟。

另外,做好災(zāi)難備份。利用linux的scp命令,定期將rdb文件拷貝到云服務(wù)器上。
ps:scp是secure copy的簡(jiǎn)寫(xiě),用于在Linux下進(jìn)行遠(yuǎn)程拷貝文件的命令,和它類(lèi)似的命令有cp,不過(guò)cp只是在本機(jī)進(jìn)行拷貝不能跨服務(wù)器,而且scp傳輸是加密的。

到此,關(guān)于“Redis持久化實(shí)現(xiàn)的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向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