一文了解:Redis的AOF持久化

阿克西斯教成員汙米飯發表於2019-08-12

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原理

啟動AOF持久化

在redis.conf檔案中

appendonly no  #寫成yes,開啟AOF持久化

AOF寫入頻率

# appendfsync always    
appendfsync everysec   # 預設
# appendfsync no
  1. alaws:總是同步到AOF檔案,每一個命令都寫入,安全,速度慢
  2. everysec:每秒寫入一次,安全性好,最多丟失1秒鐘的資料
  3. 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

優缺點

優點

  1. 比RDB檔案可靠,everysec模式下只丟1秒資料。
  2. AOF檔案為純文字檔案。檔案協議格式容易恢復成Redis命令。
  3. AOF檔案太大會進行自動重寫。

缺點

  1. 同等資料下,比RDB檔案大。
  2. 同步過程中Redis主程式會被阻塞,everysec是個折中方案。

資料恢復

Redis讀取AOF檔案資料還原過程

  1. 建立一個不帶網路的客戶端
  2. 讀取AOF檔案內容,還原成命令
  3. 將命令在1中的客戶端執行
  4. 重複2,3的過程

結語

本人深知水平有限,歡迎指正本文錯誤之處。


logo

相關文章