Redis的AOF持久化
每當Redis-Server接收到寫資料時,就把命令以文字形式追加到AOF檔案裡,當重啟Redis服務時,AOF檔案裡的命令會被重新執行一次,重新恢復資料。當AOF過大時將重寫AOF檔案。
工作原理
> lpush list 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
appendonly.aof檔案中
*2
$6
SELECT
$1
0
*6
$5
lpush
$4
list
$1
1
$1
2
$1
3
$1
4
*2
$4
lpop
$4
list
可以看到上面的示例中寫操作有lpush和lpop命令,在AOF檔案中存在lpush和lpop。SELECT命令為AOF程式自動加上的選擇資料庫。
AOF命令寫入的內容為文字協議格式,如:命令lpush list 1 2 3 4 的文字形式為"*6\r\n$5\r\nlpushr\n$4r\nlist\r\n$1\r\n1$1\r\n2$1\r\n3$1\r\n4\r\n"。將文字內容追加到aof_buf(緩衝區)中,AOF緩衝區根據相應的策略同步寫入AOF檔案中,當AOF檔案越來越大時,將AOF檔案重寫。
啟動AOF持久化
在redis.conf檔案中
appendonly no #寫成yes,開啟AOF持久化
AOF寫入頻率
# appendfsync always
appendfsync everysec # 預設
# appendfsync no
- alaws:總是同步到AOF檔案,每一個命令都寫入,安全,速度慢
- everysec:每秒寫入一次,安全性好,最多丟失1秒鐘的資料
- no:寫入AOF檔案工作交給作業系統,由作業系統寫入AOF檔案,安全性一般
檔案
aof檔案目錄通過RDB檔案目錄,他們共享同一個目錄
dir ./
appendfilename "appendonly.aof"
通過config set dir {newDir}
動態修改dir配置
通過config set dbfilename {appendfilename}
動態修改AOF檔名稱
重寫
AOF檔案過大時,Redis將fork()一個子程式對記憶體資料進行比那裡逆化成Redis命令,序列化文字格式後寫入到新的AOF檔案中。然後將重寫時發生的增量AOF檔案追加到新的AOF檔案中,最後替換舊的AOF檔案。
自動重寫
auto-aof-rewrite-percentage 100 # 比上次重寫時檔案增大了100%就重寫AOF檔案
auto-aof-rewrite-min-size 64mb # AOF檔案至少超過為64M時重寫AOF檔案
自動重寫必須滿足:當前AOF檔案大小 > auto-aof-rewrite-min-size &&(當前檔案AOF檔案大小減去上次重寫時AOF檔案大小)除以 上次重寫時AOF檔案大小 = auto-aof-rewrite-percentage
手動重寫
> bgrewriteaof
Background append only file rewriting started
優缺點
優點
- 比RDB檔案可靠,everysec模式下只丟1秒資料。
- AOF檔案為純文字檔案。檔案協議格式容易恢復成Redis命令。
- AOF檔案太大會進行自動重寫。
缺點
- 同等資料下,比RDB檔案大。
- 同步過程中Redis主程式會被阻塞,everysec是個折中方案。
資料恢復
Redis讀取AOF檔案資料還原過程
- 建立一個不帶網路的客戶端
- 讀取AOF檔案內容,還原成命令
- 將命令在1中的客戶端執行
- 重複2,3的過程
結語
本人深知水平有限,歡迎指正本文錯誤之處。