1. 程式人生 > >Redis持久化,RDB和AOF

Redis持久化,RDB和AOF

Redis強大的功能很大部分是由於他把資料快取在記憶體中,為了使Redis在重啟的時候,資料不丟失,就需要已某種方式把資料持久化到磁碟中。Redis持久化的方式有倆種,RDB和AOF。

RDB:快照方式,允許你每隔一段時間對記憶體資料做一次快照然後儲存到硬碟中。該方式是Redis預設的持久化方式。

RDB可以通過在配置檔案中配置時間或者改動鍵的個數來定義快照條件,編輯配置檔案redis.conf,找到

save 900 1  #15分鐘之內至少有一個建被更改則進行快照
save 300 10  #5分鐘之內至少有10個建被更改則進行快照
save 60 10000  #1分鐘之內至少有1000個建被更改則進行快照

他們之間是或的關係,RDB持久化到磁碟的檔案預設路徑是在當前目錄,檔名為dump.rdb,你可以通過配置檔案配置dir和dbfilename來指定檔案目錄和檔名稱,RDB檔案還可以進行壓縮,你可以通過配置rdbcompression引數來進行壓縮。

RDB快照過程:
1、Redis使用fork函式複製一份當前的父程序作為子程序
2、父程序繼續處理使用者的請求,子程序開始把記憶體中的資料持久化到磁碟上
3、當子程序把記憶體中的資料寫入到臨時檔案完成之後,會把該臨時檔案替換掉舊的RDB檔案。

RDB優點:RDB檔案內容緊湊,檔案小(比AOF檔案小)非常適合於災難恢復,而且能最大程度的使用Redis效能,因為Redis主程式可以fork一個子程序來單獨處理RDB持久化,而Redis主程序毋須參與這個過程,另外相對於AOF的資料恢復,RDB資料恢復比AOF快得多。

RDB缺點:由於RDB是間隔一段時間進行快照持久化,那麼有可能就在系統發生故障的時候,你就會丟失這段時間內的資料。另外由於RDB在處理持久化資料的時候,有可能就是在資料量龐大的時候,fork出的子程序會非常耗時,如果系統在這時候發生故障,那麼你就會丟失這段時間的資料。

由於RDB缺點的存在,Redis又有另外一種持久化的方式,AOF。

AOF:通過將傳送到伺服器的寫操作命令記錄下來,形成AOF檔案,檔案預設名稱是appendonly.aof,可以通過appendfilename來指定檔名稱。你可以通過配置檔案開啟AOF功能

appendonly yes

AOF的原理是直接把使用者插入到伺服器的命令追加到結尾,那麼檔案會原來越大,一些重複的寫命令也會越來越多,這時,我們可以利用BGREWRITEAOF 命令來重寫AOF,重寫的配置如下:

auto-aof-rewrite-percentage 100 #aof檔案大小超過上次重寫時檔案大小的百分之幾開始重寫,如果之前沒有寫過,則根據啟動時檔案大小。

auto-aof-rewrite-min-size 64mb #限制允許重寫時的最小檔案大小。

AOF在同步記憶體資料到磁碟上時,並不是馬上把檔案寫如到磁碟中,而是先把檔案快取到系統,然後每隔30秒將檔案寫入到磁碟中,我們可以在配置檔案中配置同步的策略

appendfsync always #每次都同步,保證資料不會丟失,但會慢
appendfsync everysec #每秒同步,系統默認同步策略
appendfsync no #不主動同步,由作業系統決定,快,但資料容易丟失

AOF同步過程:
1、Redis 執行 fork() ,現在同時擁有父程序和子程序。
2、子程序開始將新 AOF 檔案的內容寫入到臨時檔案。
3、對於所有新執行的寫入命令,父程序一邊將它們累積到一個記憶體快取中,一邊將這些改動追加到現有 AOF 檔案的末尾: 這樣即使在重寫的中途發生停機,現有的 AOF 檔案也還是安全的。
4、當子程序完成重寫工作時,它給父程序傳送一個訊號,父程序在接收到訊號之後,將記憶體快取中的所有資料追加到新 AOF 檔案的末尾。
5、搞定!現在 Redis 原子地用新檔案替換舊檔案,之後所有命令都會直接追加到新 AOF 檔案的末尾。