? ? ? ? Redis中數據都保存在內存,但是內存中的數據變換很快,也很容易丟失,比如連接斷開、宕機停機等等。而Redis提供的數據持久化機制有RDB(Redis DataBase)和AOF(Append Only File)。
1.RDB
????????RDB是指在指定的時間間隔內將內存中的數據集快照寫入到磁盤中,也是默認的持久化的方式,利用數據快照,使用的是寫時復制技術,將數據以二進制的格式保存在磁盤。
1.1觸發快照的時機(save)
1.1.1手動觸發
手動觸發分別對應save和bgsave命令:
-
save命令:阻塞當前Redis服務,去做持久化操作,直到RDB持久化過程完成為止,不推薦使用。
-
bgsave命令:redis進程執行fork操作創建子進程,子進程負責RDB持久化,完成后子進程自動結束,而且原進程的阻塞只發生在fork階段。
1.1.2自動觸發
????????利用save進行相關配置,我們進入到redis.conf文件中,其中Save m n就表示若在m秒里面至少進行了n次數據更改時會自動執行bgsave。
????????我們將需要持久化的數據寫入磁盤中保存,磁盤中的文件名為dump.rdb,和bin在同一個目錄,redis啟動時,就是讀取dump.rdb文件將數據加載進內存中的。文件的名字可在redis.conf文件里面進行修改。
?注意:
-
如果只開啟了rdb,通過shutdown save命令斷開Redis的連接時,也會自動執行bgsave。
-
在調試級別(debug)中重新啟動Redis時,不會清空內存中的數據,這意味著原有的RDB文件仍然有效,即使未執行保存操作。
-
當Redis執行全量復制(主從復制)時,如果沒有執行save或bgsave命令并且沒有添加配置策略,主節點會自動生成RDB文件,并傳輸給從節點進行數據同步。
1.2RDB持久化和數據恢復的完整流程(bgsave)
????????當需要進行持久化時,Redis會單獨創建一個子進程來完成持久化操作,這個子進程中所有的數據都和原進程保持一致,而且是一個全新的進程,也會占用內存,這個操作也稱為Fork。
????????此時原進程不進行任何操作,由其子進程完成數據的持久化,子進程會先將快照數據寫入到一個臨時的文件,等到數據寫完了之后,再用這個臨時的文件直接替換磁盤上的dump.rdb文件即可。
????????但是缺點是如果子進程正在將數據寫入臨時文件,此時突然宕機,無法將臨時文件替換dump.rdb,下次啟動后,恢復后的內存數據較與宕機之前相比就會丟失一部分。
????????發現整個過程中,原進程是不進行任何IO操作的,這就確保了極高的性能。
1.3RDB方式的優劣分析
1.3.1優點
-
恢復數據速度快。
-
節省磁盤空間(二進制格式存儲)。
1.3.2缺點
-
fork的時候,會占用內存空間。
-
可能會丟失數據,不適用于數據一致性高的場景。
2.AOF
以日志的形式來記錄每個更改的操作,不會記錄讀的操作,只允許追加而不允許改寫。在redis重啟或啟動之初會讀取該文件然后重新構建Redis數據庫的數據,這樣也不用害怕內存數據的丟失了。
AOF方式Redis默認是不開啟的,如果要開啟則需要在配置文件中修改,若AOF和RDB同時開啟,系統默認選擇用AOF來恢復數據,AOF在磁盤中保存的日志文件是"appendonly.aof",文件的路徑和RDB一致。
2.1AOF同步頻率策略
-
appendsync always :表示每次的修改都會立刻記入磁盤日志文件,性能較差但是能保證數據的一致性。
-
appendsync everysec (默認) :每一秒執行一次數據同步,但可能會在臨界點丟失數據。
-
appendfsync no:redis不主動進行同步,把同步時機交給操作系統。
2.2Rewrite壓縮
因為AOF采用的是追加寫入的方式,為了避免磁盤AOF文件越來越大,新增了重寫機制,當文件默認達到128MB時,Redis就會自動進行AOF文件的內容壓縮,保留能達到最終結果的最小指令集。
2.2.1重寫的整體流程梳理(自動的)
-
主進程fork一個子進程去執行重寫的操作,主進程正常運行不會阻塞。
-
主進程執行的寫操作要同時寫入AOF緩沖區和AOF_rewrite緩沖區,此時子進程遍歷內存數據將自己壓縮的指令集先存儲到臨時文件(新AOF文件),之后向主進程發送信號。
注意:這里AOF緩沖區是否要根據同步策略將數據同步到磁盤AOF文件中?
可以進行設置。如果同步,那么數據安全一致性,但是性能會比較低。如果不同步,若此時宕機,會造成數據丟失,但是性能比較高。
-
主進程把AOF_rewrite緩沖區中的數據寫入到臨時文件中。
-
使用臨時文件(新AOF文件)覆蓋舊的AOF文件,完成AOF重寫。
2.3AOF持久化和數據恢復的完整流程
-
寫操作命令先會被追加寫入到AOF緩沖區內。
-
AOF緩沖區根據同步頻率策略將緩沖區數據同步到磁盤AOF文件中。
-
看磁盤AOF文件大小是否超過閾值,判斷要不要rewrite重寫。
-
如果Redis宕機,重啟服務時,會加載AOF文件來進行數據恢復。
2.4AOF文件出現損壞
????????如遇到AOF文件損壞,通過.........../bin/redis-check-aof--fix appendonly.aof進行恢復。恢復后重啟Redis服務即可。
2.5AOF方式的優劣分析
2.4.1優點
-
備份機制更加的穩健,丟失數據概率更低。
-
可讀的日志文件。
2.4.2缺點
-
相比RDB占用更多的磁盤空間。
-
恢復數據相比RDB更慢。
-
如果每次寫操作都同步,對性能要求較高。
-
AOF文件可能出現損壞,需要手動修復。
????????????????