Angenommen, ich verwende Dovecot und das Maildir-Format, um E-Mails auf einem Server zu speichern und darauf zuzugreifen. Wie vermeide ich Rennbedingungen beim Kopieren eines Maildirs?
Ich habe ein Tutorial über Backups und die Verwendung von Maildir gelesen, aber es wurde niemand gesehen, der darüber schrieb. Sie verwenden cp
oder nur, um rsync
das Verzeichnis an einen anderen Ort zu kopieren. Ist es unmöglich, dass Maildir durch Kopieren zu einem inkonsistenten Zustand wird, oder brauche ich eine Art Sperre?
EDIT: Ich möchte regelmäßig Backups machen, aber ich denke nicht, dass es wirklich die Frage erfüllt. Ich weiß, dass ich den Mailserver (Dovecot und Postfix) stoppen könnte, aber ich denke, dass dies möglich sein sollte, ohne dies zu tun. Soweit ich weiß, unterstützt maildir den gleichzeitigen Zugriff durch verschiedene Anwendungen.
quelle
how such tool could ensure consistency
- Sie erhalten alle Anwendungen, die Änderungen festschreiben, damit Ihr Dateisystem konsistent ist. Erstellen Sie einen Snapshot, sichern Sie ihn gegen den schreibgeschützten konsistenten Snapshot und löschen Sie ihn, wenn Sie fertig sind.Antworten:
Ich habe gerade die Dokumentation für Maildir in Dovecot und einige andere Dokumente über Maildir und Maildir ++ gelesen . Ich hoffe, dass ich nichts Wichtiges verpasst habe.
Maildir ist so konzipiert, dass es ohne Schlösser funktioniert. Die meisten erforderlichen Operationen sind auf modernen Dateisystemen atomar. Dies bedeutet, dass Sie sich nicht viel um Rennbedingungen wie inkonsistentes Lesen kümmern müssen. Es gibt jedoch noch einige Probleme, wenn Sie ein Maildir sichern möchten, während der Mailserver ausgeführt wird.
Probleme
Das Sichern und Wiederherstellen
tmp/
ist nutzlos. Jede Maildir enthält die Verzeichnissenew/
,cur/
undtmp/
. Das Verzeichnistmp/
enthält E-Mails, die gerade auf die Festplatte geschrieben werden. Sie werden verschoben,new/
wenn sie erfolgreich geschrieben wurden. Dies bedeutet, dass die Dateien intmp/
möglicherweise noch nicht vollständig sind. Selbst wenn die Datei vollständig ist, wird der Prozess, der die Datei geschrieben hat, nach dem Wiederherstellen der Sicherung nicht mehr ausgeführt. Das heißt, wenn eine solche Datei wiederhergestellt wird, wird sie niemals zum Postfach hinzugefügt und möglicherweise nie entfernt.Es kann sinnvoll sein,
dovecot-uidlist.lock
von der Sicherung auszuschließen . Dovecot verwendet eine Erweiterung von Maildir namens Maildir ++. Diese Erweiterung muss verriegelt werden. Das Erwerben der Sperre zum Lesen ist für die Erweiterung nicht erforderlich, es kann jedoch sinnvoll sein, die Sperrdatei von der Sicherung auszuschließen.Erfassen
dovecot-uidlist.lock
oder verwenden Sie einen Snapshot des Dateisystems. Grundsätzlich können Sie das Verzeichnis einfach kopieren, es ist jedoch möglich, einige Mails aufgrund der Rennbedingungen zu verpassen. Der Grund ist, dass das Auflisten und Kopieren des Inhalts eines Verzeichnisses (rekursiv) nicht atomar ist. Dies bedeutet, dass es möglich ist, eine E-Mail beim Erstellen des Backups zu verpassen, wenn ein Benutzer ein Tag ändert (z. B. gesehen / nicht gesehen) oder die E-Mail verschiebt. Um solche Situationen zu bewältigen, erfasst Dovecot für jede Aktion die Sperrdatei (wie oben). Wenn Sie Dovecot verwenden, können Sie das Problem lösen, indem Sie die Sperre erwerben, bevor Sie das Backup erstellen. Dies kann mit gemacht werden/usr/lib/dovecot/maildirlock
. Eine andere Möglichkeit besteht darin, Snapshots Ihres Dateisystems zu verwenden. Da das Erstellen eines Snapshots atomar ist, tritt das Problem bei Snapshots nicht auf.Als kurze Zusammenfassung: Wenn Sie während der Ausführung von Dovecot ein Backup
dovecot-uidlist.lock
erstellen möchten, sollten Sie zuerst die Sperrdatei abrufen oder einen Snapshot Ihres Dateisystems erstellen. Dann können Sie den Maildir kopieren. Es kann sinnvoll sein,tmp/
unddovecot-uidlist.lock
von Ihrem Backup auszuschließen .quelle
new/
undcur/
scheint atomar zu sein. Das einzige wäre, dass Sie auch die Sperrdatei und die Dateien sichern könnentmp/
. Dies ist nichts, was Ihr Backup bremsen würde./usr/lib/dovecot/maildirlock
. Diese kleine ausführbare Datei kann verwendet werden, um die Sperre zu erhalten.Eine aktualisierte Antwort auf diese Frage ist die Verwendung des Befehls doveadm oder dsync von dovecot. Beispiel:
quelle