Redis學習筆記(九) 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背景重寫不會阻塞程序。
原文位址
https://www.cnblogs.com/xtt321/p/12906800.html