reids持久化之AOF

2021-10-06 10:03:16 字數 2432 閱讀 2751

1 前言

rdb 的缺陷是最後一次持久化後的資料可能丟失。而aof就是用來解決這個問題的.

2 簡介

3 aof的重寫

aof採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當aof檔案的大小超過所設定的閾值時,redis就會啟動aof檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof.

aof檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了乙個新的aof檔案,這點和快照有點類似.

redis會記錄上次重寫時的aof大小,預設配置是當aof檔案大小是上次rewrite後大小的一倍且檔案大於64m時觸發.

4 配置

#aof持久化,是否記錄更新操作日誌,預設redis是非同步(快照)把資料寫入本地磁碟

#指定更新日誌檔名

# 不同步,資料不會持久化

# 當aof日誌檔案即將增長到指定百分比時,redis通過呼叫bgrewriteaof是否自動重寫aof日誌檔案。

# aof自動重寫%比。當目前aof檔案大小超過上一次重寫的aof檔案大小的百分之多少進行重寫,即當aof檔案增長到一定大小的時候redis能夠呼叫bgrewriteaof對日誌檔案進行重寫。當前aof檔案大小是上次日誌重寫得到aof檔案大小的二倍(設定為100)時,自動啟動新的日誌重寫過程。

auto-aof-rewrite-percentage 100

#設定允許重寫的最小aof檔案大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫

auto-aof-rewrite-min-size 64mb

#aof檔案可能在尾部是不完整的,當redis啟動的時候,aof檔案的資料被載入記憶體。重啟可能發生在redis所在的主機作業系統宕機後,尤其在ext4檔案系統沒有加上data=ordered選項(redis宕機或者異常終止不會造成尾部不完整現象。)出現這種現象,可以選擇讓redis退出,或者匯入盡可能多的資料。如果選擇的是yes,當截斷的aof檔案被匯入的時候,會自動發布乙個log給客戶端然後load。如果是no,使用者必須手動redis-check-aof修復aof檔案才可以。

aof-load-truncated yes

5 演示

6 修復

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-cjgazmk5-1590223614333)(e:\redis筆記\aof損壞.png)]

啟動伺服器

發現伺服器無法啟動,看到rdb和aof同時存在,說明優先讀取的是aof檔案,因為aof檔案損壞導致啟動失敗.

修復方法:

[root@dason bin]

'x 6e: expected prefix '*',

got: '

aof analyzed: size=196, ok_up_to=110, diff=86

this will shrink the aof from 196 bytes, with 86 bytes, to 110 bytes

continue?

[y/n]

: ysuccessfully truncated aof

[root@dason bin]

# redis-server /myredis/redis_aof.conf

14046:c 23 feb 2020 22:01:

25.646

# oo0ooo0ooo0oo redis is starting oo0ooo0ooo0oo

14046:c 23 feb 2020 22:01:

25.646

# redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=14046, just started

14046:c 23 feb 2020 22:01:

25.646

# configuration loaded

[root@dason bin]

# redis-cli -p 6379

127.0.0.1:6379> keys *

1) "k3"

2) "k2"

3) "k1"

7 優劣勢

劣勢:相同資料集的資料而言aof檔案要遠大於rdb檔案,恢復速度慢於rdb…

如果一秒內宕機,也會有資料丟失.

rewrite的最後將rewrite過程中產生的新資料寫到新檔案造成的阻塞幾乎是不可避免的.

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...

redis持久化之AOF

號外號外,新建 redis 交流討論群 332160890,歡迎加入!一 說明 1.1aof 相關配置項 配置項作用aof rewrite perc 百分比閾值,當 aof的增量超過這個閾值時,開始 aof的 rewrite操作 aof rewrite min size 當aof 的檔案大小超過該值...

Redis持久化之AOF

aof是redis的另一種持久化方式。什麼是aof?aof的實現原理 aof相關配置 redis的配置檔案 配置檔案的第934行 everysec 將aof buf快取區的所有內容寫入到aof檔案,如果上次同步aof檔案的時間與當前時間大於1秒,那麼會再次對aof檔案進行同步,同步操作由乙個執行緒專...