redis的兩種持久化機制


---恢復內容開始---

RDB:在指定的時間間隔對redis中的數據進行快照存儲,默認開啟

AOF:記錄每次操作redis的命令,將命令寫入到AOF文件中,當重啟redis時會重新執行這些命令來恢復數據,默認關閉。

RDB方式:

           Redis會根據redis.conf配置文件定期將數據快照至一個RDB文件中:

           save [seconds] [changes]:意為每seconds秒內如果數據有changes次修改,那么就進行一次rdb快照存儲。可配置多條save指令,讓redis執行多級的快照保存策略。

RDB工作原理:RDB持久化是指在指定的時間間隔內對內存中的數據進行一次快照存儲,寫入本地磁盤中。實際操作過程是先fork一個子進程,再將數據寫入到一個臨時文件中,寫入成功后,再將之前的文件替換,用二進制壓縮存儲的。RDB是redis默認的持久化方式,會在對應的目錄下產生一個dump.rdb的文件,重啟redis會加載這個dump.rdb文件,恢復原始數據。

 

RDB的觸發分為兩種:手動觸發和自動觸發。

   手動觸發可以是:

         save:    該命令會阻塞redis,在sava期間,不能執行其他命令,直到持久化完成。

         bgsave:該命令不會阻塞redis,在后台進行的。該觸發方式會fork一個子進程,由子進程負責持久化,因此阻塞只會發生在fork子進程的時候。

  自動觸發:

          save m n:根據redis配置文件配置規則自動觸發。

         從節點全量復制時,主節點發送一個rdb文件給從節點完成復制操作時,主節點會觸發bgsave。

        執行debug reload時自動觸發RDB持久化。

         執行shutdown時,若沒有開啟aof  也會觸發RDB持久化。

 

   注意:fork操作會阻塞redis,導致redis讀寫性能下降,我們可以通過控制單個redis實例的最大內存,來盡可能降低fork時的消耗。也可通過減少自動觸發的頻率,減少fork次數。

 RDB優點:

            對性能影響最小:因為它會fork一個子進程來完成持久化操作,幾乎不影響redis處理客戶端請求的效率。

            他可以按照每小時,每分鍾,每天來進行快照存儲,可以作為一種可靠的災難恢復手段。

            數據恢復比AOF要快很多。

RDB缺點  :

                如果更新數據后,還沒來得及持久化,redis就宕機了,那么更新的數據就會丟失。

              如果redis中的數據非常多且CPU處理能力不足的情況下,在fork子進程的時候就會消耗更長的時間,這時若對redis進行額外的操作的話,redis處理這個操作的時間就更長。

 

AOF方式:

         

  • AOF工作原理

          采用AOF持久方式時,Redis會把每一個寫請求都記錄在一個日志文件里。在Redis重啟時,會把AOF文件中記錄的所有寫操作順序執行一遍,確保數據恢復到最新。

 

          AOF的整個流程大體分為兩步,一步是命令的實時寫入(如果是 appendfsync everysec 配置,會有1s損耗),第二步是對aof文件的重寫(重寫是直接把當前內存的數據生成對應命令)。

         對於增量追加到文件這一步主要的流程是:命令寫入=》追加到aof_buf =》同步到aof磁盤。那么這里為什么要先寫入buf在同步到磁盤呢?如果實時寫入磁盤會帶來非常高的磁盤IO,影響整體性能。

         aof重寫的目的是為了減少aof文件的大小,可以手動或者自動觸發。

       手動觸發: bgrewriteaof自動觸發 就是根據配置規則來觸發。

 

  • AOF如何配置:

                      AOF默認是關閉的,如要開啟,進行如下配置:appendonly yes。AOF提供了三種fsync配置,always/everysec/no,通過配置項[appendfsync]指定:

                     appendfsync no:不進行fsync,將flush文件的時機交給OS決定,速度最快

                     appendfsync always:每寫入一條日志就進行一次fsync操作,數據安全性最高,但速度最慢

                    appendfsync everysec:折中的做法,交由后台線程每秒fsync一次

 

               隨着AOF不斷地記錄寫操作日志,因為所有的操作都會記錄,所以必定會出現一些無用的日志。大量無用的日志會讓AOF文件過大,也會讓數據恢復的時間過長。不過Redis提供了AOF rewrite功能,可以重寫AOF文件,只保留能夠把數據恢復到最新狀態的最小寫操作集。

 

                AOF rewrite可以通過BGREWRITEAOF命令觸發,也可以配置Redis定期自動進行:

            auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

             上面兩行配置的含義是,Redis在每次AOF rewrite時,會記錄完成rewrite后的AOF日志大小,當AOF日志大小在該基礎上增長了100%后,自動進行AOF rewrite。同時如果增長的大小沒有達到64mb,則不會進行rewrite。

 

              AOF的優點:

 最安全,在啟用appendfsync always時,任何已寫入的數據都不會丟失,使用在啟用appendfsync everysec也至多只會丟失1秒的數據。

AOF文件在發生斷電等問題時也不會損壞,即使出現了某條日志只寫入了一半的情況,也可以使用redis-check-aof工具輕松修復。

AOF文件易讀,可修改,在進行了某些錯誤的數據清除操作后,只要AOF文件沒有rewrite,就可以把AOF文件備份出來,把錯誤的命令刪除,然后恢復數據。

 

          AOF的缺點:

       AOF文件通常比RDB文件更大

       性能消耗比RDB高

       數據恢復速度比RDB慢

            

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM