網(wǎng)站開(kāi)發(fā)要服務(wù)器嗎東莞網(wǎng)站推廣企業(yè)
文章目錄
- 為什么需要AOF?
- 概念
- 持久化查詢和設(shè)置
- 1. 查詢AOF啟動(dòng)狀態(tài)
- 2. 開(kāi)啟AOF持久化
- 2.1 命令行啟動(dòng)AOF
- 2.2 配置文件啟動(dòng) AOF
- 3. 觸發(fā)持久化
- 3.1 自動(dòng)觸發(fā)
- 3.3 手動(dòng)觸發(fā)
- 4. AOF 文件重寫(xiě)
- 4.1 什么是AOF重寫(xiě)?
- 4.2 AOF 重寫(xiě)實(shí)現(xiàn)
- 4.3 AOF 重寫(xiě)流程
- 5. 配置說(shuō)明
- 6. 數(shù)據(jù)恢復(fù)
- 6.1 正常數(shù)據(jù)恢復(fù)
- 6.2 簡(jiǎn)單異常數(shù)據(jù)恢復(fù)
- 6.3 復(fù)雜異常數(shù)據(jù)恢復(fù)
- 7. 優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
- 缺點(diǎn)
為什么需要AOF?
使用 RDB 持久化有一個(gè)風(fēng)險(xiǎn),它可能會(huì)造成最新數(shù)據(jù)丟失的風(fēng)險(xiǎn)。因?yàn)?RDB 的持久化有一定的時(shí)間間隔,在這個(gè)時(shí)間段內(nèi)如果 Redis 服務(wù)意外終止的話,就會(huì)造成最新的數(shù)據(jù)全部丟失。
可能會(huì)操作 Redis 服務(wù)意外終止的條件:
- 安裝 Redis 的機(jī)器停止運(yùn)行,藍(lán)屏或者系統(tǒng)崩潰;
- 安裝 Redis 的機(jī)器出現(xiàn)電源故障,例如突然斷電;
- 使用 kill -9 Redis_PID 等。
那么如何解決以上的這些問(wèn)題呢?Redis 為我們提供了另一種持久化的方案——AOF。
概念
AOF(Append Only File)中文是附加到文件,顧名思義 AOF 可以把 Redis 每個(gè)鍵值對(duì)操作都記錄到文件(appendonly.aof)中。
持久化查詢和設(shè)置
1. 查詢AOF啟動(dòng)狀態(tài)
使用 config get appendonly
命令,如下圖所示:
其中,第一行為 AOF 文件的名稱,而最后一行表示 AOF 啟動(dòng)的狀態(tài),yes 表示已啟動(dòng),no 表示未啟動(dòng)。
2. 開(kāi)啟AOF持久化
Redis 默認(rèn)是關(guān)閉 AOF 持久化的,想要開(kāi)啟 AOF 持久化,有以下兩種方式:
- 通過(guò)命令行的方式;
- 通過(guò)修改配置文件的方式(redis.conf)。
下面分別來(lái)看以上兩種方式的實(shí)現(xiàn)。
2.1 命令行啟動(dòng)AOF
命令行啟動(dòng) AOF,使用 config set appendonly yes
命令,如下圖所示:
命令行啟動(dòng) AOF 的優(yōu)缺點(diǎn):命令行啟動(dòng)優(yōu)點(diǎn)是無(wú)需重啟 Redis 服務(wù),缺點(diǎn)是如果 Redis 服務(wù)重啟,則之前使用命令行設(shè)置的配置就會(huì)失效。
2.2 配置文件啟動(dòng) AOF
Redis 的配置文件在它的根路徑下的 redis.conf 文件中,獲取 Redis 的根目錄可以使用命令 config get dir 獲取,如下圖所示:
置 appendonly yes 即可,默認(rèn) appendonly no
表示關(guān)閉 AOF 持久化。 配置文件啟動(dòng) AOF 的優(yōu)缺點(diǎn):修改配置文件的缺點(diǎn)是每次修改配置文件都要重啟 Redis 服務(wù)才能生效,優(yōu)點(diǎn)是無(wú)論重啟多少次 Redis 服務(wù),配置文件中設(shè)置的配置信息都不會(huì)失效。
3. 觸發(fā)持久化
AOF 持久化開(kāi)啟之后,只要滿足一定條件,就會(huì)觸發(fā) AOF 持久化。AOF 的觸發(fā)條件分為兩種:自動(dòng)觸發(fā)和手動(dòng)觸發(fā)。
3.1 自動(dòng)觸發(fā)
有兩種情況可以自動(dòng)觸發(fā) AOF 持久化,分為是:滿足 AOF 設(shè)置的策略觸發(fā)和滿足 AOF 重寫(xiě)觸發(fā)。其中,AOF 重寫(xiě)觸發(fā)會(huì)在本文的后半部分詳細(xì)介紹,這里重點(diǎn)來(lái)說(shuō) AOF 持久化策略都有哪些。 AOF 持久化策略,分為以下三種:
- always:每條 Redis 操作命令都會(huì)寫(xiě)入磁盤,最多丟失一條數(shù)據(jù);
- everysec:每秒鐘寫(xiě)入一次磁盤,最多丟失一秒的數(shù)據(jù);
- no:不設(shè)置寫(xiě)入磁盤的規(guī)則,根據(jù)當(dāng)前操作系統(tǒng)來(lái)決定何時(shí)寫(xiě)入磁盤,Linux 默認(rèn) 30s 寫(xiě)入一次數(shù)據(jù)至磁盤。
這三種配置可以在 Redis 的配置文件(redis.conf)中設(shè)置,如下代碼所示:
# 開(kāi)啟每秒寫(xiě)入一次的持久化策略
appendfsync everysec
小貼士:因?yàn)槊看螌?xiě)入磁盤都會(huì)對(duì) Redis 的性能造成一定的影響,所以要根據(jù)用戶的實(shí)際情況設(shè)置相應(yīng)的策略,一般設(shè)置每秒寫(xiě)入一次磁盤的頻率就可以滿足大部分的使用場(chǎng)景了。
觸發(fā)自動(dòng)持久化的兩種情況,如下圖所示:
3.3 手動(dòng)觸發(fā)
在客戶端執(zhí)行 bgrewriteaof
命令就可以手動(dòng)觸發(fā) AOF 持久化,如下圖所示:
可以看出執(zhí)行完 bgrewriteaof
命令之后,AOF 持久化就會(huì)被觸發(fā)。
4. AOF 文件重寫(xiě)
AOF 是通過(guò)記錄 Redis 的執(zhí)行命令來(lái)持久化(保存)數(shù)據(jù)的,所以隨著時(shí)間的流逝 AOF 文件會(huì)越來(lái)越多,這樣不僅增加了服務(wù)器的存儲(chǔ)壓力,也會(huì)造成 Redis 重啟速度變慢,為了解決這個(gè)問(wèn)題 Redis 提供了 AOF 重寫(xiě)的功能。
4.1 什么是AOF重寫(xiě)?
AOF 重寫(xiě)指的是它會(huì)直接讀取 Redis 服務(wù)器當(dāng)前的狀態(tài),并壓縮保存為 AOF 文件。例如,我們?cè)黾恿艘粋€(gè)計(jì)數(shù)器,并對(duì)它做了 99 次修改,如果不做 AOF 重寫(xiě)的話,那么持久化文件中就會(huì)有 100 條記錄執(zhí)行命令的信息,而 AOF 重寫(xiě)之后,之后記錄一條此計(jì)數(shù)器最終的結(jié)果信息,這樣就去除了所有的無(wú)效信息。
4.2 AOF 重寫(xiě)實(shí)現(xiàn)
觸發(fā) AOF 文件重寫(xiě),要滿足兩個(gè)條件,這兩個(gè)條件也是配置在 Redis 配置文件中的,它們分別:
- auto-aof-rewrite-min-size:允許 AOF 重寫(xiě)的最小文件容量,默認(rèn)是 64mb 。
- auto-aof-rewrite-percentage:AOF 文件重寫(xiě)的大小比例,默認(rèn)值是 100,表示 100%,也就是只有當(dāng)前 AOF 文件,比最后一次(上次)的 AOF 文件大一倍時(shí),才會(huì)啟動(dòng) AOF 文件重寫(xiě)。
查詢 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 的值,可使用 config get xxx 命令,如下圖所示:
小貼士:只有同時(shí)滿足 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 設(shè)置的條件,才會(huì)觸發(fā) AOF 文件重寫(xiě)。
注意:使用 bgrewriteaof 命令,可以自動(dòng)觸發(fā) AOF 文件重寫(xiě)。
4.3 AOF 重寫(xiě)流程
AOF 文件重寫(xiě)是生成一個(gè)全新的文件,并把當(dāng)前數(shù)據(jù)的最少操作命令保存到新文件上,當(dāng)把所有的數(shù)據(jù)都保存至新文件之后,Redis 會(huì)交換兩個(gè)文件,并把最新的持久化操作命令追加到新文件上。
5. 配置說(shuō)明
合理的設(shè)置 AOF 的配置,可以保障 Redis 高效且穩(wěn)定的運(yùn)行,以下是 AOF 的全部配置信息和說(shuō)明。
AOF 的配置參數(shù)在 Redis 的配置文件中,也就是 Redis 根路徑下的 redis.conf 文件中,配置參數(shù)和說(shuō)明如下:
# 是否開(kāi)啟 AOF,yes 為開(kāi)啟,默認(rèn)是關(guān)閉
appendonly no# AOF 默認(rèn)文件名
appendfilename "appendonly.aof"# AOF 持久化策略配置
# appendfsync always
appendfsync everysec
# appendfsync no# AOF 文件重寫(xiě)的大小比例,默認(rèn)值是 100,表示 100%,也就是只有當(dāng)前 AOF 文件,比最后一次的 AOF 文件大一倍時(shí),才會(huì)啟動(dòng) AOF 文件重寫(xiě)。
auto-aof-rewrite-percentage 100# 允許 AOF 重寫(xiě)的最小文件容量
auto-aof-rewrite-min-size 64mb# 是否開(kāi)啟啟動(dòng)時(shí)加載 AOF 文件效驗(yàn),默認(rèn)值是 yes,表示盡可能的加載 AOF 文件,忽略錯(cuò)誤部分信息,并啟動(dòng) Redis 服務(wù)。
# 如果值為 no,則表示,停止啟動(dòng) Redis,用戶必須手動(dòng)修復(fù) AOF 文件才能正常啟動(dòng) Redis 服務(wù)。
aof-load-truncated yes
其中比較重要的是 appendfsync 參數(shù),用它來(lái)設(shè)置 AOF 的持久化策略,可以選擇按時(shí)間間隔或者操作次數(shù)來(lái)存儲(chǔ) AOF 文件,這個(gè)參數(shù)的三個(gè)值在文章開(kāi)頭有說(shuō)明,這里就不再?gòu)?fù)述了。
6. 數(shù)據(jù)恢復(fù)
6.1 正常數(shù)據(jù)恢復(fù)
正常情況下,只要開(kāi)啟了 AOF 持久化,并且提供了正常的 appendonly.aof 文件,在 Redis 啟動(dòng)時(shí)就會(huì)自定加載 AOF 文件并啟動(dòng),執(zhí)行如下圖所示:
其中 DB loaded from append only file......
表示 Redis 服務(wù)器在啟動(dòng)時(shí),先去加載了 AOF 持久化文件。
小貼士:默認(rèn)情況下 appendonly.aof 文件保存在 Redis 的根目錄下。
持久化文件加載規(guī)則
- 如果只開(kāi)啟了 AOF 持久化,Redis 啟動(dòng)時(shí)只會(huì)加載 AOF 文件(appendonly.aof),進(jìn)行數(shù)據(jù)恢復(fù);
- 如果只開(kāi)啟了 RDB 持久化,Redis 啟動(dòng)時(shí)只會(huì)加載 RDB 文件(dump.rdb),進(jìn)行數(shù)據(jù)恢復(fù);
- 如果同時(shí)開(kāi)啟了 RDB 和 AOF 持久化,Redis 啟動(dòng)時(shí)只會(huì)加載 AOF 文件(appendonly.aof),進(jìn)行數(shù)據(jù)恢復(fù)。
在 AOF 開(kāi)啟的情況下,即使 AOF 文件不存在,只有 RDB 文件,也不會(huì)加載 RDB 文件。 AOF 和 RDB 的加載流程如下圖所示:
6.2 簡(jiǎn)單異常數(shù)據(jù)恢復(fù)
在 AOF 寫(xiě)入文件時(shí)如果服務(wù)器崩潰,或者是 AOF 存儲(chǔ)已滿的情況下,AOF 的最后一條命令可能被截?cái)?#xff0c;這就是異常的 AOF 文件。
在 AOF 文件異常的情況下,如果為修改 Redis 的配置文件,也就是使用 aof-load-truncated
等于 yes 的配置,Redis 在啟動(dòng)時(shí)會(huì)忽略最后一條命令,并順利啟動(dòng) Redis,執(zhí)行結(jié)果如下:
* Reading RDB preamble from AOF file...
* Reading the remaining AOF tail...
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 439 !!!
# AOF loaded anyway because aof-load-truncated is enabled
6.3 復(fù)雜異常數(shù)據(jù)恢復(fù)
AOF 文件可能出現(xiàn)更糟糕的情況,當(dāng) AOF 文件不僅被截?cái)?#xff0c;而且中間的命令也被破壞,這個(gè)時(shí)候再啟動(dòng) Redis 會(huì)提示錯(cuò)誤信息并中止運(yùn)行,錯(cuò)誤信息如下:
* Reading the remaining AOF tail...
# Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
出現(xiàn)此類問(wèn)題的解決方案如下:
- 首先使用 AOF 修復(fù)工具,檢測(cè)出現(xiàn)的問(wèn)題,在命令行中輸入 redis-check-aof 命令,它會(huì)跳轉(zhuǎn)到出現(xiàn)問(wèn)題的命令行,這個(gè)時(shí)候可以嘗試手動(dòng)修復(fù)此文件;
- 如果無(wú)法手動(dòng)修復(fù),我們可以使用 redis-check-aof --fix 自動(dòng)修復(fù) AOF 異常文件,不過(guò)執(zhí)行此命令,可能會(huì)導(dǎo)致異常部分至文件末尾的數(shù)據(jù)全部被丟棄。
7. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- AOF 持久化保存的數(shù)據(jù)更加完整,AOF 提供了三種保存策略:每次操作保存、每秒鐘保存一次、跟隨系統(tǒng)的持久化策略保存,其中每秒保存一次,從數(shù)據(jù)的安全性和性能兩方面考慮是一個(gè)不錯(cuò)的選擇,也是 AOF 默認(rèn)的策略,即使發(fā)生了意外情況,最多只會(huì)丟失 1s 鐘的數(shù)據(jù);
- AOF 采用的是命令追加的寫(xiě)入方式,所以不會(huì)出現(xiàn)文件損壞的問(wèn)題,即使由于某些意外原因,導(dǎo)致了最后操作的持久化數(shù)據(jù)寫(xiě)入了一半,也可以通過(guò) redis-check-aof 工具輕松的修復(fù);
- AOF 持久化文件,非常容易理解和解析,它是把所有 Redis 鍵值操作命令,以文件的方式存入了磁盤。即使不小心使用 flushall 命令刪除了所有鍵值信息,只要使用 AOF 文件,刪除最后的 flushall 命令,重啟 Redis 即可恢復(fù)之前誤刪的數(shù)據(jù)。
缺點(diǎn)
- 對(duì)于相同的數(shù)據(jù)集來(lái)說(shuō),AOF 文件要大于 RDB 文件;
- 在 Redis 負(fù)載比較高的情況下,RDB 比 AOF 性能更好;
- RDB 使用快照的形式來(lái)持久化整個(gè) Redis 數(shù)據(jù),而 AOF 只是將每次執(zhí)行的命令追加到 AOF 文件中,因此從理論上說(shuō),RDB 比 AOF 更健壯。