Von der Idee einer eigenen Managed Hosting-Plattform bis zur Inbetriebnahme ist viel Zeit vergangen, Zeit, die wir insbesondere für eine sorgfältige Planung aufgewendet haben. Unser erklärtes Ziel war die Schaffung einer zuverlässigen und leistungsfähigen Plattform, um den hohen Ansprüchen unserer Kunden gerecht zu werden. Mit dem 100%igen Einsatz des ZFS-Dateisystems haben wir den Grundstein für den Erfolg der WoltLab Cloud gelegt.
In diesem ersten Artikel einer geplanten Serie zur WoltLab Cloud möchten wir einen Einblick in unsere Planungen und Erfahrungen aus dem Praxiseinsatz liefern und erklären, warum die Verwendung von ZFS für uns elementar wichtig war und ist. Mit Hilfe der WoltLab Cloud bieten wir unseren Kunden die bestmögliche Umgebung für den Betrieb unserer Forum-Software WoltLab Suite.
Bewährte Lösung aus dem Enterprise-Bereich
Die Wahl des Dateisystems erscheint oftmals banal und nebensächlich, dabei kann dies entscheidend für einen reibungslosen Betrieb sein. Der Verlust von einigen Dateien oder Systemabstürze sind bei einem privat genutzten System ärgerlich, aber von einem Server im Dauerbetrieb erwartet man einfach Stabilität rund um die Uhr.
Die Entwicklung von ZFS begann 2001 durch Sun Microsystems für den Einsatz auf dem hauseigenen Enterprise-Betriebssystem Solaris, wurde unter einer Open Source-Lizenz in OpenSolaris integriert und anschließend auf verschiedene Betriebssysteme portiert. In FreeBSD ist es nativ integriert, für den Einsatz unter Linux muss es als externes Modul geladen werden. Initial wurde die Linux-Portierung „ZFS on Linux“ für den Einsatz auf Supercomputern vorgenommen und ist heutzutage mit diversen neuen Funktionen als OpenZFS beispielsweise für den Betrieb der Zertifizierungsstelle „Let's Encrypt“ im Einsatz.
Über die Jahre hinweg haben wir ZFS schrittweise in unsere Abläufe integriert. Die integrierten Snapshots erlauben ein konsistentes und insbesondere schnelles Zurücksetzen der Dateien auf einen früheren Stand und haben uns zu Beginn bei der Entwicklung von Importern eine enorme Zeitersparnis eingebracht. Im Verlauf der folgenden Jahre hielt ZFS bei unserem Demo-Angebot Einzug, was uns wertvolle Erfahrungen für den späteren Einsatz in der WoltLab Cloud einbrachte.
Datenintegrität hat viele Facetten
Seit den Anfängen des Internet stand der Informationsaustausch an vorderster Stelle und Foren haben sich über Jahrzehnte als geeignete Plattform für den Austausch und die Bewahrung von Wissen herauskristallisiert. Die so gespeicherten Informationen stehen auch noch viele Jahre später zum Abruf zur Verfügung, Foren kann man auch ein Stück weit als moderne Form einer Bibliothek bezeichnen. Die Bewahrung von Informationen ist von elementarer Wichtigkeit, ein Datenverlust ist nicht nur ärgerlich, sondern kann auch das Vertrauen von Nutzern erschüttern. Ein derartiger Verlust von mühevoll zusammengetragenen und gepflegten Inhalten sorgt schnell dafür, dass sich die Nutzer von einer Seite abwenden.
Die meisten Datensicherungen greifen zu kurz
Regelmäßige Datensicherungen stellen ein probates Mittel gegen offensichtliche Fälle von Datenverlust dar, beispielsweise der Ausfall von Datenträgern oder anderer schwerwiegender Ausfälle. Weniger offensichtlich, aber ebenso fatal, sind verdeckten Datenverluste, die über einen längeren Zeitraum unentdeckt bleiben und die Informationen schleichend zerstören. Die Rede ist von „Bit rot“ bzw. „Data degradation“, dabei kommt es zu kleinsten Fehlern, bei denen oftmals nur ein einzelnes Bit falsch gespeichert wird. Die Auswirkungen können enorm sein, insbesondere wenn die Daten komprimiert vorliegen. Sehr anschaulich ist dies beispielsweise bei Bildern: Ein einzelnes fehlerhaftes Bit reicht aus, um die Grafik signifikant zu verfälschen oder gänzlich unbrauchbar zu machen. Das tückische an solchen Fehlern ist, dass diese oftmals erst sehr spät auffallen und es keine Datensicherung mehr ohne diesen Fehler gibt.
Das ZFS-Dateisystem setzt genau an diesem Punkt an und speichert separate Prüfsummen, die beim Lesen der Daten verglichen werden. Auf diese Weise können solche verdeckten Fehler zeitnah entdeckt und automatisiert behoben werden, in dem die fehlerhaften Daten durch eine intakte Kopie ersetzt werden. Als zusätzliche Verteidigungsmaßnahme gegen den schleichenden Datenverlust werden in regelmäßigen Zeitabständen alle Daten proaktiv auf Integrität geprüft („ZFS Scrub“), damit auch selten abgerufene Daten langfristig vor Schaden bewahrt werden können.
Sichere Schreiboperationen durch „Copy on Write“
Ein weiteres Merkmal von ZFS ist die „Copy on Write“-Methodik, mit der Änderungen an Daten sicher vorgenommen werden. Anstatt Teile von Daten durch eine neue Version zu überschreiben, wird stattdessen eine neue Kopie dieser neuen Daten gespeichert und anschließend die alte Version verworfen. Mit diesem Vorgehen wird ein sehr hohes Maß an Datensicherheit erreicht, weil Änderungen an einer Datei entweder vollständig oder gar nicht geschrieben sind. Ein Systemabsturz oder Stromausfall führen bei ZFS, anders als bei anderen Dateisystemen, somit zu keinen defekten Dateien, die bereits teilweise mit Daten überschrieben wurden.
Exkurs: Der lange Weg zum „Pooled Storage“
Es ist gängige Praxis, separate Partitionen und Dateisysteme für einzelne Verzeichnisse zu nutzen. Beispielsweise bietet es sich an, Protokoll-Dateien in einer separaten, in der Größe beschränkten, Partition abzulegen, um zu verhindern, dass im Fehlerfall die Protokolle den gesamten Speicherplatz ausfüllen und damit die Stabilität des gesamten Systems beeinträchtigen. Ebenso erlaubt diese Technik über so genannte „Mountpoints“ weitere Einschränkungen zu vergeben, beispielsweise kann mit noexec die Ausführung von Programmen aus diesem Speicherbereich grundsätzlich unterbunden werden.
Der Aufstieg und Fall des LVM
Im Verlauf der Zeit kristallisierten sich zunehmend die Unzulänglichkeiten von Partitionen heraus. Die Menge, Größe und Position der Partitionen auf den physischen Datenträgern ist nur mit viel Aufwand anpassbar und geht bedingt durch notwendige Systemneustarts mit potenziellen Ausfallzeiten einher. Darüber hinaus kann eine Partition maximal so groß werden wie die Kapazität des physischen Datenträgers, auf dem diese gespeichert wird.
Mit dem „Logical Volume Manager“ („LVM“) wurde das Problem teilweise gelöst, in dem dynamische virtuelle Partitionen eingesetzt werden, die physisch auf mehrere Datenträger verteilt werden können. Das Problem der fest eingestellten Kapazität der Partition wurde aber auch mit LVM nur bedingt gelöst, eine nachträgliche Verkleinerung von Partitionen gleicht auch weiterhin einer Quadratur des Kreises. Mit Techniken wie dem „Thin Provisioning“ (Überbelegung von Speicherplatz) konnte das Problem teilweise umgangen werden, schaffte damit aber in der Praxis neue und viel gravierendere Fehlerquellen.
ZFS packt das Problem an der Wurzel an
Die Trennung des Dateisystems von der Verwaltung der physischen Datenträger ist die eigentliche Ursache für das unlösbare Dilemma der klassischen Partitionierung. ZFS geht das Problem aus einer neuen Richtung an und vereint beide Aufgabengebiete auf sich selbst, um die Reibungspunkte zwischen Dateisystem und Datenträgerverwaltung aufzulösen.
In ZFS werden Datenträger in „zpool“ genannten Gruppen zusammengefasst, die als Einheit miteinander fungieren. Die Organisation von Daten erfolgt in „Datasets“, die konzeptionell als Partitionen mit flexibler Größe angesehen werden können. Der verfügbare Speicherplatz in einem Dataset wird lediglich durch die gemeinsam genutzte Kapazität des zpool begrenzt. Beim Speichern von Daten reduziert sich der freie gemeinsame Speicherplatz und beim Löschen wird dieser wieder freigegeben, unabhängig davon, in welchem Dataset dies stattfand.
Bei einer sich abzeichnenden Speicherknappheit können zusätzliche Datenträger im laufenden Betrieb hinzugefügt werden und stehen dann unmittelbar allen Datasets zur Verfügung. Datasets verfügen dennoch über die gewohnten Kontrollmechanismen zur Begrenzung der Speicherbelegung und umgekehrt ist es auch möglich, bestimmte Kontingente zu reservieren, die einem Dataset garantiert zur Verfügung stehen.
Die Vorteile von ZFS für die WoltLab Cloud
Die bis hierhin aufgeführten allgemeinen Vorzüge von ZFS sind aber nicht von theoretischer Natur, sondern haben sich auch bei uns im Praxiseinsatz bewährt und damit uns und unseren Kunden viele Vorteile eingebracht. Wir möchten daher etwas genauer beleuchten, wie wir ZFS nutzen und auf den Möglichkeiten von ZFS aufbauen.
Redundanz und Sicherheit der Daten
Alle von uns betriebenen Server laufen mit dem Betriebssystem Debian GNU/Linux und setzen auf „Root on ZFS“, die einzige Ausnahme stellt die /boot-Partition auf Basis von ext4 dar. Die Systeme nutzen dabei jeweils einen einzigen zpool („rpool“), je nach Einsatzzweck mit zwei (als mirror-vdev) oder sechs (als raidz2) Datenträgern im Verbund. Jeder Server verfügt damit über eine lokale Redundanz, zusätzlich sind in jedem Server Datenträgern von verschiedenen Herstellern zum Einsatz, um Totalausfälle auf Grund von Produktionsfehlern bestmöglich auszuschließen.
Angepasst an die eingesetzten Software-Komponenten verwenden wir einzelne Datasets, um sowohl den Speicherverbrauch begrenzen zu können als auch weitergehende Optimierungen vornehmen zu können. Ein gutes Beispiel dafür sind die Datasets für MySQL, die mit reduzierten ZFS-Blockgrößen (recordsize) arbeitet, um den internen Blockgrößen von MySQL zu entsprechen. Dieses Vorgehen sorgt für eine bessere Performance und reduziert die unnötige Abnutzung der eingesetzten SSDs („Write Amplification“).
Verwaltung der Kundendaten im laufenden Betrieb
Innerhalb unseres internen Netzwerks läuft eine von uns geschaffene Verwaltungssoftware (intern nur „Manager“ genannt), die automatisiert die Einrichtung von neuen Kunden vornimmt. Ein wesentlicher Bestandteil ist die Nutzung von separaten Datasets pro Kunden, die unterhalb von bestehenden Container-Datasets angelegt werden. Diese Verschachtelung erlaubt es uns, grundsätzliche Sicherheitsmaßnahmen, beispielsweise die Ausführung von Programmen in Datenspeicherorten verhindern, zentral vorzunehmen und so möglichst viele Verteidigungslinien gegen Angriffe zu schaffen.
Die Verwendung separater Datasets bietet uns neben der bereits angesprochenen Speicherplatzverwaltung noch einen weiteren Vorteil: Die einfache Handhabung aller Daten als eine logische Einheit. Im einfachsten Fall geht es nur darum, ohne großen Zeitaufwand ein Backup einzuspielen, gleichzeitig können wir mit denselben Mechanismen auch schnell und konsistent das Dataset auf ein anderes System verschieben („zfs send“). Statt nachträglich komplexe und fehleranfällige Mechanismen zu implementieren haben wir uns von Anfang an mit den Möglichkeiten von ZFS befasst, um unser gesamtes Konzept darauf aufzubauen.
Einmal pro Monat werden zusätzlich mit Hilfe des angesprochenen „ZFS Scrub“ sämtliche Daten auf Integrität überprüft. In Kombination mit den für bis zu 6 Wochen vorgehaltenen Backups pro Kunden können wir Fehler aktiv erkennen und korrigieren, bevor es zu spät ist.
Fazit: Für uns ist ZFS nicht nur eine Möglichkeit zur Speicherung von Daten, sondern stellt einen integralen Bestandteil unseres gesamten Betriebskonzeptes dar. Wir machen uns die Vorzüge von ZFS aktiv zunutze, um einen stabilen und hoch-performanten Betrieb der WoltLab Cloud gewährleisten zu können.