目錄
一 為什么有了RDB持久化機制還要有AOF呢
板書介紹具體原因:
?編輯二 詳細講解AOF機制
(1)AOF的基本使用
?1)板書如下
2)開啟AOF機制:
3) AOF工作流程
(2)AOF是否會影響到redis性能
?編輯
(3)AOF緩沖區刷新策略
(4)AOF的重寫機制
板書如下:
為什么要有這個重寫機制???
重寫流程 :
(5)混合持久化
板書如下
啟動時數據恢復
(6)對于信號的解釋
四? 本章重點回顧
一 為什么有了RDB持久化機制還要有AOF呢
原因:那肯定是RDB機制有無法滿足需求的場景,肯定是RDB有缺點,所以才又引入了AOF機制
板書介紹具體原因:
二 詳細講解AOF機制
(1)AOF的基本使用
AOF(AppendOnlyFile)持久化:以獨??志的?式記錄每次寫命令,重啟時再重新執?AOF ?件中的命令達到恢復數據的?的。AOF的主要作?是解決了數據持久化的實時性,?前已經是 Redis 持久化的主流?式。理解掌握好AOF持久化機制對我們兼顧數據安全性和性能?常有幫助。
?1)板書如下
2)開啟AOF機制:
開啟AOF功能需要設置配置:appendonlyyes,默認不開啟為no。AOF?件名通過 appendfilename 配置(默認是appendonly.aof)設置。保存?錄同RDB持久化?式?致,通過dir 配置指定。AOF的?作流程操作:命令寫?(append)、?件同步(sync)、?件重寫 (rewrite)、重啟加載(load),如圖所?。
步驟一通過root用戶使用vim打開以下文件:
ls /etc/redis/redis.conf
找到appendonly選項,默認為no
步驟二:修改 "appendonly"選項為yes并保存
3) AOF工作流程
- 所有的寫?命令會追加到aof_buf(緩沖區)中。
- AOF緩沖區根據對應的策略向硬盤做同步操作。
- 隨著硬盤AOF?件越來越?,需要定期對AOF?件進?重寫,達到壓縮的?的。
- 當Redis服務器啟動時,可以加載AOF?件進?數據恢復。
命令寫入:
AOF命令寫?的內容直接是?本協議格式。例如sethelloworld這條命令,在AOF緩沖區會追加如下 ?本:
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
此處遵守Redis格式協議,Redis選擇?本協議可能的原因:?本協議具備較好的兼容性;實現簡單; 具備可讀性。
AOF過程中為什么需要aof_buf這個緩沖區?Redis使?單線程響應命令,如果每次寫AOF?件都直 接同步硬盤,性能從內存的讀寫變成IO讀寫,必然會下降。先寫?緩沖區可以有效減少IO次數,同 時,Redis還可以提供多種緩沖區同步策略,讓??根據??的需求做出合理的平衡。?
(2)AOF是否會影響到redis性能
講解都在下邊板書中
(3)AOF緩沖區刷新策略
板書如下:
?件同步:
Redis 提供了多種AOF緩沖區同步?件策略,由參數appendfsync控制,不同值的含義如表所?。
系統調?write和fsync說明:
? write操作會觸發延遲寫(delayedwrite)機制。Linux在內核提供?緩沖區?來提供硬盤IO性 能。write操作在寫?系統緩沖區后?即返回。同步硬盤操作依賴于系統調度機制,例如:緩沖區 ?空間寫滿或達到特定時間周期。同步?件之前,如果此時系統故障宕機,緩沖區內數據將丟失。
? Fsync針對單個?件操作,做強制硬盤同步,fsync將阻塞直到數據寫?到硬盤。
? 配置為always時,每次寫?都要同步AOF?件,性能很差,在?般的SATA硬盤上,只能?持? 約?百TPS寫?。除?是?常重要的數據,否則不建議配置。
? 配置為no時,由于操作系統同步策略不可控,雖然提?了性能,但數據丟失?險?增,除?數據 重要程度很低,?般不建議配置。
? 配置為everysec,是默認配置,也是推薦配置,兼顧了數據安全性和性能。理論上最多丟失1秒的 數據。?
(4)AOF的重寫機制
板書如下:
總結重寫機制:就比如你要算你的利潤,這個月掙了6000雜七雜八花去2000,最后凈利潤4000,下個月在計算總利潤的時候直接從這4000開始算,第一個月中干活掙了100買水花20又寫文案掙了50買水果花60等等中間狀態直接舍去,只看最后的狀態
為什么要有這個重寫機制???
答案:隨著命令不斷寫?AOF,?件會越來越?,
為了解決這個問題,Redis引?AOF重寫機制壓縮?件體積。AOF?件重寫是把Redis進程內的數據轉化為寫命令同步到新的AOF?件。 重寫后的AOF為什么可以變??有如下原因:
- 進程內已超時的數據不再寫??件。
- 舊的AOF中的?效命令,例如del、hdel、srem等重寫后將會刪除,只需要保留數據的最終版本。
- 多條寫操作合并為?條,例如lpush list a、lpush list b、lpush list c可以合并為lpushlist a b c。
較?的AOF?件???降低了硬盤空間占?,???可以提升啟動Redis時數據恢復的速度。
AOF重寫過程可以?動觸發和?動觸發:
- ?動觸發:調?bgrewriteaof命令。
- ?動觸發:根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數確定?動觸發時 機。
- auto-aof-rewrite-min-size:表?觸發重寫時AOF的最??件??,默認為64MB。
- auto-aof-rewrite-percentage:代表當前AOF占???相?較上次重寫時增加的?例。
重寫流程 :
板書如下
1)執?AOF重寫請求。如果當前進程正在執?AOF重寫,請求不執?。如果當前進程正在執?bgsave操作,重寫命令 延遲到bgsave完成之后再執?。
2)?進程執?fork創建?進程。
3)重寫:
? ? ? ? a.主進程fork之后,繼續響應其他命令。所有修改操作寫?AOF緩沖區并根據appendfsync策 略同步到硬盤,保證舊AOF?件機制正確。
? ? ? ? b.?進程只有fork之前的所有內存信息,?進程中需要將fork之后這段時間的修改操作寫? AOF重寫緩沖區中。
4)?進程根據內存快照,將命令合并到新的AOF?件中。
5)?進程完成重寫
? ? ? ? a.新?件寫?后,?進程發送信號給?進程。
? ? ? ? b.?進程把AOF重寫緩沖區內臨時保存的命令追加到新AOF?件中。
? ? ? ? c.?新AOF?件替換?AOF?件。
(5)混合持久化
板書如下
啟動時數據恢復
當Redis啟動時,會根據RDB和AOF?件的內容,進?數據恢復,如圖所?。
?
(6)對于信號的解釋
直接看板書講解: