Erstellen Sie eine konsistente Kopie von maildir

7

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 cpoder nur, um rsyncdas 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.

JojOatXGME
quelle
Stoppen Sie Taubenschlag und Ihre mta, dann machen Sie Ihre Kopie? Versuchen Sie dies auf einem Live-System zu tun? Haben Sie ein lvm-Setup, um Snapshots oder ein anderes Snapshot-Tool für das Dateisystem zu erstellen? Wofür ist diese Kopie? Migrieren Sie, ist es ein Backup?
Zoredache
@Zoredache Der Server läuft auf einer VM. Ich glaube nicht, dass es im Dateisystem ein Snapshot-Tool gibt. Ich würde aber auch nicht wissen, wie ein solches Tool die Konsistenz gewährleisten könnte. Schauen Sie sich meine Bearbeitung an, um Antworten auf Ihre anderen Fragen zu erhalten.
JojOatXGME
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.
Zoredache
@Zoredache Gibt es etwas, um mehrere Operationen zu einer einzigen Transaktion in einem Dateisystem zu kombinieren? Ich habe es noch nie gesehen. Verwenden Anwendungen wie Dovecot und Postfix es? Soweit ich weiß, gibt es keine Funktion, um solche Funktionen in modernen Standardbibliotheken wie C ++ 11 zu verwenden. Ich weiß, dass Dateisysteme so etwas wie Commits haben, um das Dateisystem selbst konsistent zu halten. Das heißt aber nicht, dass der Maildir auch konsequent ist.
JojOatXGME

Antworten:

7

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 Verzeichnisse new/, cur/und tmp/. Das Verzeichnis tmp/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 in tmp/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.lockvon 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.lockoder 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.lockerstellen 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/und dovecot-uidlist.lockvon Ihrem Backup auszuschließen .

JojOatXGME
quelle
1
Meine Strategie für den Maildir-Speicher bestand darin, ihn auf einem separaten logischen Volume (über LVM) zu speichern. Dann könnte ich das Volume (sofort) als Snapshot erstellen und dann meine Sicherung vom Snapshot-Volume erstellen. Hatte nie ein Problem.
Tgharold
@tgharold Ja. Soweit ich weiß, sollten Sie bei der Verwendung von Schnappschüssen nicht das dritte Problem haben. Jede Veränderung in new/und cur/scheint atomar zu sein. Das einzige wäre, dass Sie auch die Sperrdatei und die Dateien sichern können tmp/. Dies ist nichts, was Ihr Backup bremsen würde.
JojOatXGME
@JojOatXGME Wenn Sie sagen "Wenn Sie ein Backup erstellen möchten, während Dovecot ausgeführt wird, sollten Sie zuerst die Sperrdatei dovecot-uidlist.lock erwerben", wie genau wird das gemacht?
TommyPeanuts
Zum Zeitpunkt des Schreibens enthielt das Dovecot-Paket die Binärdatei /usr/lib/dovecot/maildirlock. Diese kleine ausführbare Datei kann verwendet werden, um die Sperre zu erhalten.
JojOatXGME
4

Eine aktualisierte Antwort auf diese Frage ist die Verwendung des Befehls doveadm oder dsync von dovecot. Beispiel:

dsync -f -u <user> backup maildir:<backup_location>
Toushin
quelle