成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 持久化技術 AOF 要點與詳細解答

數據庫 Redis
無論是初入職場渴望嶄露頭角的技術新人,還是經驗豐富尋求新挑戰的開發者,深入理解Redis AOF相關面試題都是成功通過面試的關鍵一步。

在競爭激烈的技術求職面試中,Redis作為高性能的鍵值對數據庫,是眾多面試官重點考察的知識領域,而其中的AOF(Append - Only File)機制更是高頻考點。Redis AOF 功能為數據持久化提供了一種可靠且易于理解的方式,圍繞它產生了一系列既能考查面試者對基礎知識的掌握,又能檢驗其對復雜實際場景應對能力的面試題。

無論是初入職場渴望嶄露頭角的技術新人,還是經驗豐富尋求新挑戰的開發者,深入理解Redis AOF相關面試題都是成功通過面試的關鍵一步。這篇文章,將成為你攻克Redis AOF面試題的得力助手,我們將全方位、多角度地梳理常見面試題,不僅給出標準答案,更會深入剖析解題思路和背后的原理知識,助你在面試中自信應對,脫穎而出。

一、詳解AOF基礎知識點

1. AOF技術簡介

AOF(Append-Only File)用于將Redis服務器收到的寫操作追加到日志文件,通過該機制可以保證服務器重啟后依然可以依靠日志文件恢復數據。 它的工作過程大抵分為以下幾步:

  • 收到客戶端的寫入命令(例如SET、DEL等)之后,它會將命令寫入AOF緩沖區。
  • redis服務器會定期或者在特定條件下,將AOF緩沖區的數據以追加的方式寫到日志文件末尾,這種寫入的操作可以是同步的,也可以是異步的,具體看我們配置的刷盤機制。
  • 若日志文件超過配置文件的大小(由配置參數 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 決定),則會觸發AOF重寫(AOF Rewrite),重寫時會啟動一個后臺進程,分析日志中的指令并精簡化寫入新的AOF文件中。
  • 新的AOF文件和舊的AOF文件進行原子替換,后續的寫指令都會寫到這個新的AOF文件中。

2. AOF持久化技術的優缺點

優勢:

  • 客戶端操作的指令可能會出錯,采用寫后再日志的形式可以避免很多沒必要的日志記錄,節約磁盤空間
  • 寫日志需要進行磁盤IO,可能會產生阻塞,所以采用先寫入再日志,可以避免寫時阻塞。

劣勢:

  • 有可能在寫操作之后,日志記錄之前服務器出現宕機,可能會造成數據丟失
  • 當主線程磁盤壓力過大,導致寫入磁盤慢,進而造成后續操作阻塞。

3. AOF核心配置參數

(1) appendonly:若將該參數設置為yes,則開啟aof持久化機制,此時redis持久化機制就以aof為主,而非rdb

# 設置為yes開啟aof
appendonly yes

如下示例所示,我們將該參數配置為yes后重啟redis服務端,使用客戶端完成如下操作:

# 設置三個key
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK

此時我們查看aof文件,大小增加了:

[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# find / -name appendonly.aof
/usr/sbin/appendonly.aof
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# find / -name appendonly
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# find / -name appendonly.aof
/usr/sbin/appendonly.aof
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# ll appendonly.aof
-rw-r--r-- 1 root root 110 Aug 26 00:09 appendonly.aof

然后我們再次使用客戶端寫入文件,可以看到大小又增加了,由此得出我們AOF配置生效了。

# 再次查看aof文件大小,變為139,說明aof配置生效
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# ll appendonly.aof
-rw-r--r-- 1 root root 139 Aug 26 00:10 appendonly.aof
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]#

appendfilename ,該參數決定aof持久化文件的名字,這個就不多贅述了。 如下所示,這條配置就意味著aof文件名是appendonly

appendfilename "appendonly.aof"

(2) dir :該參數決定aof文件持久化位置,默認為redis-server的位置。

dir ./

(3) appendfsync(重點) : 在介紹appendfsync,我們必須介紹一下操作系統提供的兩個函數

  • write:write操作會觸發操作系統延遲寫機制,這種機制下數據一寫到緩存區就直接返回,至于什么時候進行刷盤由操作系統決定,要么緩存空間滿了刷,要么就是定時任務時間到了。
  • fsync:該調用會強制將緩存寫入磁盤中,所以使用這個函數進行文件寫入時,可能存在阻塞問題。

