除了RDB持久化功能之外,Redis還提供了AOF持久化功能。與RDB持久化通過保存資料庫中的鍵值對來記錄資料庫狀態不同,AOF持久化是通過保存Redis伺服器所執行的寫命令來記錄資料庫狀態的。 伺服器在啟動時,可以通過載入和執行AOF文件中保存的命令來還原伺服器關閉前的資料庫狀態。 AOF持久化功 ...
除了RDB持久化功能之外,Redis還提供了AOF持久化功能。與RDB持久化通過保存資料庫中的鍵值對來記錄資料庫狀態不同,AOF持久化是通過保存Redis伺服器所執行的寫命令來記錄資料庫狀態的。
伺服器在啟動時,可以通過載入和執行AOF文件中保存的命令來還原伺服器關閉前的資料庫狀態。
AOF持久化功能的實現可以分為命令追加append、文件寫入、文件同步sync三個步驟。
1、伺服器在執行完一個寫命令後,會議協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區末尾。
2、Redis的伺服器進程是一個時間迴圈,這個迴圈中的文件事件負責接收客戶端的命令請求,以及回覆,而時間事件則負責執行定時運行的函數,所以伺服器每次結束一個事件迴圈之前他都會調用flushAppendOnlyFile函數,考慮(appendfsync配置)是否將aof_buf緩衝區的內容寫入和保存到AOF文件中。
appendfsync值:always(每個事件迴圈都要同步將aof_buf中的內容寫入AOF文件)、everysec (每秒)、no(每個事件迴圈都要寫,但是時寫入系統緩衝區)
AOF數據還原:
1、創建一個不帶網路的偽客戶端(redis只能在客戶端中執行)
2、從APF文件中分析並讀出一條寫命令3、使用偽客戶端執行被讀出的寫命令4、重覆2、3步驟 直到全部處理完成。
AOF重寫
為解決AOF文件膨脹問題,Redis創建一個新的AOF文件,兩個APF文件保存的資料庫狀態一樣,但是新的AOF文件去掉了冗餘的命令。
AOF重寫不需要讀取舊的AOF文件,而是直接讀取資料庫中的鍵值,合併多次寫入一個key,保存成一條寫入命令。
AOF重寫不會阻塞主進程,而是創建一個帶有伺服器進程的數據副本的子進程,保證在使用鎖的情況下數據安全性。
Redis伺服器設置有一個AOF重寫緩衝區,這個緩衝區是在子進程創建後,Redis主進程每執行一條寫命令,同時會將寫命令發送到AOF緩衝區和AOF重寫緩衝區,保證了AOF在重寫時數據同步問題。
AOF重寫完成後,向父進程發送信號,父進程將內容寫入新的AOF文件,並改名覆蓋掉原先的AOF文件,完成新舊文件的替換,在這個過成功,只有信號處理函數執行時 ,伺服器進程造成阻塞,AOF後臺重寫不會阻塞進程。
每天學一點,總會有收穫。
說明:尊重作者知識產權,文中內容參考《Redis設計與實現》,僅在此做學習與大家分享。