《Redis設計與實現》 AOF持久化

2022-01-13 23:26:30 字數 1332 閱讀 9907

redis aof 持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。

aof持久化

當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式將被執行的寫命令追加到伺服器狀態的 aof_buf快取區的末尾。

檔案的寫入和同步

為了提高檔案的寫入效率,在現代作業系統中,當使用者呼叫 write 函式,將一些資料寫入到檔案的時候,作業系統通常會將寫入資料暫時儲存在乙個記憶體緩衝區裡面,等到緩衝區空間被填滿,或者超過了指定的時限後,才真正地將緩衝區中的資料寫入到磁碟裡面。

這種做法雖然提高了效率,但也為寫入資料帶來了安全性問題,因為如果計算機發生停機,那麼儲存在記憶體緩衝區裡面的寫入資料將會丟失。

為此,系統提供了 fsync 和 fdatasync 兩個同步函式,它們可以強制作業系統立刻將緩衝區中的資料寫入到硬碟裡邊,從而確保寫入資料的安全性。

持久化行為

效率安全性

always

將 aof_buf 緩衝區中的所有內容寫入並同步到aof檔案(儲存到磁碟)

最慢最安全,即使故障停機,aof持久化也只會丟失乙個事件迴圈中所產生的命令資料

everysec

將 aof_buf 緩衝區中的所有內容寫入到aof檔案,如果上次同步的aof檔案的時間距離現在超過一秒鐘,那麼再次對aof檔案進行同步,並且這個同步操作是由乙個子執行緒專門負責執行

足夠快故障停機,資料庫也只丟失一秒鐘的命令資料

no將 aof_buf 緩衝區中的所有內容寫入aof檔案,但並不對aof檔案進行同步,何時同步由作業系統決定

最快故障停機時,會丟失上次同步aof檔案之後所有寫命令資料

為了解決aof檔案體積膨脹的問題,redis提供了aof檔案重寫功能。

aof檔案重寫是通過讀取伺服器當前資料庫狀態來實現的,與現有的aof檔案沒任何關係,不會對現有的aof檔案進行任何的讀取、分析或者寫入操作。

redis 將aof重寫程式放到子程序中直行,防止伺服器因aof重寫而無法處理請求。

redis使用子程序處理aof重寫的好處:

- 子程序進行aof重寫期間,伺服器程序可以繼續處理命令請求

- 子程序帶有伺服器程序的資料副本,使用子程序而不是執行緒,可以在避免使用鎖的情況下,保證資料的安全性

為了解決資料不一致的問題,redis伺服器設定了乙個aof重寫緩衝區,這個快取區在伺服器建立了子程序之後開始使用,當redis伺服器執行完乙個寫命令後,它會同時將這個寫命令傳送給aof快取區和aof重寫快取區。

當子程序完成重寫工作後,向父程序傳送乙個訊號,父程序接收到訊號後,呼叫訊號處理函式(這個過程伺服器程序是阻塞的,不能處理新命令請求):

《Redis設計與實現》 AOF持久化

redis aof 持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。aof持久化 當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式將被執行的寫命令追加到伺服器狀態的 aof buf快取區的末尾。檔案的寫入和同步 為了提高檔案的寫入效率,在現代作業系統中,當...

Redis設計與實現 十 AOF持久化

上個文章說到了rdb的持久化的過程以及rdb的檔案是如何進行儲存的。和rdb不同的是,aof的操作是通過把指令乙個個儲存入檔案的,進行載入的時候就是乙個個的command進行讀取,也就是模擬了一遍某時間段內的所有的操作。aof持久化需要將所有寫命令記錄在檔案中來儲存伺服器狀態,而檔案寫入操作效率比較...

redis持久化RDB與AOF

redis是一種記憶體型資料庫,一旦伺服器程序退出,資料庫的資料就會丟失,為了解決這個問題,redis提供了兩種持久化的方案,將記憶體中的資料儲存到磁碟中,避免資料的丟失。redis提供了rdb持久化的功能,這個功能可以將redis在記憶體中的的狀態儲存到硬碟中,它可以手動執行。也可以再redis....