Redis---數據持久化

redis數據持久化

redis提供了兩種不同的持久化方法將數據存儲到硬盤裏。

一、快照:

定義:在某個時間點,內存裏數據的副本,根據這個創建快照。
創建快照之後,可以對快照備份,複製到其他服務器或者留在原地,方便重啓服務器使用。
快照持久化配置選項

save 60 1000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump.rdb

根據配置,快照被寫入到dbfilename指定的文件內,並存儲在dir指定的路徑下。如果在新的快照創建完成之前,redis,系統,硬件這三個當中的一個崩潰了,那麼redis會丟失已經創建完快照之後時間點的數據。

創建快照的方法:
(1)客戶端向Redis發送BGSAVE命令創建一個快照。Redis會調用fork來創建一個子進程,子進程負責將快照寫入硬盤,父進程則繼續處理命令請求。
(2)客戶端向Redis發送SAVE命令創建一個快照。收到SAVE命令的Redis服務器在創建完快照之前將不再響應任何其他命令。所以這個命令並不常用。
(3)如果設置了SAVE配置選項,比如save 60 10000,意思就是說當60s之內有10000次寫入 這個條件滿足的話,redis就會自動觸發BGSAVE命令。如果用戶設置了多個save配置項,只要有一個條件滿足,redis就會觸發一次BGSAVE命令。
(4)收到SHUTDOWN請求關閉服務器時,會執行SAVE命令,阻塞所有客戶端,並在SAVE完成之後關閉服務器。
(5)主從服務器在發送sync命令開始一次複製操作的時候,如果主服務器沒有在執行BGSAVE操作或者並非剛剛執行BGSAVE操作,那麼它會執行BGSAVE命令。
快照持久化就是在系統崩潰後會損失一部分數據,是那些還沒有創建快照的數據,對於能夠容忍丟失一部分數據的應用來說是可以用的。

總結來說,RDB的觸發是通過手動和自動實現的。手動的就是bgsave和save命令。自動的是配置save m n,如果沒有配置save m n 則是關閉自動RDB的持久化。

二、只追加文件

簡稱AOF持久化。會將被執行的寫命令追加到AOF文件的末尾。以此來記錄數據發生的變化。Redis只要從頭到尾執行一次AOF文件中所有寫命令,就可以恢復AOF所記錄的數據集。
配置選項:

appendonly no //是否用AOF持久化
appendfsync everysec //多久將寫入的內容同步到硬盤
no-appendfsync-on-rewrite no 
auto-aof-rewrite-perentage 100
auto-aof-rewrite-min-size 64mb

dir ./

appendfsync 同步頻率
always:每個Redis寫命令都要同步寫入硬盤。會嚴重降低redis的速度。
everysec:每秒執行一次同步。
no:讓操作系統來決定應該何時進行同步。
一般用everysec命令。每秒同步AOF文件。

執行流程
命令追加:redis將寫命令追加到緩衝區。
文件寫入和文件同步:將緩衝區的內容同步到硬盤
文件重寫:定期進行文件重寫,達到壓縮文件的目的。

不足的地方就是AOF文件的大小。

所以現在就出現了文件重寫
文件重寫是定期重寫AOF文件,需要注意的是AOF重寫是將進程內的數據轉化爲寫命令,同步到新的AOF文件,不會對舊的AOF文件進行讀取和寫入操作。
文件重寫的觸發也分爲手動觸發和自動觸發。
手動觸發:直接調用bgrewriteaof,fork出子進程進行,在fork的時候阻塞。
自動觸發:配置項裏進行配置。

當服務器啓動時,會優先加載AOF,如果關閉AOF持久化,則會通過RDB恢復數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章