[Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Postfix, QMail, Sendmail, Dovecot, Cyrus, Courier, Anti-Spam
User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

[Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by daemotron » 2015-05-31 15:50

Moin,

ich ziehe gerade einen neuen Mailserver hoch und migriere dabei zu Dovecot 2.2.16. Es geht in Summe um nur relativ wenige Mailboxen (< 100), die es aber größentechnisch in sich haben. Momentan ist alles als Maildir gespeichert und bringt so gute 17 GiB auf die Wage, verteilt über mehr als 250.000 Dateien. Abgelegt ist das ganze auf einem ZFS Dataset in einem mirror-Pool, und so wird es auch auf der neuen Maschine sein.

Da ich sowieso am migrieren bin, überlege ich, ob eine Umstellung von Maildir auf sdbox oder mdbox Sinn ergibt. Mit dem IMAP Server selbst gibt es nur selten kleinere Performance-Probleme, die aber mehr auf Client Seite zu liegen scheinen. Sorgen macht mir etwas das Backup, da das Backup-Programm mittlerweile fast 6 Stunden auf einem Snapshot rumkaut und dabei ordentlich I/O erzeugt.

Was ich mich nun natürlich frage:
  • Wie stark verringert sich die Anzahl an Dateien, wenn man von Maildir auf mdbox umsteigt? (bei sdbox sollte sie gleich bleiben oder sogar leicht steigen)
  • Wie robust sind sdbox und mdbox im Vergleich zu Maildir?
  • Wie steht es um die Performance im laufenden IMAPd Betrieb?

Folgende Quellen habe ich bisher, dort jedoch nicht die gesuchten Antworten gefunden:
http://comments.gmane.org/gmane.mail.imap.dovecot/56535
https://www.heinlein-support.de/upload/ ... Server.pdf
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: [Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by Joe User » 2015-05-31 19:47

Ein Mailinglistenthread von 2012 zu dem Thema: http://www.dovecot.org/list/dovecot/201 ... 33060.html
Vor-, Nachteile und Layout von dbox: http://wiki2.dovecot.org/MailboxFormat/dbox

Bezüglich der Backups: Da Du bereits ZFS einsetzt, drängt sich dessen Snapshot-Fähigkeit geradezu auf. Ist in wenigen Sekunden/Minuten erledigt und mitlerweile genauso (in)stabil wie das Filesystem selbst (zumindest meinem Hörensagen nach).

Ansonsten würde ich wohl mdbox wählen, wenn ich die Konsistenz der Indexfiles sicherstellen könnte.

Interessant dürfte die Kombi aus sdbox und AltStorage sein, denn da könnte man konservative Backupprozesse auf Hotfiles (täglich/stündlich) und Coldfiles (wöchentlich/monatlich) aufteilen und so optimieren.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: [Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by daemotron » 2015-05-31 23:12

Joe User wrote:Ein Mailinglistenthread von 2012 zu dem Thema: http://www.dovecot.org/list/dovecot/201 ... 33060.html
Vor-, Nachteile und Layout von dbox: http://wiki2.dovecot.org/MailboxFormat/dbox

Danke, den Thread hatte ich noch nicht gefunden (den Wiki-Eintrag natürlich schon :wink:). Also fasse ich mal zusammen:

  • Maildir ist die sicherste Option, da mit Verlust einer Datei auch wirklich nur die Informationen der betreffenden Mail verloren gehen. Maildir ist aber auch die Variante mit dem größten I/O Load im laufenden Betrieb, da Dateien häufig umbenannt oder verschoben werden. Allerdings führt Dovecot auch hier Index-Dateien, was die Anzahl an readdir(3) Calls gegenüber anderen MUAs (wie z. B. Courier) deutlich reduziert. Bei Beschädigung können diese Index-Dateien problemlos aus den Maildir-Dateien wieder hergestellt werden.
  • sdbox verringert die I/O Last im laufenden Betrieb, da die Datei, in der die Mail enthalten ist, nach der Ablage in einer Mailbox nicht mehr angefasst wird. Alle Flags werden in einer zentralen Index-Datei gespeichert (pro Mailbox); wird diese beschädigt, sind die Flags weg, der Mailinhalt selbst bleibt aber erhalten.
  • mdbox verringert die operative I/O Last noch weiter, da die Gruppierung von Mails in Dateien die Packdichte erhöht und die Anzahl Dateien in einem Verzeichnis signifikant reduziert (bei entsprechender Rotate-Größe). In den zentralen Index-Dateien ist jetzt allerdings auch vermerkt, in welcher Datendatei eine Mail verpackt ist. Ist der Index futsch, kommt man auch an die Mails nicht mehr vernünftig ran. Außerdem ist das Format mit einem hohen temporären I/O Load verbunden - immer dann, wenn gepurged wird (per Cron) und so die Datendateien alle neu organisiert werden müssen. Außerdem löst ZFS das readdir-Problem auf ganz ähnliche Weise(1) wie mdbox - ob mdbox so gegenüber sdbox noch einen signifikanten Performance-Vorteil hat, wage ich daher zu bezweifeln.

Joe User wrote:Bezüglich der Backups: Da Du bereits ZFS einsetzt, drängt sich dessen Snapshot-Fähigkeit geradezu auf. Ist in wenigen Sekunden/Minuten erledigt und mitlerweile genauso (in)stabil wie das Filesystem selbst (zumindest meinem Hörensagen nach).

ZFS habe ich jetzt seit 6 Jahren produktiv (seit FreeBSD 8.0-rc1) im Einsatz, und mittlerweile ist es sehr stabil (eigentlich schon seit 8.1) und performant (seit 9.1 und 8.4). Die Snapshots sind wirklich schnell; das spielt sich eher im Millisekundenbereich ab. Trotzdem müssen die Daten vom Snapshot ja runtergekrazt und auf ein Remote System überspielt werden - sonst wäre das kein Backup, das den Namen auch verdient :wink:. Das passiert natürlich mit geringer Priorität im Hintergrund, damit die eigentlichen Dienste unbehelligt weiterlaufen können, frisst aber ordentlich Zeit, da alle Dateien mindestens einmal mit stat angefasst werden müssen (Vergleich mit vorhandenem Index - Dateiname, birthtime, ctime, mtime, im Zweifelsfall Bildung eines Hashwerts).

A propos Backup: hier unterscheiden sich die Formate wohl ebenfalls in der Handhabung, insbesondere wenn es um inkrementelle (oder differenzielle) Backups geht, was bei einem großen Mailspeicher durchaus sinnvoll ist:

  • Maildir zwingt ein inkrementelles Backup, den Mailinhalt immer wieder zu sichern, auch wenn nur ein Flag verändert wurde. Außerdem müssen sehr viele Dateien abgeglichen werden, die oft innerhalb eines Verzeichnisses liegen, da keine automatische Partitionierung erfolgt. readdir(3) & Co arbeiten je nach Dateisystem mit einem Laufzeitverhalten von normalerweise O(log(n)) (bei ZFS dank Hashed Index sogar etwas besser, dafür platzt hier dann irgendwann der Cache und es kommt zu einer langsamen Aufräumaktion im Cache) - das bedeutet, es dauert (wenn auch nested directories das Problem nicht wirklich lösen)
  • sdbox löst das readdir-Problem nicht, sorgt aber immerhin dafür, dass für Flag-Änderungen nur die Index-Datei, nicht aber der eigentliche Mailinhalt noch mal gesichert wird
  • mdbox reduziert das readdir-Problem; je stärker dieses jedoch reduziert wird (größere Rotate-Size), desto wahrscheinlicher ist es, dass eine der Datendateien verändert wird (z. B. durch Löschoperationen) und so wieder mit in der inkrementellen Sicherung landet. Um ein inkrementelles Backup effektiv zu halten, müssten Algorithmen ähnlich wie bei rsync eingesetzt werden, um nur ein binäres "diff" einer Datei zu speichern, und nicht die komplette Datei. Das ist aber wieder recht teuer (die diff Operation kostet dabei tatsächlich am meisten(2)).

Bleibt noch ein Blick auf die Robustheit im Schadensfall:

  • Der Tod einer Platte hätte überhaupt keine Auswirkung (dank ZFS mirror), egal bei welchem Format.
  • Beim gleichzeitigen Tod beider Platten werde ich zwingend auf den Stand des letzten Backups zurückgeworfen, egal mit welchem Format. Selbiges gilt, wenn ZFS einen Totalcrash baut oder ich versehentlich das Dataset massakriere.
  • Lediglich bei versehentlichem Löschen vereinzelter Dateien oder bei lokalem ZFS-Verkacken ist Maildir robuster als sdbox, das wiederum robuster ist als mdbox.

Joe User wrote:Ansonsten würde ich wohl mdbox wählen, wenn ich die Konsistenz der Indexfiles sicherstellen könnte.


Meine Bewertung:

  • Performance
    Die dbox-Formate müssten schneller sein als Maildir, da die Gesamtzahl an I/O Operationen geringer ist. Verglichen mit sdbox erwarte ich bei der Performance durch mdbox allerdings keinen signifikanten Gewinn, da ZFS das readdir-Problem auf dieselbe Weise löst wie mdbox (mit einer Hash Table). Außerdem saugt die erforderliche nächtliche Reorganisation der Storage-Dateien; diese müsste sehr sorgfältig mit den nächtlichen Backup-Jobs und PostgreSQL's Vacuum-Prozessen abgeglichen werden, um das System nicht sturmreif zu schießen.
  • Backup
    Beim Backup dürfte sdbox die Nase vorn haben, da Mail-Inhalte genau einmal ins Backup aufgenommen werden (besser als Maildir), und kein binäres Diff erforderlich ist (besser als mdbox).
  • Robustheit
    In dieser Kategorie ist Maildir Sieger. Allerdings lohnt es, bei einer Entscheidung zu betrachten, wie relevant die verschiedenen Ausfallszenarien für das eigene Setup sind

Meine Entscheidung:

Ich habe mich für sdbox entschieden. Meine Beweggründe:

  • Ich setze ZFS ein. Unter dieser Voraussetzung scheint mir sdbox mit die beste Performance zu bieten.
  • Beim Backup erhoffe ich mir eine Reduzierung des I/O Loads (vielleicht lassen sich die Indexdateien zur Bedarfsermittlung anzapfen) und eine geringere Anzahl zu sichernder Dateien im inkrementellen Modus.
  • Der Schadensfall "nervöser Löschfinger" und "lokale Dateisystemkorruption" ist bei mir in den letzten 8 Jahren nicht vorgekommen, dafür aber insgesamt 6 tote Festplatten (in zwei Servern). Mein Backup ist dank Inkrement normalerweise schlimmstenfalls 12 Stunden alt - ein akzeptables Verlustrisiko, betrachte ich die bei mir gegebene Eintrittswahrscheinlichkeit...

Wichtig: Diese Entscheidung basiert auf meinem Setup (ZFS, kein NSF, keine Replikation), meiner eigenen Erfahrung als Admin und Programmierer, sowie den hier zusammengetragenen Informationen. Zur Theorie gibt es viele Quellen (einige habe ich verlinkt, anderes ist Informatik-Wissen, das man sich aus Büchern wie Owsnicki-Klewe's "Algorithmen und Datenstrukturen" anlesen kann oder das man erwirbt, wenn man sich selbst mit systemnaher Programmierung befasst). Praktische Erfahrung mit sdbox habe ich aber bisher nicht gemacht, und echte Erfahrungsberichte sind rar (selbst Timo, Autor von Dovecot betont immer wieder, dass ihm keine Fallstudien aus dem Real Life vorliegen, die eine Migration von Maildir auf dbox tatsächlich vergleichbar darstellen).

Meine Entscheidung darf daher nicht als allgemein gültige Empfehlung aufgefasst werden. Ich hoffe aber, dass die ein oder andere Überlegung, der ein oder andere Link dabei hilft, in die Thematik einzusteigen, wenn jemand für ein anderes Setup diese Entscheidung treffen muss.


(1) ZFS nutzt intern Adelson-Velski-Landis Bäume (AVL), und deren Suchverhalten ist konstant O(log n) - siehe http://www.open-zfs.org/wiki/Publications (speziell: http://open-zfs.org/w/images/3/31/Perfo ... Wilson.pdf), sowie https://de.wikipedia.org/wiki/AVL-Baum

(2) Herausgefunden durch eigene Erfahrungen, siehe https://github.com/daemotron/libsynctory, insbesondere https://github.com/daemotron/libsynctory/issues/13 sowie https://github.com/daemotron/libsynctor ... 4e0d5e80fe
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: [Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by Joe User » 2015-06-01 02:05

Danke für die ausführliche Rückmeldung - Thread daher auf Sticky gesetzt.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

timeless2
Posts: 416
Joined: 2005-03-04 14:45
Location: Paris

Re: [Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by timeless2 » 2015-07-17 10:14

Vielen Dank für die ausführliche Zusammenstellung. Bei Gelegenheit würde mich auch interessieren, wie nun die praktischen Erfahrungen mit sdbox im Vergleich zu Maildir sind.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: [Dovecot] Mail Storage: maildir vs. sdbox vs. mdbox

Post by daemotron » 2015-07-20 11:18

Im laufenden Betrieb konnte ich kaum Unterschiede feststellen - Dovecot ist einfach ein sehr schneller MRA. Dovecot verursacht insgesamt etwas weniger I/O Load als vorher, aber wirklich vergleichen lässt sich das nicht:

  • Der neue Server hat doppelt so viel RAM wie der alte (32 GiB vs. 16 GiB)
  • Der neue Server hat modernere Festplatten und einen neueren Controller (Serial ATA 6,0 Gbit/s vs. Serial ATA 3,0 Gbit/s)
  • Der neue Server läuft mit FreeBSD 10.1, der alte lief mit 8.4 (und entsprechend älterer ZFS Version)
Daher würde ich erwarten, dass auch ein Dovecot mit Maildir auf der neuen Maschine wesentlich bessere Leistung gezeigt hätte. Wie viel von der I/O Last Senkung jetzt auf sdbox zurückzuführen ist, lässt sich nicht wirklich quantifizieren.

Auch beim Backup ist ein Vergleich schwierig: Basis sind immer ZFS Snapshots. Auf der alten Maschine wurden die Dateien gegen einen Index (Dateiname, Flags, Hashwert) abgeglichen und dann ggf. in ein Tar-Archiv gesichert (differenziell). Beim neuen Server nutze ich ein differenziell arbeitendes zfs send, was wesentlich effektiver arbeitet als selbst gebaute Differenz-Vergleiche. Die Zeit für eine Sicherung hat sich so von mehreren Stunden auf wenige Minuten verkürzt (die werden noch für Verschlüsselung, Kompression und Übertragung auf den Backup-Server benötigt); hauptsächlich aber, weil die alte Methode völlig ineffektiv war.

Mein persönliches Fazit daher: Für kleinere und mittlere Setups lohnt eher eine allgemeine Optimierung (schneller Controller, aktuelles OS, sinnvolle Backup-Methode) als der Umstieg auf ein anderes Mailbox-Format.
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time