Redis持久化的兩種方式-Snapshotting(快照)和AOF

Redis基本原理

redis持久化(aof) append online file:
寫log(aof), 到一定程度再和內(nèi)存合并. 追加再追加, 順序?qū)懘疟P, 對(duì)性能影響非常小

  1. 單實(shí)例單進(jìn)程

Redis使用的是單進(jìn)程,所以在配置時(shí),一個(gè)實(shí)例只會(huì)用到一個(gè)CPU;
在配置時(shí),如果需要讓CPU使用率最大化,可以配置Redis實(shí)例數(shù)對(duì)應(yīng)CPU數(shù), Redis實(shí)例數(shù)對(duì)應(yīng)端口數(shù)(8核Cpu, 8個(gè)實(shí)例, 8個(gè)端口), 以提高并發(fā):
單機(jī)測(cè)試時(shí), 單條數(shù)據(jù)在200字節(jié), 測(cè)試的結(jié)果為8~9萬(wàn)tps;

  1. Replication

過(guò)程: 數(shù)據(jù)寫到master–>master存儲(chǔ)到slave的rdb中–>slave加載rdb到內(nèi)存。
存儲(chǔ)點(diǎn)(save point): 當(dāng)網(wǎng)絡(luò)中斷了, 連上之后, 繼續(xù)傳.
Master-slave下第一次同步是全傳,后面是增量同步;
Redis的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過(guò)異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數(shù)據(jù)變化都寫入到一個(gè)append only file(aof)里面(這稱為“全持久化模式”)。


持久化的兩種方式:

一:第一種方法filesnapshotting:默認(rèn)redis是會(huì)以快照的形式將數(shù)據(jù)持久化到磁盤的(一個(gè)二進(jìn) 制文件,dump.rdb,這個(gè)文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之內(nèi),redis至少發(fā)生M次修改則redis抓快照到磁盤。當(dāng)然我們也可以手動(dòng)執(zhí)行save或者bgsave(異步)做快照。
工作原理:當(dāng)redis做持久化的時(shí)候,redis會(huì)fork一個(gè)進(jìn)程;子進(jìn)程將數(shù)據(jù)寫到磁盤上的一個(gè)臨時(shí)rdb文件中;寫完后,將原來(lái)的rdb替換掉,好處就是可以copy-on-write;
還有一種持久化方法:Append-only:filenapshotting方法在redis死掉時(shí),最近的數(shù)據(jù)會(huì)丟失。Append-only方法可以做到全部數(shù)據(jù)不丟失,但是會(huì)影響性能。aof就可以做到全程持久化,只需要在配置文件中開(kāi)啟(默認(rèn)no),appendonly yes開(kāi)啟aof后,redis每執(zhí)行一個(gè)修改數(shù)據(jù)的命令,都會(huì)把它添加到aof文件中,當(dāng)redis重啟時(shí),將會(huì)讀取aof文件進(jìn)行“重放”來(lái)回復(fù)到redis關(guān)閉前的最后一刻。--當(dāng)使用AOF時(shí),redis推薦同時(shí)使用BGREWRITEAOF。


AOF文件刷新的方式,有三種,參考配置參數(shù)appendfsync :appendfsync always每提交一個(gè)修改命令都調(diào)用fsync刷新到AOF文件,非常非常慢,但也非常安全;appendfsync everysec每秒鐘都調(diào)用fsync刷新到AOF文件,很快,但可能會(huì)丟失一秒以內(nèi)的數(shù)據(jù);appendfsync no依靠OS進(jìn)行刷新,redis不主動(dòng)刷新AOF,這樣最快,但安全性就差。默認(rèn)并推薦每秒刷新,這樣在速度和安全上都做到了兼顧。

redis支持兩種方式持久化:1.Snapshotting(快照)也是默認(rèn)方式;2.Append-only file(aof)方式。
1.Snapshotting
快照是默認(rèn)的持久化方式。這種方式是就是將內(nèi)存中數(shù)據(jù)以快照的方式寫入到二進(jìn)制文件中,默認(rèn)的文件名為dump.rdb??梢酝ㄟ^(guò)配置設(shè)置自動(dòng)做快照持久 化的方式。我們可以配置redis在n秒內(nèi)如果超過(guò)m個(gè)key被修改就自動(dòng)做快照,下面是默認(rèn)的快照保存配置

save 900 1 #900秒內(nèi)如果超過(guò)1個(gè)key被修改,則發(fā)起快照保存
save 300 10 #300秒內(nèi)容如超過(guò)10個(gè)key被修改,則發(fā)起快照保存
save 60 10000
2.Append-only file

aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式時(shí),redis會(huì)將每一個(gè)收到的寫命令都通過(guò)write函數(shù)追加到文件中(默認(rèn)是 appendonly.aof)。當(dāng)redis重啟時(shí)會(huì)通過(guò)重新執(zhí)行文件中保存的寫命令來(lái)在內(nèi)存中重建整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容。當(dāng)然由于os會(huì)在內(nèi)核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會(huì)丟失部分修改。不過(guò)我們可以通過(guò)配置文件告訴redis我們想要 通過(guò)fsync函數(shù)強(qiáng)制os寫入到磁盤的時(shí)機(jī)。有三種方式如下(默認(rèn)是:每秒fsync一次)

appendonly yes //啟用aof持久化方式

appendfsync always //每次收到寫命令就立即強(qiáng)制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用

appendfsync everysec //每秒鐘強(qiáng)制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦

appendfsync no //完全依賴os,性能最好,持久化沒(méi)保證

aof 的方式也同時(shí)帶來(lái)了另一個(gè)問(wèn)題。持久化文件會(huì)變的越來(lái)越大。例如我們調(diào)用incr test命令100次,文件中必須保存全部的100條命令,其實(shí)有99條都是多余的。因?yàn)橐謴?fù)數(shù)據(jù)庫(kù)的狀態(tài)其實(shí)文件中保存一條set test 100就夠了。為了壓縮aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis將使用與快照類似的方式將內(nèi)存中的數(shù)據(jù) 以命令的方式保存到臨時(shí)文件中,最后替換原來(lái)的文件。具體過(guò)程如下

  1. redis調(diào)用fork ,現(xiàn)在有父子兩個(gè)進(jìn)程
  2. 子進(jìn)程根據(jù)內(nèi)存中的數(shù)據(jù)庫(kù)快照,往臨時(shí)文件中寫入重建數(shù)據(jù)庫(kù)狀態(tài)的命令
    3.父進(jìn)程繼續(xù)處理client請(qǐng)求,除了把寫命令寫入到原來(lái)的aof文件中。同時(shí)把收到的寫命令緩存起來(lái)。這樣就能保證如果子進(jìn)程重寫失敗的話并不會(huì)出問(wèn)題。
    4.當(dāng)子進(jìn)程把快照內(nèi)容寫入已命令方式寫到臨時(shí)文件中后,子進(jìn)程發(fā)信號(hào)通知父進(jìn)程。然后父進(jìn)程把緩存的寫命令也寫入到臨時(shí)文件。
    5.現(xiàn)在父進(jìn)程可以使用臨時(shí)文件替換老的aof文件,并重命名,后面收到的寫命令也開(kāi)始往新的aof文件中追加。

需要注意到是重寫aof文件的操作,并沒(méi)有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,這點(diǎn)和快照有點(diǎn)類似。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容