🕋【Redis乾貨領域】從底層徹底喫透AOF重寫(原理篇)

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"🕋 每日一句","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"color","attrs":{"color":"#40A9FF","name":"blue"}},{"type":"strong","attrs":{}}],"text":"不要輕易去依賴一個人,它會成爲你的習慣,當分別來臨,你失去的不是某個人,而是你精神的支柱。無論何時何地,都要學會獨立行走,它會讓你走得更坦然些。","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"🕋 前提介紹","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" ","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 爲了保證緩存數據的完整性和可靠性,Redis提供兩種持久化機制:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":2,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"RDB: 將數據庫的快照以二進制的方式保存到磁盤;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":2,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"AOF: 將所有寫入命令及相關參數以協議文本的方式寫入文件並持久保存磁盤;","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 本文只關心AOF,Redis Server將所有寫入的命令轉換成","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"RESP","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"協議文本的方式寫入AOF文件。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"🕋 AOF的實現","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" ","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" Redis的AOF是類似於log的機制,每次寫操作都會寫到硬盤上,當系統崩潰時,可以通過AOF來恢復數據。每個帶有寫操作的命令被Redis服務器端收到運行時,該命令都會被記錄到AOF文件上。由於只是一個append到文件操作,所以寫到硬盤上的操作往往非常快。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 其實Redis AOF 機制包括了兩件事,","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"Rewrite","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"和AOF,因爲AOF主要採用的方式屬於Append Of File的方式追加是文檔存儲,","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"本質內容暫時不考慮,本章重點內容是Rewrite機制","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 AOF執行案例","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"Redis Server收到","attrs":{}},{"type":"codeinline","content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"set key value","attrs":{}}],"attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"的的寫入命令,Redis server會進行以下幾步操作:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"將命令轉換成協議文本,轉換後的結果:","attrs":{}},{"type":"codeinline","attrs":{}}]}]}],"attrs":{}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"*3\n$3\nSET\n$3\nKEY\n$5\nVALUE","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"將協議文本追加到aof緩存,也就是","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"aof_buf","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":";","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"根據sync策略調用","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"fsync/fdatasync","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"到目前爲止已經成功保存數據,如果想要還原AOF,只需要將AOF裏命令讀出來並重放就可以還原數據庫。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 重寫的介紹","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"AOF持久化機制存在一個致命的問題,隨着時間推移,AOF文件會膨脹,如果頻繁寫入AOF文件會膨脹到無限大,當server重啓時嚴重影響數據庫還原時間,影響系統可用性。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"color","attrs":{"color":"#40A9FF","name":"blue"}},{"type":"strong","attrs":{}}],"text":"爲解決此問題,系統需要定期重寫AOF文件,目前採用的方式是創建一個新的AOF文件,將數據庫裏的全部數據轉換成協議的方式保存到文件中,通過此操作達到減少AOF文件大小的目的,重寫後的大小一定是小於等於舊AOF文件的大小","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 重寫的實現","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"rewrite類似於普通數據庫管理系統日誌恢復點,當AOF文件隨着寫命令的運行膨脹時,當文件大小觸碰到臨界時,rewrite會被運行。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"rewrite(bgrewriteaof相似)會像replication一樣,fork出一個子進程,創建一個臨時文件,遍歷數據庫內存數據,將每個key、value對輸出到臨時文件。輸出格式就是Redis的命令(RESP),但是爲了減小文件大小,會將多個key、value對集合起來用一條命令表達。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"rewrite期間的寫操作會保存在內存的rewrite buffer中,rewrite成功後這些操作也會複製到臨時文件中(指令傳播),在最後臨時文件會代替AOF文件。以上在AOF打開的情況下,如果AOF是關閉的,那麼rewrite操作可以通過bgrewriteaof命令來進行。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 重寫的類型","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"本文只關心BGREWRITE的問題,因此只介紹此命令的實現機制。","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"REWRITE: 在主線程中重寫AOF,會阻塞工作線程,在生產環境中很少使用,處於廢棄狀態;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"BGREWRITE: 在後臺(子進程)重寫AOF, 不會阻塞工作線程,能正常服務,此方法最常用。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 重寫的流程","attrs":{}}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"Redis Server啓動,如果AOF機制打開那麼初始化AOF狀態,並且如果存在AOF文件,讀取AOF文件。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"隨着Redis不斷接受命令,每個寫命令都被添加到AOF文件,AOF文件膨脹到需要rewrite閾值時又或者接收到客戶端的bgrewriteaof命令。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"fork出一個子進程進行rewrite,而父進程繼續接受命令,現在的寫操作命令都會被額外添加到一個","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"aof_rewrite_buf_blocks","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"緩衝中。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":4,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"當子進程rewrite結束後,父進程收到子進程退出信號,把","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"aof_rewrite_buf_blocks","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"的緩衝添加到rewrite後的文件中,然後切換AOF的文件fd。(此部分過程需要阻塞)","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":5,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"rewrite任務完成,繼續第二個步驟。","attrs":{}}]}]}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 實現關鍵點","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"由於寫操作通常是有緩衝的,所以有可能AOF操作並沒有寫到硬盤中,一般可以通過fsync()來強制輸出到硬盤中。而fsync()的頻率可以通過配置文件中的flush策略來指定,可以選擇每次事件循環寫操作都強制fsync或者每秒fsync至少運行一次。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"當rewrite子進程開始後,父進程接受到的命令會添加到aof_rewrite_buf_blocks中,使得rewrite成功後,將這些命令添加到新文件中。在rewrite過程中,原來的AOF也可以選擇是不是繼續添加,由於存在性能上的問題,在rewrite過程中,如果fsync()繼續執行,會導致IO性能受損影響Redis性能。所以一般情況下rewrite期間禁止fsync()到舊AOF文件。這策略可以在配置文件中修改。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"在rewrite結束後,在將新rewrite文件重命名爲配置中指定的文件時,如果舊AOF存在,那麼會unlink掉舊文件。這是就存在一個問題,處理rewrite文件遷移的是主線程,rename(oldpath, newpath)過程會覆蓋舊文件,這是rename會unlink(oldfd),而unlink操作會導致block主線程。這時,我們就需要類似libeio(http://software.schmorp.de/pkg/libeio.html)這樣的庫去進行異步的底層IO。作者在bio.c有一個類似的機制,通過創建新線程來進行異步操作。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 異步重寫的支持","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" Redis Server收到","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"BGREWRITE","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"命令或者系統自動觸發AOF重寫時,主進程創建一個子進程並進行AOF重寫,主進程異步等待子進程結束(信號量),此時主進程能正常接收處理用戶請求,用戶請求會修改數據庫裏數據,會使得當前數據庫的數據跟重寫後AOF裏不一致,需要有種機制保證數據的一致性。當前的做法是在重寫 AOF 期間系統會新開一塊內存用於緩存重寫期間收到的命令,在重寫完成以後再將緩存中的數據追加到新的AOF。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"在處理命令時既要將命令追加到 aof_buf,也要追加到重寫AOF Buffer。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 Rewrite存在的問題","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"重寫AOF Buffer是個不限大小的buffer,但用戶寫入的數據量較多時會出現以下兩個問題:","attrs":{}}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"佔用過多內存,浪費資源;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"主進程將AOF buffer數據寫入到新AOF文件中時會阻塞工作線程,用戶正常請求的延時會變高,嚴重情況下會超時,主備同步也會出問題,斷開重連,重新同步等。","attrs":{}}]}]}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"🕋 自動觸發條件","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" AOF裏存放了所有的redis 操作指令,文件達到條件或者手動bgrewriteaof命令都可以觸發rewrite。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"rewrite之後aof文件會保存keys的最後的狀態,清除掉之前冗餘的,來縮小這個文件.","attrs":{}}]},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"long long growth =(server.appendonly_current_size*100/base) - 100; \nif (growth >=server.auto_aofrewrite_perc)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" 在配置文件裏設置過:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" auto-aof-rewrite-percentage 100 (當前寫入日誌文件的大小超過上一次rewrite之後的文件大小的百分之100時就是2倍時觸發Rewrite)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":1,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"color","attrs":{"color":"#40A9FF","name":"blue"}},{"type":"strong","attrs":{}}],"text":"此外那個64m的代碼我就不列舉了 我相信大家都知道 哈哈,以後的篇章我會從源碼去分析介紹的,期待吧 哈哈。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"🕋 後臺Rewrite問題解決方案","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"🕋 官方解決方案(AOF_BUFFER_BLOCK不進行阻塞)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 主要思路是AOF重寫期間,主進程跟子進程通過管道通信,主進程實時將新寫入的數據發送給子進程,子進程從管道讀出數據交緩存在buffer中,子進程等待存量數據全部寫入AOF文件後,將緩存數據追加到AOF文件中","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}},{"type":"strong","attrs":{}}],"text":"(不是主進程寫入)","attrs":{}},{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":",此方案只是解決阻塞工作線程問題,但佔用內存過多問題並沒有解決。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"🕋 新解決方案(buffer配對文件機制)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 主要思路是AOF重寫期間,主進程創建一個新的aof_buf,新的AOF文件用於接收新寫入的命令,sync策略保持不變,在AOF重寫期間,系統需要向兩個aof_buf,兩個AOF文件同時追加新寫入的命令。當主進程收到子進程重寫AOF文件完成後,停止向老的aof_buf,AOF文件追加命令,然後刪除舊的AOF文件(流程跟原來保持一致);將將子進程新生成的AOF文件重命名爲appendonly.aof.last,具體流程如下:","attrs":{}}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"停止向舊的aof_buf,AOF文件追加命令;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"刪除舊的的appendonly.aof.last文件;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"交換兩個aof_buf,AOF文件指針;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":4,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"回收舊的aof_buf,AOF文件;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":1,"number":5,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"重命令子進程生成的AOF文件爲appendonly.aof.last;","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":" 系統運行期間同時存在兩個AOF文件,一個是當前正在寫的AOF,另一個是存量的AOF數據文件。因此需要修改數據庫恢復相關邏輯,加載AOF時先要加載存量數據appendonly.aof.last,再加載appendonly.aof。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章