Redis持久化機制AOF(七 下)

2021-10-23 20:01:07 字數 2300 閱讀 3039

redis的rdb持久化機制對全量資料進行持久化,但是缺點是如果在資料持久化的過程中伺服器發生故障,那麼最後一次持久化的rdb檔案就會丟失,會導致資料的不完整(因為是快取資料,所以一般情況下也沒那麼重要),但如果對資料的完整性要求比較高,可以使用aof持久化機制,只是丟失更少的資料。

以日誌的形式來記錄使用者請求的寫操作。讀操作不會記錄,因為寫操作才會存儲存。

檔案以追加的形式而不是修改的形式。

redis的aof恢復其實就是把追加的檔案從開始到結尾讀取執行寫操作。

測試:我們再redis上執行flushall命令清除所有資料,然後在aof檔案中刪除最後一行的命令(flushall就是最後的命令),然後重啟redis,會發現所有的資料都已經恢復,恢復的流程就是把aof檔案中的所有寫命令在redis中重新執行一遍,如果不刪掉檔案最後一行的flushall命令,那麼flushall就是redis在恢復過程中執行的最後的命令(所有恢復的資料會再次被刪除)

aof更加耐用,可以以秒級別為單位備份,如果發生問題,也只會丟失最後一秒的資料,大大增加了可靠性和資料完整性。所以aof可以每秒備份一次,使用fsync操作。

以log日誌形式追加,如果磁碟滿了,會執行 redis-check-aof 工具

當資料太大的時候,redis可以在後台自動重寫aof。當redis繼續把日誌追加到老的檔案中去時,重寫也是非常安全的,不會影響客戶端的讀寫操作。

aof 日誌包含的所有寫操作,會更加便於redis的解析恢復。

相同的資料,同乙份資料,aof比rdb大

針對不同的同步機制,aof會比rdb慢,因為aof每秒都會備份做寫操作,這樣相對與rdb來說就略低。 每秒備份fsync沒毛病,但是如果客戶端的每次寫入就做一次備份fsync的話,那麼redis的效能就會下降。 

aof發生過bug,就是資料恢復的時候資料不完整,這樣顯得aof會比較脆弱,容易出現bug,因為aof沒有rdb那麼簡單,但是呢為了防止bug的產生,aof就不會根據舊的指令去重構,而是根據當時快取中存在的資料指令去做重構,這樣就更加健壯和可靠了。

# aof 預設關閉,yes可以開啟

# aof 的檔名

# no:不同步

# always:每次操作都會備份,安全並且資料完整,但是慢性能差

# 重寫的時候是否要同步,no可以保證資料安全

# 重寫機制:避免檔案越來越大,自動優化壓縮指令,會fork乙個新的程序去完成重寫動作,新程序裡的記憶體資料會被重寫,此時舊的aof檔案不會被讀取使用,類似rdb

# 當前aof檔案的大小是上次aof大小的100% 並且檔案體積達到64m,滿足兩者則觸發重寫

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

如果你能接受一段時間的快取丟失,那麼可以使用rdb

如果你對實時性的資料比較care,那麼就用aof,最多丟失1秒的資料

使用rdb和aof結合一起做持久化,rdb做冷備,可以在不同時期對不同版本做恢復,aof做熱備,保證資料僅僅只有1秒的損失。當aof破損不可用了,那麼再用rdb恢復,這樣就做到了兩者的相互結合,也就是說redis恢復會先載入aof,如果aof有問題會再載入rdb,這樣就達到冷熱備份的目的了。

redis中的資料其實有限的,很多資料可能會自動過期,可能會被使用者刪除,可能會被redis用快取清除的演算法清理掉

redis中的資料會不斷淘汰掉舊的,就一部分常用的資料會被自動保留在redis記憶體中

所以可能很多之前的已經被清理掉的資料,對應的寫日誌還停留在aof中,aof日誌檔案就乙個,會不斷的膨脹,到很大很大

所以aof會自動在後台每隔一定時間做rewrite操作,比如日誌裡已經存放了針對100w資料的寫日誌了; redis記憶體只剩下10萬; 基於記憶體中當前的10萬資料構建一套最新的日誌,到aof中; 覆蓋之前的老日誌; 確保aof日誌檔案不會過大,保持跟redis記憶體資料量一致

redis 2.4之前,還需要手動開發一些指令碼去進行rewrite操作(crontab,通過bgrewriteaof命令去執行aof rewrite)但是redis 2.4之後,會自動進行rewrite操作

rewrite操作具體流程:

(1)redis fork乙個子程序

(2)子程序基於當前記憶體中的資料,構建日誌,開始往乙個新的臨時的aof檔案中寫入日誌

(3)redis主程序,接收到client新的寫操作之後,在記憶體中寫入日誌,同時新的日誌也繼續寫入舊的aof檔案

(4)子程序寫完新的日誌檔案之後,redis主程序將記憶體中的新日誌再次追加到新的aof檔案中

(5)用新的日誌檔案替換掉舊的日誌檔案

第五部分內容來自

redis持久化 AOF持久化

1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...

Redis 持久化機制(RDB和AOF)

一 rdb也叫snapshotting方式 1 機制 以快照的方式將記憶體中的資料寫入二進位制檔案中,在磁碟中會生成乙個.rdb的檔案。這種方式可以設定每個多長時間進行一次快照,即按照一定的策略週期性的持久化。注意 每次都是將記憶體中的資料完整的寫入磁碟,不是增量的更新。它是非同步的。工作原理簡單介...

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...