AOF(append only file):以獨立日志的方式記錄每次寫的命令诲祸,重啟時再重新執(zhí)行AOF文件中的命令達到恢復數據的目的。
AOF的主要作用是解決了數據持久化的實時性斯辰,目前已經是Redis持久化的主流方式。
以下是AOF工作流程圖:
一坡疼、開啟AOF
Redis中默認不開啟AOF彬呻,appendonly yes,是開啟的配置柄瑰。
文件的名字默認為appendonly.aof闸氮,可以通過參數appendfilename來設置。
目錄也是通過dir來設置教沾。
二蒲跨、命令寫入append
所有寫入命令會追加到aof_buf(緩沖區(qū))中。
三授翻、文件同步sync
AOF緩沖區(qū)或悲,根據策略向硬盤做同步。由參數appendfsync控制藏姐,常規(guī)使用everysec選項:
- always:命令寫入aof_buf后隆箩,直接調用系統(tǒng)的fsync操作同步到AOF文件。
- everysec:命令寫入aof_buf后羔杨,調用系統(tǒng)的write操作,write操作完成后線程返回杨蛋。fsync同步文件操作由專門線程每秒調用一次兜材。
- no:命令寫入aof_buf后調用系統(tǒng)的write操作,不對AOF文件做fsync同步逞力,同步硬盤操作由操作系統(tǒng)負責曙寡,通常同步周期最長30秒。
四寇荧、文件重寫rewrite
隨著AOF文件越來越大举庶,需要定期對AOF文件進行重寫,達到壓縮的目的揩抡。把Redis進程內的數據轉化為寫命令同步到新AOF文件的過程户侥。AOF重寫過程分為手動觸發(fā)和自動觸發(fā):
- 手動觸發(fā):直接調用bgrewriteaof镀琉。
- 自動觸發(fā):根據auto-aof-rewrite-min-size(默認64M)和auto-aof-rewrite-percentage參數確定自動觸發(fā)時機。
- 自動觸發(fā)時機 = (aof_current_size > auto-aof-rewrite-min-size) && (aof_current_size / aof_base_size) > auto-aof-rewrite-percentage蕊唐。
- 當前AOF文件大形菟ぁ:aof_current_size。
- 上一次重寫后的AOF文件空間大刑胬妗:aof_base_size钓试。
- 其中aof_current_size和aof_base_size可以在命令info persistence的結果中查看到。
AOF重寫流程如下:
- 執(zhí)行AOF重寫請求副瀑。
- 如果當前進程正在執(zhí)行AOF重寫弓熏,請求不執(zhí)行,直接返回糠睡。
- 如果當前進程正在執(zhí)行bgsave操作硝烂,重寫命令延遲到bgsave完成之后再執(zhí)行。
- 主進程執(zhí)行fork操作完成后铜幽,繼續(xù)響應其他命令滞谢。所有修改命令繼續(xù)寫入aof_buf緩沖區(qū)中并根據appendfsync策略同步到硬盤,保證原有AOF機制正確性除抛。
- fork操作運用寫時復制技術狮杨,子進程只能共享fork操作時的內存數據。子進程根據內存快照到忽,按照命令合并規(guī)則寫入到新的AOF文件橄教。每次寫入硬盤數據量由aof-rewrite-incremental-fsync控制,默認為32M喘漏。
- 父進程將重寫緩沖區(qū)內的數據寫入到新的AOF文件中护蝶。
- 使用新的AOF文件替換老文件,完成AOF重寫翩迈。
五持灰、重啟加載load
當Redis服務器重啟時,可以加載AOF文件進行數據恢復负饲。
如上圖堤魁,流程說明:
- AOF持久化開啟且存在AOF文件時,優(yōu)先加載AOF文件返十。
- AOF關閉或者AOF文件不存在時妥泉,加載RDB文件。
- 加載AOF/RDB文件成功后洞坑,Redis啟動成功盲链。
- AOF/RDB文件存在錯誤時,Redis啟動失敗并打印錯誤信息。
六刽沾、文件校驗
對于錯誤格式的AOF文件:先進行備份本慕,然后采用redis-check-aof --fix命令進行修復,修復后使用diff -u對比數據的差異悠轩,找出丟失的數據间狂。
AOF文件結尾不完整的情況下:可以使用aof-load-truncated配置來兼容這種情況。
轉載地址:https://blog.csdn.net/jiangxiulilinux/article/details/104908226