溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis6.x持久化之AOF的示例分析

發(fā)布時(shí)間:2021-09-09 16:55:09 來(lái)源:億速云 閱讀:102 作者:柒染 欄目:編程語(yǔ)言

Redis6.x持久化之AOF的示例分析,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

AOF概述

默認(rèn)的AOF持久化策略是每秒鐘fsync一次,fsync是指把緩存中的寫指令記錄到磁盤中,在這種情況下,Redis仍可以保持很高的性能。

當(dāng)然由于OS會(huì)在內(nèi)核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會(huì)丟失部分修改。不過(guò)可以通過(guò)配置文件告訴Redis,想要通過(guò)fsync函數(shù)強(qiáng)制os寫入到磁盤的時(shí)機(jī)。

AOF方式在同等數(shù)據(jù)規(guī)模的情況下,AOF文件要比RDB文件的體積大,因此AOF方式的恢復(fù)速度也要慢于RDB方式。

AOF優(yōu)缺點(diǎn)

AOF優(yōu)點(diǎn):

更好的保護(hù)數(shù)據(jù)不丟失 、性能高、可做緊急恢復(fù)

AOF缺點(diǎn):

文件比RDB文件大、寫的QPS比RDB低

AOF的配置

1:appendonly:是否開啟AOF

2:appendfilename:設(shè)置AOF的日志文件名

3:appendfsync:設(shè)置AOF日志如何同步到磁盤,fsync()調(diào)用,用來(lái)告訴操作系統(tǒng)立即將緩存的指令寫入磁盤,有三個(gè)選項(xiàng):

(1)always:每次寫都強(qiáng)制調(diào)用fsync,這種模式下,redis會(huì)相對(duì)較慢,但數(shù)據(jù)最安全 
(2)everysec:每秒啟用一次fsync
(3)no:不調(diào)用fsync()。而是讓操作系統(tǒng)自行決定sync的時(shí)間。這種模式下,redis的性能會(huì)最快

4:no-appendfsync-on-rewrite:設(shè)置當(dāng)redis在rewrite的時(shí)候,是否允許appendsync。因?yàn)閞edis進(jìn)程在進(jìn)行AOF重寫的時(shí)候,fsync()在主進(jìn)程中的調(diào)用會(huì)被阻止,也就是redis的持久化功能暫時(shí)失效。默認(rèn)為no,這樣能保證數(shù)據(jù)安全

5:auto-aof-rewrite-min-size:設(shè)置一個(gè)最小大小,是為了防止在aof很小時(shí)就觸發(fā)重寫

6:auto-aof-rewrite-percentage:設(shè)置自動(dòng)進(jìn)行AOF重寫的基準(zhǔn)值,也就是重寫啟動(dòng)時(shí)的AOF文件大小,假如redis自啟動(dòng)至今還沒有進(jìn)行過(guò)重寫,那么啟動(dòng)時(shí)aof文件的大小會(huì)被作為基準(zhǔn)值。這個(gè)基準(zhǔn)值會(huì)和當(dāng)前的aof大小進(jìn)行比較。如果當(dāng)前aof大小超出所設(shè)置的增長(zhǎng)比例,則會(huì)觸發(fā)重寫。如果設(shè)置auto-aof-rewrite-percentage為0,則會(huì)關(guān)閉此重寫功能

AOF日志恢復(fù)

如果在追加日志時(shí),恰好遇到磁盤空間滿或斷電等情況,導(dǎo)致日志寫入不完整,也沒有關(guān)系,Redis提供了redis-check-aof工具,可以用來(lái)進(jìn)行日志修復(fù),基本步驟如下:

1:備份被寫壞的AOF文件
2:運(yùn)行redis-check-aof –fix進(jìn)行修復(fù)
3:用diff -u來(lái)看下兩個(gè)文件的差異,確認(rèn)問題點(diǎn)
4:重啟redis,加載修復(fù)后的AOF文件

AOF重寫

AOF采用文件追加方式,這會(huì)導(dǎo)致AOF文件越來(lái)越大.

為此,Redis提供了AOF文件重寫(rewrite)機(jī)制,即當(dāng)AOF文件的大小超過(guò)所設(shè)定的閾值時(shí),Redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集。

可以使用命令bgrewriteaof

AOF重寫的觸發(fā)機(jī)制

Redis是這樣工作的:

Redis會(huì)記錄上次重寫時(shí)的AOF大小。

假如自啟動(dòng)至今還沒有進(jìn)行過(guò)重寫,那么啟動(dòng)時(shí)AOF文件的大小會(huì)被作為基準(zhǔn)值,這個(gè)基準(zhǔn)值會(huì)和當(dāng)前的AOF大小進(jìn)行比較,如果當(dāng)前AOF大小超出所設(shè)置的增長(zhǎng)比例,則會(huì)觸發(fā)重寫。

另外,你還需要設(shè)置一個(gè)最小大小,是為了防止在AOF很小時(shí)就觸發(fā)重寫

AOF重寫的基本原理

1:在重寫開始前,redis會(huì)創(chuàng)建一個(gè)“重寫子進(jìn)程”,這個(gè)子進(jìn)程會(huì)讀取現(xiàn)有的AOF文件,并將其包含的指令進(jìn)行分析壓縮并寫入到一個(gè)臨時(shí)文件中。

2:與此同時(shí),主進(jìn)程會(huì)將新接收到的寫指令一邊累積到內(nèi)存緩沖區(qū)中,一邊繼續(xù)寫入到原有的AOF文件中,這樣做是保證原有的AOF文件的可用性,避免在重寫過(guò)程中出現(xiàn)意外。

3:當(dāng)“重寫子進(jìn)程”完成重寫工作后,它會(huì)給父進(jìn)程發(fā)一個(gè)信號(hào),父進(jìn)程收到信號(hào)后就會(huì)將內(nèi)存中緩存的寫指令追加到新AOF文件中

4:當(dāng)追加結(jié)束后,redis就會(huì)用新AOF文件來(lái)代替舊AOF文件,之后再有新的寫指令,就都會(huì)追加到新的AOF文件中

5:重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,這點(diǎn)和快照有點(diǎn)類似

RDB+AOF混合方式概述

RDB+AOF的混合方式是:先使用RDB進(jìn)行快照存儲(chǔ),然后使用AOF持久化記錄所有的寫操作,當(dāng)重寫策略滿足或手動(dòng)觸發(fā)重寫的時(shí)候,將最新的數(shù)據(jù)存儲(chǔ)為新的RDB記錄。

這樣的話,重啟服務(wù)的時(shí)候會(huì)從RDB和AOF兩部分恢復(fù)數(shù)據(jù),既保證了數(shù)據(jù)完整性,又提高了恢復(fù)數(shù)據(jù)的性能。

開啟混合方式:

設(shè)置aof-use-rdb-preamble的值為 yes

數(shù)據(jù)的恢復(fù)順序

1:判斷是否開啟AOF持久化,若開啟了AOF,則使用AOF持久化文件恢復(fù)數(shù)據(jù)

2:如果AOF文件不存在,否則使用RDB持久化文件恢復(fù)數(shù)據(jù)

3:如果AOF文件和RDB文件都不存在則直接啟動(dòng)Redis

4:如果AOF或RDB文件出現(xiàn)錯(cuò)誤,則啟動(dòng)失敗返回錯(cuò)誤信息

關(guān)于Redis6.x持久化之AOF的示例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI