Redis的两种持久化方式
?
Redis的高性能是由于其將所有的數據都存儲在了內存中,為了使Redis在重啟之后仍然能保證數據不丟失,需要將數據存內存中同步到硬盤中,這一過程就是持久化。Redis支持兩種方式的持久化,一種是RDB方式,一種是AOF方式。
一.RDB持久化
1.概述
在指定的時間間隔內將內存中的數據集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復時是將快照文件直接讀到內存里。
Redis會單獨創建(fork)一個子進程來進行持久化,會先將數據寫入到一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。整個過程中,主進程是不進行任何IO操作的,這就確保了極高的性能如果需要進行大規模數據的恢復,且對于數據恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最后一次持久化后的數據可能丟失。
2.Fork
fork的作用是復制一個與當前進程一樣的進程。新進程的所有數據(變量、環境變量、程序計數器等)數值都和原進程一致,但是是一個全新的進程,并作為原進程的子進程。
3.RDB持久化機制的配置
在redis.conf配置文件中有如下配置:
其中,上面配置的是RDB方式數據持久化時機:
4.如何觸發RDB快照
1)上述配置文件中默認的快照配置
2)命令save或者是bgsave
save時只管保存,其它不管,全部阻塞
bgsave時,Redis會在后臺異步進行快照操作,快照同時還可以響應客戶端請求。可以通過lastsave命令獲取最后一次成功執行快照的時間。
3)執行flushall命令,也會產生dump.rdb文件,但里面是空的,無意義
5.如何恢復數據
將備份文件 (dump.rdb) 移動到 redis 安裝目錄并啟動服務即可
6.如何停止RDB
動態所有停止RDB保存規則的方法:redis-cli config set save ""
7.RDB持久化的優點
①一旦采用該方式,那么整個Redis數據庫將只包含一個文件,這對于文件備份而言是非常完美的。
②對于災難恢復而言,RDB是非常不錯的選擇。因為我們可以非常輕松的將一個單獨的文件壓縮后再轉移到其它存儲介質上。
③性能最大化。對于Redis而言,在開始持久化時,它唯一需要做的就是fork出子進程,由子進程完成這些持久化工作,可以極大的避免服務器進程執行IO操作。
8.RDB持久化的缺點
①系統一旦在定時持久化之前出現宕機現象,此前沒有來得及寫入磁盤的數據都將丟失。
②由于RDB是通過frok子進程來協助完成數據持久化工作,因此,當數據集較大時,可以會導致整個服務器停止服務幾百毫秒,甚至是1秒鐘。
9.小總結
二.AOF持久化
1.概述
以日志的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構建數據,換言之,redis重啟的話就根據日志文件的內容將寫指令從前到后執行一次以完成數據的恢復工作。
2.AOF持久化機制配置
(1)開啟AOF持久化
將appendonly修改為yes,開啟aof持久化機制,默認會在目錄下產生一個appendonly.aof文件
(2)AOF持久化時機
上述配置為aof持久化的時機,解釋如下:
3.AOF啟動/修復/恢復
(1)正常恢復
①啟動:修改默認的appendonly no,改為yes
②將有數據的aof文件復制一份保存到對應目錄
③恢復:重啟redis然后重新加載
(2)異常恢復
①啟動:修改默認的appendonly no,改為yes
②備份被寫壞的AOF文件
③修復:redis-check-aof --fix 文件 進行修復
④恢復:重啟redis然后重新加載
4.rewrite
(1)是什么?
AOF采用文件追加方式,文件會越來越大為避免出現此種情況,新增了重寫機制,
當AOF文件的大小超過所設定的閾值時,Redis就會啟動AOF文件的內容壓縮,只保留可以恢復數據的最小指令集.可以使用命令bgrewriteaof
(2)重寫原理
AOF文件持續增長而過大時,會fork出一條新進程來將文件重寫(也是先寫臨時文件最后再rename),遍歷新進程的內存中數據,每條記錄有一條的Set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個內存中的數據庫內容用命令的方式重寫了一個新的aof文件,這點和快照有點類似。
(3)觸發機制
Redis會記錄上次重寫時的AOF大小,默認配置是當AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發
5.AOF持久化的優點
①該機制可以帶來更高的數據安全性,即數據持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是異步完成的,其效率也是非常高的,但是一旦系統出現宕機現象,那么這一秒鐘之內修改的數據將會丟失。
②由于該機制對日志文件的寫入操作采用的是append模式,因此在寫入過程中即使出現宕機現象,也不會破壞日志文件中已經存在的內容。然而如果我們本次操作只是寫入了一半數據就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,我們可以通過redis-check-aof工具來幫助我們解決數據一致性的問題。
③如果日志過大,Redis可以自動啟用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會創建一個新的文件用于記錄此期間有哪些修改命令被執行。因此在進行rewrite切換時可以更好的保證數據安全性。
④AOF包含一個格式清晰、易于理解的日志文件用于記錄所有的修改操作。事實上,我們也可以通過該文件完成數據的重建。
6.AOF持久化的缺點
①對于相同數量的數據集而言,AOF文件通常要大于RDB文件
②根據同步策略的不同,AOF在運行效率上往往會慢于RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB一樣高效。
7.小總結
?
總結
以上是生活随笔為你收集整理的Redis的两种持久化方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis入门(一)
- 下一篇: Redis的事务