Backup

製作一致的maildir副本

  • March 19, 2022

假設我正在使用 Dovecot 並且它是 maildir 格式來保存和訪問伺服器上的郵件。複製郵件目錄時如何避免競爭條件?


我確實閱讀了一些關於備份和使用 maildir 的教程,但沒有看到有人寫過這個。他們只是使用cprsync將目錄複製到另一個地方。maildir不可能通過複製成為不一致的狀態,還是我需要某種鎖定?

**編輯:**我想進行定期備份,但我認為這並不適合這個問題。我知道我可以停止郵件伺服器(Dovecot 和 Postfix),但我認為不這樣做應該是可能的。據我所知,maildir 支持不同應用程序的並發訪問。

我剛剛閱讀了 Dovecot 中 Maildir 的文件以及其他一些關於 Maildir 和 Maildir++ 的文件。我希望我沒有錯過任何重要的事情。


Maildir 旨在無鎖工作。大多數必需的操作在現代文件系統上都是原子的。這意味著您不必太在意諸如不一致讀取之類的競爭條件。但是,如果您想在郵件伺服器執行時備份 Maildir,仍然存在一些問題。

問題

  • **備份和恢復tmp/是沒有用的。**每個 Maildir都包含目錄new/和。目錄包含目前正在寫入磁碟的郵件。當它們寫入成功時,它們會被移動到。這意味著其中的文件可能還不完整。即使文件完整,在恢復備份後寫入文件的程序也不再執行。這意味著如果此類文件被恢復,它將永遠不會添加到郵箱中,也可能永遠不會被刪除。cur/``tmp/``tmp/``new/``tmp/
  • **dovecot-uidlist.lock從備份中排除可能是明智的。**Dovecot 使用 Maildir 的副檔名為 Maildir++。此擴展需要鎖定。擴展不需要獲取讀取鎖,但從備份中排除鎖文件可能是明智的。
  • **獲取dovecot-uidlist.lock或使用文件系統的快照。**基本上,您可以只複製目錄,但可能會因競爭條件而錯過一些郵件。原因是列出和複製目錄的內容(遞歸)不是原子的。這意味著當使用者更改標籤(例如已看到/未看到)或移動郵件時,在創建備份時可能會失去一封電子郵件。為了處理這種情況,Dovecot 為每個動作獲取鎖文件(同上)。如果您使用 Dovecot,您可以通過在創建備份之前獲取鎖來解決問題。這可以通過/usr/lib/dovecot/maildirlock. 另一種可能性是使用文件系統的快照。由於創建快照是原子的,因此問題不會發生在快照上。

**作為一個快速總結:**如果您想在 Dovecot 執行時進行備份,您應該首先獲取鎖定文件dovecot-uidlist.lock或創建文件系統的快照。然後,您可以複製 Maildir。從備份中排除tmp/和排除可能是明智的。dovecot-uidlist.lock

引用自:https://serverfault.com/questions/758450