1. 程式人生 > 實用技巧 >Redis的AOF持久化

Redis的AOF持久化

Redis的AOF持久化

以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),aof儲存的是appendonly.aof檔案,只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。

Redis的AOF的配置

1. 找到redis.conf 開啟AOF

# Please check http://redis.io/topics/persistence for more information.
 
appendonly no

預設是no 改為yes 就是開啟AOF持久化

2. 生成AOF備份檔案的檔名稱

# The name of the append only file (default: "appendonly.aof")
 
appendfilename "appendonly.aof" 

3. 生成AOF備份檔案的檔案路徑

# Note that you must specify a directory here, not a file name.
dir  /usr/local/redis/bin/

4. AOF備份檔案的寫入策略

# appendfsync always
appendfsync everyse

預設值everysec,每秒寫一次(呼叫flush)。另外兩個值,always | no,分別表示每次redis寫命令之外就寫檔案,和由作業系統保證。always對硬碟壓力大,everysec是一個平衡值,no對硬碟壓力最小,但排程由系統控制,丟失資料風險最大.

5. 重寫檔案是否需要同步

# If you have latency problems turn this to "yes". Otherwise leave it as
# "no" that is the safest pick from the point of view of durability.
 
no-appendfsync-on-rewrite no

是否在後臺寫時執行同步,預設值no(表示需要同步).這裡的後臺寫,表示後臺正在重寫檔案(包括bgsavebgrewriteaof。其實關掉bgsave之後,主要的即是aof重寫檔案了).no表示新的主程序的set操作會被阻塞掉,而yes表示新的主程序的set不會被阻塞,待整個後臺寫完成之後再將這部分set操作同步到aof檔案中。但這可能會存在資料丟失的風險(機率很小),如果對效能有要求,可以設定為yes

,僅在後臺寫時會非同步處理命令.

6.AOF檔案重寫增長比例

auto-aof-rewrite-percentage 100

aof檔案增長比例,指當前aof檔案比上次重寫的增長比例大小。aof重寫即在aof檔案在一定大小之後,重新將整個記憶體寫到aof檔案當中,以反映最新的狀態(相當於bgsave)。這樣就避免了,aof檔案過大而實際記憶體資料小的問題(頻繁修改資料問題).

7.AOF檔案重寫最小的檔案大小

auto-aof-rewrite-min-size 64mb

AOF檔案重寫最小的檔案大小,即最開始aof檔案必須要達到這個檔案時才觸發,後面的每次重寫就不會根據這個變量了(根據上一次重寫完成之後的大小).此變數僅初始化啟動redis有效.如果是redis恢復時,則lastSize等於初始aof檔案大小.

AOF檔案的重寫

AOF為何有重寫的機制

redis中的資料是有限的,很多資料可能會自動過期,也有可能會被使用者刪除,但是這些操作都會被AOF檔案記錄下來,所有有可能存在AOF檔案越來越大的情況,意思就是說,重建資料集根本不需要執行所有AOF記錄的命令,為了處理這種情況,會有一種rewrite策略,在redis 2.4之前是需要手動執行BGREWRITEAOF命令來進行重寫AOF檔案,redis 2.4版本之後提供了自動rewrite的操作。我們可以配置rewrite的策略

就是上面提到的引數

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

最少AOF檔案需要達到64mb就會進行重寫,重寫了之後,當檢測到當前的AOP檔案增長幅度大於100%,也就是64mb,即當前的AOF檔案大小為128mb的時候,就會自動觸發對AOF進行重寫操作。

快照備份易恢復,檔案也小,但是如果遇到宕機等情況的時候快照的資料可能會不完整。AOF備份,資料完整度高,但是隨著系統的執行,AOF檔案的體積會越來越大,極其佔用硬碟的空間,AOF檔案的重寫在一定程度可以緩解這個問題。

當AOF的備份檔案過大時,手動輸入bgrewriteaof命令,進行檔案重寫

1.將redis.conf中的RDB持久化引數註釋

#save 900 1
#save 300 10
#save 60 10000

2.刪除目錄下的dump.rdb

[erayt@ERAYT-01 bin]$ rm -rf dump.rdb

3.將appendonly no改為 yes

# Please check http://redis.io/topics/persistence for more information.
 
appendonly yes

開啟AOF持久化

4.執行bgrewriteaof命令

127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
127.0.0.1:6379> 

5.檢視備份目錄,生成aof檔案

[erayt@ERAYT-01 bin]$ ls
appendonly.aof  log-redis.log  redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis.conf  redis-sentinel  redis-server
[erayt@ERAYT-01 bin]$