redis中AOF的no-appendfsync-on-rewrite參數詳解


redis提供了兩種持久化機制,rdb和aof。

關於aof的原理,類似於預寫日志,不再解釋。其中幾個選項如下:

  appendfsync always:總是寫入aof文件,並完成磁盤同步
  appendfsync everysec:每一秒寫入aof文件,並完成磁盤同步

  appendfsync no:寫入aof文件,不等待磁盤同步。

可見,從持久化角度講,always是最安全的。從效率上講,no是最快的。而redis默認設置進行了折中,選擇了everysec。合情合理。

bgrewriteaof機制,在一個子進程中進行aof的重寫,從而不阻塞主進程對其余命令的處理,同時解決了aof文件過大問題。

現在問題出現了,同時在執行bgrewriteaof操作和主進程寫aof文件的操作,兩者都會操作磁盤,而bgrewriteaof往往會涉及大量磁盤操作,這樣就會造成主進程在寫aof文件的時候出現阻塞的情形,現在no-appendfsync-on-rewrite參數出場了。如果該參數設置為no,是最安全的方式,不會丟失數據,但是要忍受阻塞的問題。如果設置為yes呢?這就相當於將appendfsync設置為no,這說明並沒有執行磁盤操作,只是寫入了緩沖區,因此這樣並不會造成阻塞(因為沒有競爭磁盤),但是如果這個時候redis掛掉,就會丟失數據。丟失多少數據呢?在linux的操作系統的默認設置下,最多會丟失30s的數據。

因此,如果應用系統無法忍受延遲,而可以容忍少量的數據丟失,則設置為yes。如果應用系統無法忍受數據丟失,則設置為no。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM