我們知道使用redis,讀寫資料的速度都很快是因為資料儲存在記憶體中,但是正是因為資料儲存在記憶體中,所以我們無可避免要面對乙個問題:一旦伺服器宕機,記憶體中的資料將會全部丟失。
當我們把redis用作快取的時候,伺服器宕機了,我們還可以從後端資料庫恢復資料,但是當我們把redis直接用作資料庫的時候,我們就沒辦法通過後端資料庫恢復了,所以此時我們就需要通過另外的方式來實現資料的持久化。1、如何用aof日誌實現資料持久化?
aof日誌是「寫後」日誌,意思即是redis先執行了命令,把資料寫入了記憶體了,再把命令記錄到日誌。(aof 裡記錄的是 redis 收到的每一條命令,這些命令是以文字形式儲存的)
為什麼aof是「寫後」日誌而不是「寫前」?
因為避免額外的檢查開銷,redis 在向 aof 裡面記錄日誌的時候,並不會先去對這些命令進行語法檢查。所以,如果先記日誌再執行命令的話,日誌中就有可能記錄了錯誤的命令,redis 在使用日誌恢復資料時,就可能會出錯。所以採取寫後日誌這種方式,就是先讓系統執行命令,只有命令能執行成功,才會被記錄到日誌中。
而且在命令執行後才記錄日誌,不會阻塞當前的寫操作。
2、aof的潛在風險
這兩個風險都是和 aof 寫回磁碟的時機相關的,所以我們得學會控制乙個寫命令執行完後 aof 日誌寫回磁碟的時機,這就和我們的寫回策略
有關了。
3、三種寫回策略
根據上面三種可想策略,其實我們細想一下就知道解決資料丟失問題和阻塞問題無法做到兩全其美,我們只能根據業務場景在效能和可靠性保證之間做取捨。
4、aof日誌檔案太大會有什麼影響?
因為aof是以檔案的形式在記錄接收到的所有寫命令。隨著接收的寫命令越來越多,aof 檔案會越來越大則會帶來以下問題:
檔案系統本身對檔案大小有限制,無法儲存過大的檔案;(1)怎麼解決aof日誌太大?(檔案過大,再往裡面追加命令記錄的話,效率也會變低;
如果發生宕機,aof 中記錄的命令需要被要乙個個被重新執行,用於故障恢復。此時日誌檔案太大,整個恢復過程就會非常緩慢,這就會影響到 redis 的正常使用。
aof 重寫機制
)aof 重寫機制
:aof 重寫機制就是在重寫時,redis 根據資料庫的現狀建立乙個新的 aof 檔案,也就是說,讀取資料庫中的所有鍵值對,然後對每乙個鍵值對用一條命令記錄它的寫入。例如我們對鍵testkey已經修改了幾次了,最後在資料庫的最新值是testvalue。重寫機制直接用一條set testkey testvalue的命令代替了前面的幾條修改命令,大大節省了空間。
(2)重寫是否會阻塞主線程?
通過重寫機制節省了很多空間,但是重寫這個過程是否會阻塞主線程呢?
答:不會的。重寫過程是由主線程fork出的後台子程序 bgrewriteaof 來完成的,fork 會把主線程的記憶體拷貝乙份給(3)重寫時如果主線程有新來的操作怎麼辦?bgrewriteaof 子程序,這裡面就包含了資料庫的最新資料。然後,bgrewriteaof
子程序就可以在不影響主線程的情況下,逐一把拷貝的資料寫成操作,記入重寫日誌。
答:如果有新來操作,新舊的aof日誌都有寫入。
因為主線程未阻塞,仍然可以處理新來的操作。此時,如果有寫操作,redis 會首先把這個操作寫到它正在使用的 aof5、總結日誌的緩衝區。這樣一來,即使宕機了,這個 aof
日誌的操作仍然是齊全的,可以用於恢復。而且這個操作也會被寫到重寫日誌的緩衝區。這樣,重寫日誌也不會丟失最新的操作。等到拷貝資料的所有操作記錄重寫完成後,重寫日誌記錄的這些最新操作也會寫入新的
aof 檔案,以保證資料庫最新狀態的記錄。此時,我們就可以用新的 aof 檔案替代舊檔案了。
本文為自己的閱讀總結,更多詳細內容參考原文:redis核心技術與實戰
redis持久化之AOF持久化
aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...
redis持久化之AOF
號外號外,新建 redis 交流討論群 332160890,歡迎加入!一 說明 1.1aof 相關配置項 配置項作用aof rewrite perc 百分比閾值,當 aof的增量超過這個閾值時,開始 aof的 rewrite操作 aof rewrite min size 當aof 的檔案大小超過該值...
Redis持久化之AOF
aof是redis的另一種持久化方式。什麼是aof?aof的實現原理 aof相關配置 redis的配置檔案 配置檔案的第934行 everysec 將aof buf快取區的所有內容寫入到aof檔案,如果上次同步aof檔案的時間與當前時間大於1秒,那麼會再次對aof檔案進行同步,同步操作由乙個執行緒專...