了解了上述兩個函數之后,我們再來聊聊這個參數值:

  • always:該選項會使得命令一旦寫入aof_buf后,就會調用操作系統的fsync將指令寫到aof物理文件中,完成操作后線程返回
  • everysec:該選項會在命令寫入aof_buf后調用操作系統的wirte,完成write后線程返回。fsync會由專門的線程每秒調用一次
  • no:該選項會在命令寫入aof_buf后調用操作系統的write,完成write后線程返回,不調用fsync,同步操作由操作系統執行,最長周期為30s。

所以配置時,我們建議采用默認的寫入策略everysec,他不會像always造成線程阻塞亦或者像no一樣不可控。

appendfsync everysec

(4) no-appendfsync-on-rewrite:redis為了保證持久化aof文件時調用fsync時不會出現長時間的卡頓,增加了該參數,若設置為yes,在redis調用fsync期間出現的寫入指令不會將其放到頁緩存(page cache)中,僅僅做個接收,保證不阻塞。

no-appendfsync-on-rewrite yes

(5) auto-aof-rewrite-percentage和auto-aof-rewrite-min-size(重點):這兩個參數決定redis何時進行重寫,如下所示,這兩個參數分別為100和64mb,意味當本次aof文件超過64+64*100%就觸發redis自動重寫。

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

(6) aof-load-truncated:若設置為yes時在redis加載aof文件出錯后會發送日志通知用戶,反之則不做任何處理也不會啟動redis,用戶可以使用redis-check-aof指令完成數據修復。 這個參數筆者會在后文演示。

aof-load-truncated yes

(7) aof-rewrite-incremental-fsync:開啟該參數后,子進程在進行aof重寫時,每32m就會將數據寫到的新的aof文件中,從而避免單刷造成的線程阻塞。

aof-rewrite-incremental-fsync yes

(8) aof-use-rdb-preamble:redis 4.0之后支持同時開啟rdb和aof,具體后文會詳述

# rdb+aof兩種機制結合使用
aof-use-rdb-preamble yes

4. AOF斷電后恢復的過程是什么

我們在之前的aof文件重命名,模擬斷電后數據丟失,首先將aof文件備份,在重啟redis,模擬斷電后數據丟失

