redis持久化原理詳解
一、 Redis 提供了不同級別的持久化方式:
Redis提供了兩種方式對資料進行持久化,分別是RDB和AOF。
RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存。
AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾。Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大。
如果你只希望你的資料在伺服器執行的時候存在,你也可以不使用任何持久化方式。
你也可以同時開啟兩種持久化方式,,在這種情況下,當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。
二、 配置檔案中對兩種儲存方式的設定
Redis預設開啟RDB的儲存方式。
1 2 3 |
|
對於AOF的儲存方式redis並沒有預設開啟。通過配置開啟如下:
把註釋去掉就開啟了AOF的儲存方式。
三、 RDB(Redis DataBase)介紹
開啟RDB方式redis會在指定的時間段內將記憶體中的資料快照到磁碟中,redis啟動時再恢復到記憶體中。
Redis會單獨建立(fork)一個執行緒,將資料寫入到臨時檔案中,持久化的過程都結束了,在用這個臨時檔案替換上次的臨時檔案。
如果需要進行大規模的資料恢復,並且對於資料恢復不是很敏感,RDB的方式比AOF方式更加高效,RDB的缺點就在於最後一次持久化後的資料有可能會丟失。
RDB持久化資料觸發配置在redis.conf中:
預設是當一條資料寫入時15分鐘持久化一次,當10條資料發生變化5分鐘(為了測試方便改成了2分鐘)持久化一次,當10000條資料發生變化1分鐘進行持久化。
RDB儲存方式測試:
兩分鐘後在資料夾中生成了一個dump.rdb的檔案,這個就是臨時檔案,儲存該臨時檔案。
再次清空資料庫:
然後刪除dum.rdb檔案,將dump.rdb.bk檔案恢復成dump.rdb。再啟動伺服器。
如上圖所示,redis中的資料已經從dump.rdb中恢復過來了。
四、 AOF(APPEND ONLY FILE)儲存介紹
以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),
只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis
重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。
注:所有的指令記錄也包括flushDB操作,後面會有坑。
在redis中這種儲存方式預設是關閉的,需要在redis.conf檔案中開啟,開啟方式在文中已經做了介紹,就不在贅述。
Redis對於AOF儲存方式是怎麼持久化的在redis.conf也有,如下:
配置檔案對於這種方式的持久化有三種方式:
1、 有寫操作就寫。顯然這種方式影響效能。但是資料完整,不會丟資料
2、 不開啟。不開啟AOF就沒意思了
3、 每秒寫檔案。折中的方式更加合適。但是有可能導致一秒的資料丟失。
AOF的重寫(Rewrite)
AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,
當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮。
重寫原理
AOF檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似。
觸發機制:
Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發。
AOF儲存方式優點:
1、 每秒同步。
2、 每修改同步。
AOF儲存方式缺點:
1、 AOF檔案遠大於EDB。
2、 執行效率慢。
AOF儲存方式測試:
1、寫入資料
3、 寫入之後在資料夾中出現了AOF檔案,再對這個檔案進行備份
4、 清空資料庫並退出
5、 恢復appendonly.aof檔案
6、 啟動redis伺服器,檢視資料
如圖所示資料已經恢復。
五、 同時開啟了RDB和AOF兩種方式預設是哪種方式?
從剛才測試AOF可以看出兩種方式同時開啟是使用AOF的儲存方式。
當只開啟了RBD方式時資料庫中有10條資料,當開啟了AOF方式之後,由於appendonly.aof檔案中沒有備份資料,所以啟動後如第二個框中框出的所示沒有資料。從這裡可以看出預設首先使用AOF的儲存方式。
六、 小結
1、 同時開啟兩種方式優先使用AOF方式。
2、 一般來說, 如果想達到足以媲美 PostgreSQL 的資料安全性, 你應該同時使用兩種持久化功能。
3、 如果你非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失, 那麼你可以只使用 RDB 持久化。
4、 有很多使用者都只使用 AOF 持久化, 但我們並不推薦這種方式: 因為定時生成 RDB 快照(snapshot)非常便於進行資料庫備份, 並且 RDB 恢復資料集的速度也要比 AOF 恢復的速度要快, 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程式的 bug 。