一篇文章徹底了解Redis持久化:RDB和AOF
為什麼需要持久化?
Redis對資料的操作都是基于記憶體的,當遇到了程序退出、伺服器當機等意外情況,如果沒有持久化機制,那麼Redis中的資料将會丢失無法恢複。有了持久化機制,Redis在下次重新開機時可以利用之前持久化的檔案進行資料恢複。了解和掌握Redis的持久機制,對于Redis的日常開發和運維都有很大幫助,也是在大廠面試經常被問到的知識點。Redis支援的兩種持久化機制:
RDB:把目前資料生成快照儲存在硬碟上。
AOF:記錄每次對資料的操作到硬碟上。
接下來,我們詳細了解一下這兩種持久化機制。
RDB持久化
RDB(Redis DataBase)持久化是把目前Redis中全部資料生成快照儲存在硬碟上。RDB持久化可以手動觸發,也可以自動觸發。
手動觸發
save和bgsave指令都可以手動觸發RDB持久化。
save指令
執行save指令會手動觸發RDB持久化,但是save指令會阻塞Redis服務,直到RDB持久化完成。當Redis服務儲存大量資料時,會造成較長時間的阻塞,不建議使用。
save
OK
執行後,Redis的日志中記錄:
-
DB saved on disk
bgsave指令
執行bgsave指令也會手動觸發RDB持久化,和save指令不同是:Redis服務一般不會阻塞。Redis程序會執行fork操作建立子程序,RDB持久化由子程序負責,不會阻塞Redis服務程序。Redis服務的阻塞隻發生在fork階段,一般情況時間很短。
bgsave
Background saving started
- Background saving started by pid 2645
- RDB: 0 MB of memory used by copy-on-write
-
Background saving terminated with success
bgsave指令的具體流程如下圖:
執行bgsave指令,Redis程序先判斷目前是否存在正在執行的RDB或AOF子線程,如果存在就是直接結束。
Redis程序執行fork操作建立子線程,在fork操作的過程中Redis程序會被阻塞。
Redis程序fork完成後,bgsave指令就結束了,自此Redis程序不會被阻塞,可以響應其他指令。
子程序根據Redis程序的記憶體生成快照檔案,并替換原有的RDB檔案。
子程序通過信号量通知Redis程序已完成。
自動觸發
除了執行以上指令手動觸發以外,Redis内部可以自動觸發RDB持久化。自動觸發的RDB持久化都是采用bgsave的方式,減少Redis程序的阻塞。那麼,在什麼場景下會自動觸發呢?
在配置檔案中設定了save的相關配置,如sava m n,它表示在m秒内資料被修改過n次時,自動觸發bgsave操作。
當從節點做全量複制時,主節點會自動執行bgsave操作,并且把生成的RDB檔案發送給從節點。
執行debug reload指令時,也會自動觸發bgsave操作。
執行shutdown指令時,如果沒有開啟AOF持久化也會自動觸發bgsave操作。
RDB優點
RDB檔案是一個緊湊的二進制壓縮檔案,是Redis在某個時間點的全部資料快照。是以使用RDB恢複資料的速度遠遠比AOF的快,非常适合備份、全量複制、災難恢複等場景。
RDB缺點
每次進行bgsave操作都要執行fork操作建立子經常,屬于重量級操作,頻繁執行成本過高,是以無法做到實時持久化,或者秒級持久化。
另外,由于Redis版本的不斷疊代,存在不同格式的RDB版本,有可能出現低版本的RDB格式無法相容高版本RDB檔案的問題。
AOF持久化
AOF(Append Only File)持久化是把每次寫指令追加寫入日志中,當需要恢複資料時重新執行AOF檔案中的指令就可以了。AOF解決了資料持久化的實時性,也是目前主流的Redis持久化方式。
AOF持久化流程
AOF流程如下圖:
指令追加(append):所有寫指令都會被追加到AOF緩存區(aof_buf)中。
檔案同步(sync):根據不同政策将AOF緩存區同步到AOF檔案中。
檔案重寫(rewrite):定期對AOF檔案進行重寫,以達到壓縮的目的。
資料加載(load):當需要恢複資料時,重新執行AOF檔案中的指令。
檔案同步政策
AOF持久化流程中的檔案同步有以下幾個政策:
always:每次寫入緩存區都要同步到AOF檔案中,硬碟的操作比較慢,限制了Redis高并發,不建議配置。
no:每次寫入緩存區後不進行同步,同步到AOF檔案的操作由作業系統負責,每次同步AOF檔案的周期不可控,而且增大了每次同步的硬碟的資料量。
eversec:每次寫入緩存區後,由專門的線程每秒鐘同步一次,做到了兼顧性能和資料安全。是建議的同步政策,也是預設的政策。
觸發檔案重寫
AOF持久化流程中的檔案重寫可以手動觸發,也可以自動觸發。
手動觸發:使用bgrewriteaof指令。
自動觸發:根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage配置确定自動觸發的時機。auto-aof-rewrite-min-size表示運作AOF重寫時檔案大小的最小值,預設為64MB;auto-aof-rewrite-percentage表示目前AOF檔案大小和上一次重寫後AOF檔案大小的比值的最小值,預設為100。隻用前兩者同時超過時才會自動觸發檔案重寫。
AOF持久化配置
對AOF持久化的具體流程有了了解後,我們來看一下如何配置AOF。AOF持久化預設是不開啟的,需要修改配置檔案,如:
appendonly改為yes,開啟AOF
appendonly yes
AOF檔案的名字
appendfilename "appendonly.aof"
AOF檔案的寫入方式
everysec 每個一秒将緩存區内容寫入檔案 預設開啟的寫入方式
appendfsync everysec
運作AOF重寫時AOF檔案大小的增長率的最小值
auto-aof-rewrite-percentage 100
運作AOF重寫時檔案大小的最小值
auto-aof-rewrite-min-size 64mb
作者:萬貓學社
出處:
http://www.cnblogs.com/heihaozi/