[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# mv appendonly.aof appendonly.aof.bak


# 重啟redis服務端,打開客戶端查看數據都丟失了
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-cli
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> keys *
(empty array)

然后將備份文件還原,重啟redis。

# 將aof文件還原,并重啟redis
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# mv appendonly.aof.bak appendonly.aof
mv: overwrite ‘appendonly.aof’? y
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-server /root/redis/redis.conf

可以看到,數據已經回來了。

# 再次使用redis查看,丟失的數據都回來了
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-cli
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"
127.0.0.1:6379>

二、詳解AOF持久化技術進階知識點

1. AOF重寫時是否會阻塞線程

答案是會的,但阻塞大部分情況是發生在fork子進程那段時間,AOF重寫時首先會fork一個子進程進行日志重寫,在此期間新寫入的數據都會被存到的AOF緩沖區中,直到子進程全部完成重寫并原子覆蓋aof日志文件后,才會將這些緩沖數據寫到新的日志文件中:

需要補充的是,上面提到日志重寫期間數據都會被寫到AOF緩沖區中,在高并發場景下也可能導致內存被打滿出現頻繁內存置換等情況間接導致我們的redis進程阻塞,此時就可能出現讀寫性能下降的情況:

2. Redis重啟后加載日志文件的順序

執行順序為:

  • 先看看有沒有AOF,若有則先加載AOF,然后執行步驟2。
  • 查看是否有RDB文件,若有再加載RDB文件。

3. Redis恢復數據期間文件校驗是怎么做

在日志寫入期間要是服務器宕機了,那么這個日志文件可能就用不了了,而解決方案也很可能簡單,redis給我提供一個命令進行fix。

例子如下,我們首先需要將一個日志文件損壞:

# 追加一個錯誤數據到aof文件末行并殺死redis 模擬服務器宕機
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# vim appendonly.aof


# 再次啟動redis,操作數據時發現登錄失敗
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-server /root/redis/redis.conf
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

然后使用日志文件進行修復:

#  使用 redis-check-aof --fix aof文件 修復文件
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-check-aof --fix appendonly.aof
0x              8b: Expected prefix '*', got: 's'
AOF analyzed: size=151, ok_up_to=139, ok_up_to_line=34, diff=12
This will shrink the AOF from 151 bytes, with 12 bytes, to 139 bytes
# 這里選擇y
Continue? [y/N]: y
Successfully truncated AOF

可以看到,經過fix修復后的日志文件部分數據已經恢復了:

# 重啟redis,使用客戶端連接發現啟動成功且數據都還在
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-server /root/redis/redis.conf
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-cli

127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"

4. AOF相較于RDB持久化的優勢

優勢如下:

  • 備份機制更穩健,丟失數據幾率低。
  • 日志可讀,可以處理誤操作。

而劣勢也很明顯:

  • 比RDB更占磁盤空間,畢竟RDB存放的不是二進制文件。
  • 每次AOF都進行fsync的話,性能開銷大。
  • 恢復和備份速度較慢。

5. Redis混合持久化

Redis4.0實現了RDB和AOF混合方式,相比于單RDB或者單AOF更安全,執行效率更高,它的執行過程大抵如下:

  • 初始狀態下,寫入的指令都會以AOF格式寫入aof文件中。
  • 當發生AOF重寫時(bgrewriteaof ),redis會fork出一個子進程,進行aof重寫。
  • redis將重寫的數據以rdb的數據寫到新的aof文件中。
  • 隨后再將aof緩沖區的增量命令(aof_rewrite_buf_blocks)寫到新的aof文件中。
  • 完成上述操作后我們就會得到一個前半部分是RDB后半部分是AOF的aof日志文件。
  • 最后將新的aof文件替換掉舊的rdb和aof文件。

對應的重啟后的加載流程也改為:

  • 判斷持久化格式,如果是rdb格式則按照rdb格式進行恢復,反之按照aof格式格式進行恢復進入步驟2。
  • 查看aof文件文件是否存在,若存在進入步驟3。
  • 查看文件前半部分是否是RDB如果是則先按照rdb格式恢復,然后再按照aof格式恢復。
  • 若沒有rdb開頭格式的內容,直接按照常規aof格式恢復。
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2021-07-18 07:59:42

RedisRDBAOF

2024-03-26 00:03:08

Redis數據RDB

2023-05-11 09:12:35

RedisRDB日志

2024-09-12 08:49:53

2021-12-12 10:29:41

AOFRedisAOF日志

2021-10-18 07:43:30

RedisAOF日志RDB快照

2024-09-06 17:49:46

2023-03-13 08:08:48

數據庫Redis

2024-09-29 09:25:53

2019-05-17 08:55:49

RedisRDBAOF

2021-03-10 00:02:01

Redis

2020-01-06 14:54:31

RDBAOFRedis

2024-02-26 00:00:00

Redis持久化AOF

2020-12-11 11:40:37

RDBAOFRedis

2021-02-04 08:01:35

RedisRDBAOF

2025-01-22 10:16:46

RedisRDBAOF

2018-06-12 09:33:45

Redis高可用AOF

2023-10-12 13:01:29

Redis數據庫

2020-03-03 14:15:49

Redis持久化數據庫

2019-01-17 04:41:38

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品成人无久久精品 | 91黄色片免费看 | 91久久精品一区二区二区 | 免费一区| 人碰人操| 黄色网址在线免费播放 | 精品国产乱码久久久久久丨区2区 | 国产精品免费在线 | 亚洲欧美日韩一区二区 | 午夜精品久久久久久久久久久久久 | 成人综合在线视频 | 在线看黄免费 | 精品亚洲视频在线 | 久久精品性视频 | 久久久久久久一区二区三区 | 久久久久久久国产 | 性一交一乱一透一a级 | 国产精品国产馆在线真实露脸 | 中文字幕色站 | 国产精品99免费视频 | 成人在线视频免费看 | 中文字幕在线视频免费视频 | 欧美一区二区三区高清视频 | 亚洲成人免费 | 欧美一区二区在线看 | 亚洲三级在线观看 | 美女三区 | 一级欧美视频 | 一区二区三区网站 | 欧美亚洲一级 | 国产精品一区久久久 | 欧美视频第三页 | 亚洲一区二区三区在线播放 | 欧美在线一区二区三区 | 黄一区二区三区 | 国产视频一二三区 | 日本久久精品视频 | 亚洲一区二区黄 | 国产精品久久久久久久久久久免费看 | 成人免费区一区二区三区 | 亚洲在线成人 |