接上一篇RDB,本篇看下Redis數(shù)據(jù)持久化的第二種方式AOF。
目錄
一、AOF原理
1、寫入機(jī)制:
2、緩沖機(jī)制:
3、重寫機(jī)制?:
4、運(yùn)行流程
二、AOF文件配置
1、開啟AOF:
2、自動觸發(fā)AOF重寫?
3、重寫規(guī)則:
三、AOF的備份恢復(fù):
1、正?;謴?fù):
2、異?;謴?fù):
四、重寫流程:
五、AOF優(yōu)缺點(diǎn):
1、優(yōu)點(diǎn):
2、缺點(diǎn):
一、AOF原理
?AOF 日志存儲的是 Redis 服務(wù)器的順序指令序列,AOF 日志只記錄對內(nèi)存進(jìn)行修改的指令記錄。假設(shè) AOF 日志記錄了自 Redis 實(shí)例創(chuàng)建以來所有的修改性指令序列,那么就可以通過對一個空的 Redis 實(shí)例順序執(zhí)行所有的指令,也就是「重放」,來恢復(fù) Redis 當(dāng)前實(shí)例的內(nèi)存數(shù)據(jù)結(jié)構(gòu)的狀態(tài)。
1、寫入機(jī)制:
Redis 在收到客戶端修改命令后,先進(jìn)行相應(yīng)的校驗(yàn),如果沒問題,就立即將該命令存追加到 .aof 文件中,也就是先存到磁盤中,然后服務(wù)器再執(zhí)行命令。這樣就算遇到了突發(fā)的宕機(jī)情況情況,也只需將存儲到 .aof 文件中的命令,進(jìn)行一次“命令重演”就可以恢復(fù)到宕機(jī)前的狀態(tài)。
2、緩沖機(jī)制:
在上述執(zhí)行過程中,有一個很重要的環(huán)節(jié)就是命令的寫入,這是一個 IO 操作。Redis 為了提升寫入效率,它不會將內(nèi)容直接寫入到磁盤中,而是將其放到一個內(nèi)存緩存區(qū)(buffer)中,等到緩存區(qū)被填滿時采用異步真正將緩存區(qū)中的內(nèi)容寫入到磁盤里,Linux 系統(tǒng)的 fsync() 函數(shù)可以將指定文件的內(nèi)容從內(nèi)核緩存刷到硬盤中。
?但是如果機(jī)器突然宕機(jī),AOF 日志內(nèi)容可能還沒有來得及完全刷到磁盤中,這個時候就會出現(xiàn)日志丟失。Redis 為數(shù)據(jù)的安全性考慮,同樣為 AOF 持久化提供了策略配置appendfsync:有三個選項,見第二部分配置參數(shù)
3、重寫/壓縮機(jī)制?:
Redis 在長期運(yùn)行的過程中,aof 文件會越變越長。如果機(jī)器宕機(jī)重啟,“重演”整個 aof 文件會非常耗時,導(dǎo)致長時間 Redis 無法對外提供服務(wù)。為了讓 aof 文件的大小控制在合理的范圍內(nèi),Redis 提供了 AOF 重寫機(jī)制
(1)自動觸發(fā)AOF重寫:Redis 為自動觸發(fā) AOF 重寫功能,提供了相應(yīng)的配置策略,默認(rèn)配置
? ?
該配置項表示:觸發(fā)重寫所需要的 aof 文件體積百分比,只有當(dāng) aof 文件的增量大于 100% 時才進(jìn)行重寫,也就是大一倍。比如,第一次重寫時文件大小為 64M,那么第二次觸發(fā)重寫的體積為 128M,第三次重寫為 256M,以此類推。如果將百分比值設(shè)置為 0 就表示關(guān)閉 AOF 自動重寫功能。
(2)手動執(zhí)行BGREWRITEAOF
命令,這個命令通過移除AOF文件中的冗余命令來重寫AOF文件
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
新的 aof 文件記錄的數(shù)據(jù)庫數(shù)據(jù)和原 aof 文件記錄的數(shù)據(jù)庫數(shù)據(jù)完全一致;
新的 aof 文件會使用盡可能少的命令來記錄數(shù)據(jù)庫數(shù)據(jù),因此新的 aof 文件的體積會小很多;
AOF 重寫期間,服務(wù)器不會被阻塞,它可以正常處理客戶端發(fā)送的命令。
即使 Bgrewriteaof 執(zhí)行失敗,也不會有任何數(shù)據(jù)丟失,因?yàn)榕f的 AOF 文件在 Bgrewriteaof 成功之前不會被修改
4、運(yùn)行流程
(1)客戶端的請求寫命令會被append追加到AOF緩沖區(qū)內(nèi)
(2)AOF緩沖區(qū)會根據(jù)AOF持久化策略[always,everysec,no]將操作sync同步到磁盤的AOF文件中
(3)AOF文件大小超過重寫策略或手動重寫時,會對AOF文件進(jìn)行重寫(rewrite),壓縮AOF文件容量
(4)redis服務(wù)器重啟時,會重新load加載AOF文件中的寫操作達(dá)到數(shù)據(jù)恢復(fù)的目的。
二、AOF文件配置
1、開啟AOF:
?AOF默認(rèn)不開啟,可以在 redis.conf 文件中對AOF進(jìn)行配置開啟:
??
appendonly no # 是否開啟AOF,yes:開啟,no:不開啟,默認(rèn)為no
appendfilename "appendonly.aof" # aof文件名稱,默認(rèn)為appendonly.aof
dir ./ # aof文件所在目錄,默認(rèn)./,表示執(zhí)行啟動命令時所在的目錄
2、自動觸發(fā)AOF重寫/壓縮?
見原理部分。
3、appendfsync同步頻率:
默認(rèn)為Everysec,有三個選項
(1)Always:服務(wù)器每寫入一個命令,就調(diào)用一次 fsync函數(shù),將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,也不會丟失任何已經(jīng)成功執(zhí)行的命令數(shù)據(jù),但是其執(zhí)行速度較慢;
(2)Everysec(默認(rèn)):服務(wù)器每一秒調(diào)用一次 fsync 函數(shù),將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,最多只丟失一秒鐘內(nèi)的執(zhí)行的命令數(shù)據(jù),通常都使用它作為 AOF 配置策略;
(3)No:服務(wù)器不主動調(diào)用 fsync 函數(shù),由操作系統(tǒng)決定何時將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器遭遇意外停機(jī)時,丟失命令的數(shù)量是不確定的,所以這種策略,不確定性較大,不安全。
4、重寫/壓縮規(guī)則:
no-appendfsync-on-rewrite:重寫時,不會執(zhí)行appendfsync操作
no-appendfsync-on-rewrite no
?該參數(shù)表示在正在進(jìn)行AOF重寫時不會將AOF緩沖區(qū)中的數(shù)據(jù)同步到舊的AOF文件磁盤,也就是說在進(jìn)行AOF重寫的時候,如果此時有寫操作進(jìn)來,此時寫操作的命令會放在aof_buf緩存中(內(nèi)存中),而不會將其追加到舊的AOF文件中,這么做是為了避免同時寫舊的AOF文件和新的AOF文件對磁盤產(chǎn)生的壓力。
(1)默認(rèn)是ON,表示關(guān)閉,即在AOF重寫時,會對AOF緩沖區(qū)中的數(shù)據(jù)做同步磁盤操作
,這在很大程度上保證了數(shù)據(jù)的安全性。但是遇到重寫操作,可能會發(fā)生阻塞。(數(shù)據(jù)安全,但是性能降低)
(2)如果no-appendfsync-on-rewrite為yes,不寫入aof文件,只寫入緩存
,用戶請求不會阻塞,但是在這段時間如果宕機(jī)會丟失這段時間的緩存數(shù)據(jù)。(降低數(shù)據(jù)安全性,提高性能)。
但在數(shù)據(jù)量很大的場景,因?yàn)閮烧叨紩拇疟PIO,對磁盤的影響較大,可以將其設(shè)置為“yes”減輕磁盤壓力,但在極端情況下可能丟失整個AOF重寫期間的數(shù)據(jù)。
三、AOF的備份恢復(fù):
AOF的備份機(jī)制和性能雖然和RDB不同,但是備份和恢復(fù)的操作同RDB一樣,都是拷貝備份文件,需要恢復(fù)時再拷貝到Redis工作目錄下,啟動系統(tǒng)即加載。
1、正?;謴?fù):
(1)修改默認(rèn)的appendonly no,改為yes
(2)將有數(shù)據(jù)的aof文件復(fù)制一份保存到對應(yīng)的目錄(查看目錄:config get dir)
(3)恢復(fù):重啟redis然后重新加載
2、異常恢復(fù):
(1)修改默認(rèn)的appendonly no,改為yes
(2)如遇到aof文件損壞,通過?redis-check-aof --fix appendonly.aof
?進(jìn)行恢復(fù),appendonly.aof是文件名
四、重寫流程:
1、手動執(zhí)行 bgrewriteaof命令觸發(fā)重寫,判斷是否當(dāng)前有bgfsave或bgrewriteaof在運(yùn)行,如果有,則等待該命令結(jié)束后再繼續(xù)執(zhí)行
2、主進(jìn)程fork出子進(jìn)程執(zhí)行重寫操作,保證主進(jìn)程不會阻塞
3、子進(jìn)程遍歷redis內(nèi)存中的數(shù)據(jù)到臨時文件,客戶端的寫請求同時寫入aof_buf緩沖區(qū)和aof_rewrite_buf重寫緩沖區(qū)保證原AOF文件完整性以及新AOF文件生成期間的新的數(shù)據(jù)修改動作不會丟失
4、子進(jìn)程寫完新的AOF文件后,向主進(jìn)程發(fā)送信號,父進(jìn)程更新統(tǒng)計信息
5、主進(jìn)程把a(bǔ)of_rewrite_buf中的數(shù)據(jù)寫入到新的AOF文件
6、使用新的AOF文件覆蓋舊的AOF文件,完成AOF重寫
五、AOF優(yōu)缺點(diǎn):
1、優(yōu)點(diǎn):
(1)備份機(jī)制更穩(wěn)健,丟失數(shù)據(jù)概率更低
(2)可讀的日志文本,通過操作AOF文件,可以處理誤操作
2、缺點(diǎn):
(1)比RDB占用更多的磁盤空間
(2)恢復(fù)備份速度要慢
(3)每次讀寫都同步的話,有一定的性能壓力文章來源:http://www.zghlxwxcb.cn/news/detail-805977.html
(4)存在個別bug,造成不能恢復(fù)文章來源地址http://www.zghlxwxcb.cn/news/detail-805977.html
到了這里,關(guān)于redis數(shù)據(jù)安全(三)數(shù)據(jù)持久化 AOF的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!