http://blog.720ui.com/2016/redis_action_03_rdb_aof/
Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),通過(guò)持久化機(jī)制把內(nèi)存中的數(shù)據(jù)同步到硬盤(pán)文件來(lái)保證數(shù)據(jù)持久化。當(dāng)Redis重啟后通過(guò)把硬盤(pán)文件重新加載到內(nèi)存,就能達(dá)到恢復(fù)數(shù)據(jù)的目的。
RDB
RDB是Redis默認(rèn)的持久化方式。按照一定的時(shí)間周期策略把內(nèi)存的數(shù)據(jù)以快照的形式保存到硬盤(pán)的二進(jìn)制文件。即Snapshot快照存儲(chǔ),對(duì)應(yīng)產(chǎn)生的數(shù)據(jù)文件為dump.rdb,通過(guò)配置文件中的save參數(shù)來(lái)定義快照的周期。
- # 快照的文件名
- dbfilename dump.rdb
- # 存放快照的目錄
- dir /var/lib/redis
- # 在進(jìn)行鏡像備份時(shí),是否進(jìn)行壓縮。
- # yes:壓縮,但是需要一些cpu的消耗。
- # no:不壓縮,需要更多的磁盤(pán)空間。
- rdbcompression yes
- #900秒后且至少1個(gè)key發(fā)生變化時(shí)創(chuàng)建快照
- save 900 1
- #300秒后且至少10個(gè)key發(fā)生變化時(shí)創(chuàng)建快照
- save 300 10
- #60秒后且至少10000個(gè)key發(fā)生變化時(shí)創(chuàng)建快照
- save 60 10000
一旦數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題,那么我們的RDB文件中保存的數(shù)據(jù)并不是全新的,從上次RDB文件生成到Redis停機(jī)這段時(shí)間的數(shù)據(jù)全部丟掉了。例如,每隔5分鐘或者更長(zhǎng)的時(shí)間來(lái)創(chuàng)建一次快照,Redis停止工作時(shí)(例如意外斷電)就可能丟失最近幾分鐘的數(shù)據(jù)。
AOF
Redis會(huì)將每一個(gè)收到的寫(xiě)命令都通過(guò)Write函數(shù)追加到文件最后,類(lèi)似于MySQL的binlog。當(dāng)Redis重啟是會(huì)通過(guò)重新執(zhí)行文件中保存的寫(xiě)命令來(lái)在內(nèi)存中重建整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容。
- # 是否開(kāi)啟AOF,默認(rèn)關(guān)閉(no)
- appendonly yes
由于Linux會(huì)把對(duì)文件的寫(xiě)入操作通過(guò)buffer緩沖,因此Linux可能不是立即寫(xiě)入到文件,有對(duì)視數(shù)據(jù)的風(fēng)險(xiǎn)。Redis有三種不同的fsync策略供選擇:no fsync at all、 fsync every second、 fsync at every query。默認(rèn)為fsync every second此時(shí)的寫(xiě)性能仍然很好,且最壞的情況下可能丟失一秒鐘的寫(xiě)操作。
- # Redis支持三種不同的刷寫(xiě)模式:
- #每次收到寫(xiě)命令就立即強(qiáng)制寫(xiě)入磁盤(pán),是最有保證的完全的持久化,但速度也是最慢的,一般不推薦使用。
- # appendfsync always
- #每秒鐘強(qiáng)制寫(xiě)入磁盤(pán)一次,在性能和持久化方面做了很好的折中,是受推薦的方式。
- appendfsync everysec
- #完全依賴OS的寫(xiě)入,一般為30秒左右一次,性能最好但是持久化最沒(méi)有保證,不被推薦。
- # appendfsync no
AOF帶來(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就夠了。為了合并重寫(xiě)AOF的持久化文件,Redis提供了bgrewriteaof命令。收到此命令后,Redis將使用與快照類(lèi)似的方式將內(nèi)存中的數(shù)據(jù)以命令的方式保存到臨時(shí)文件中,最后替換原來(lái)的文件,以此來(lái)實(shí)現(xiàn)控制AOF文件的合并重寫(xiě)。由于是模擬快照的過(guò)程,因此在重寫(xiě)AOF文件時(shí)并沒(méi)有讀取舊的AOF文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫(xiě)了一個(gè)新的AOF文件。
- # AOF文件名
- appendfilename appendonly.aof
- #當(dāng)進(jìn)程中BGSAVE或BGREWRITEAOF命令正在執(zhí)行時(shí)不阻止主進(jìn)程中的fsync()調(diào)用(默認(rèn)為no,當(dāng)存在延遲問(wèn)題時(shí)需調(diào)整為yes)
- no-appendfsync-on-rewrite no
- #當(dāng)AOF增長(zhǎng)率為100%且達(dá)到了64mb時(shí)開(kāi)始自動(dòng)重寫(xiě)AOF
- auto-aof-rewrite-percentage 100
- auto-aof-rewrite-min-size 64mb