今天就跟大家聊聊有關aof日志文件的用處有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
在Redis配置文件中有一個叫appendonly的選項,可以寫yes或no.這個選項就是負責是否開啟AOF日志的開關.AOF日志,你可以簡單理解為MySQL binlog一樣的東西,作用就是記錄每次的寫操作,在遇到斷電等問題時可以用它來恢復數據庫狀態.但是他不是bin的,而是text的.一行一行,寫得很規范.如果你是一臺redis,那你也能人肉通過它恢復數據。下面億速云小編來講解下aof(append only file)日志文件有哪些用處?
aof(append only file)日志文件有哪些用處
Redis有三種類型的落地文件:
數據文件-在配置中可設置其位置及文件名,默認文件名dump.rdb
日志文件-在配置中也可以配置.當然,在你是以daemon方式運行的時候,這個值就不要設置為stdout了,這么設置會自動被換成/dev/null
AOF文件-也就是我們這篇文章的主角,他的作用是用于數據恢復.他除了設置是否開啟外,還可以設置開啟后以何種方式寫日志.這個何種一共是三種,1是每次寫操作都保證將fsync()來完成的,2是每秒調用一次fsync(),3是從不調用,讓操作系統自己來同步.當然,設置為不同,效率會不同,你的數據損失風險也不同.
運行流程
既然是log文件,而且是要用于恢復的,那么我們動動腳趾都能想到,這玩意肯定會越來越大,不管你的應用是大是小,如果AOF文件只增不減的話,那文件將會無限長大,這個問題是所有binlog都會遇到的.而通常遇到這種問題都會有一個rotate方案.就是當日志達到一定大小或者每隔一段時間將日志寫到新的一個文件中,舊日志文件可以用來備份或其它.
而Redis的AOF還和rotate略有不同,他用了一種比較簡單的方法,就是先給當前的所有數據做一個快照.然后再在這個快照的基礎上寫接下來的日志.
照快照的好處是,你之前可能用了10w次操作共改變了100條數據(比如在一條數據上進行了多次操作).那這時你AOF中的10w條寫操作記錄就變成了100條記錄.相當于將前面的執行全部合并了.原本很大AOF變小了.
執行這個操作的命令是:BGREWRITEAOF (background rewrite append only file)
這個快照長什么樣呢?基本和一般的寫日志沒什么兩樣,也是一條一條的寫記錄..比如現在Redis中總共存了3條string類型的數據a=>1,b=>2,c=>3.那這個快照的基本內容就是寫入a=>1,寫入b=>2,寫入c=>3.
這時候要用AOF進行恢復的時候,只要先執行了前面幾條,就能夠恢復當前狀態,然后再執行之后來的寫操作,就能完全重現數據了.
aof(append only file)日志文件有哪些用處
內部實現
我們大概知道了執行BGREWRITEAOF時都發生了什么,下面來說一下Redis是如何實現的.分下面幾步:
fork! Redis通過fork產生子進程.
子進程對當前數據執行遍歷操作,將當前所有數據都生成一條寫入日志,將這些日志寫入一個臨時文件.(其實是子進程寫了一個臨時文件,又再rename成了另一個臨時文件)
父子進程是并行執行的,在子進程遍歷并寫臨時文件的時候,父進程在照常接收請求,處理請求,寫AOF,不過這時他是把新來的AOF寫在一個緩沖區中.
當子進程完成遍歷操作,寫完臨時文件后,就會退出.這時父進程的wait3函數會接收到子進程退出的消息,他會把自己現在收集在緩沖區中的所有AOF追加在臨時文件中.
最后一步,把臨時文件rename一下,改名為appendonly.aof,這時原來的aof文件被覆蓋.整個過程完成.
如果你的AOF文件稍微大點,你可以在一個終端執行BGREWRITEAOF,然后立刻ls 連著查看幾次redis的data目錄,就可以看到,先生成了一個臨時文件,臨時文件比原來的appendonly.aof小一些,然后臨時文件消失,而原來的appendonly.aof變小了,其實就是臨時文件rename成了appendonly.aof..覆蓋了原來的大文件.看起來像是臨時文件消失了。
看完上述內容,你們對aof日志文件的用處有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。