redis持久化-AOF
AOF :
Redis 預設不開啟。以日誌的形式記錄每一個寫操作,將redis執行過程中的所有命令記錄下來(讀操作不記錄),
只需追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後一次以完成資料的恢復工作。
AOF儲存的檔案是:appendonly.aof.
AOF持久化的實現
AOF持久化功能的實現可以分為命令追加、檔案寫入、檔案同步三個步驟。
命令追加:
當AOF持久化功能開啟時,伺服器在執行完一個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾。
AOF檔案的寫入與同步:
每當伺服器常規任務函式被執行、 或者事件處理器被執行時,aof.c/flushAppendOnlyFile函式都會被呼叫, 這個函式執行以下兩個工作:
WRITE:根據條件,將aof_buf中的快取寫入到 AOF 檔案。
SAVE:根據條件,呼叫fsync或fdatasync函式,將 AOF 檔案儲存到磁碟中。
兩個步驟都需要根據一定的條件來執行, 而這些條件由 AOF 所使用的儲存模式來決定, 以下小節就來介紹 AOF 所使用的三種儲存模式, 以及在這些模式下, 步驟 WRITE 和 SAVE 的呼叫條件。
Redis 目前支援三種 AOF 儲存模式,它們分別是:
AOF_FSYNC_NO:不儲存。
AOF_FSYNC_EVERYSEC:每一秒鐘儲存一次。
AOF_FSYNC_ALWAYS:每執行一個命令儲存一次。
--------------------------------------------------------------------------------------------------------------------------------
AOF持久化的三種策略:
你可以通過配置檔案配置 Redis 多久才將資料 fsync 到磁碟一次。
always
每次有新命令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全。
everysec
每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料。
推薦(並且也是預設)的措施為每秒 fsync 一次, 這種 fsync 策略可以兼顧速度和安全性。
no
從不 fsync :將資料交給作業系統來處理,由作業系統來決定什麼時候同步資料。更快,也更不安全的選擇。
always、everysec、no對比
命令 | 優點 | 缺點 |
---|---|---|
always | 不丟失資料 | IO開銷大,一般SATA磁碟只有幾百TPS |
everysec | 每秒進行與fsync,最多丟失1秒資料 | 可能丟失1秒資料 |
no | 不用管 | 不可控 |
推薦(並且也是預設)的措施為每秒 fsync 一次, 這種 fsync 策略可以兼顧速度和安全性。
--------------------------------------------------------------------------------------------------------------------------------------AOF 重寫
- AOF 持久化是通過儲存被執行的寫命令來記錄資料庫狀態的,所以AOF檔案的大小隨著時間的流逝一定會越來越大;影響包括但不限於:對於Redis伺服器,計算機的儲存壓力;AOF還原出資料庫狀態的時間增加;
- 為了解決AOF檔案體積膨脹的問題,Redis提供了AOF重寫功能:Redis伺服器可以建立一個新的AOF檔案來替代現有的AOF檔案,新舊兩個檔案所儲存的資料庫狀態是相同的,但是新的AOF檔案不會包含任何浪費空間的冗餘命令,通常體積會較舊AOF檔案小很多。
- AOF重寫並不需要對原有AOF檔案進行任何的讀取,寫入,分析等操作,這個功能是通過讀取伺服器當前的資料庫狀態來實現的。
- 首先從資料庫中讀取鍵現在的值,然後用一條命令去記錄鍵值對,代替之前記錄該鍵值對的多個命令;