Speicher-Pools in ZFS
Die physische Datenspeicherung beruht bei ZFS auf dem Konzept der Speicher-Pools. Früher wurden Dateisysteme auf ein einziges physisches Datenspeichergerät aufsetzend konzipiert. Damit mehrere Datenspeichergeräte adressiert werden können und Datenredundanz möglich wird, wurde das Konzept eines so genannten Volume Manager entwickelt, um für die Darstellung eines einzelnen Datenspeichergeräts zu sorgen. Dadurch müssen Dateisysteme nicht modifiziert werden, wenn mehrere Datenspeichergeräte genutzt werden sollen. Dieses Konzept brachte mehr Komplexität mit sich und behinderte die Weiterentwicklung, da das Dateisystem keine Kontrolle über die physische Speicherung von Daten auf den virtualisierten Volumes hatte.
In ZFS ist die Verwaltung einzelner Volumes nicht mehr erforderlich. Anstatt einer erzwungenen Erstellung virtueller Volume-Systeme fasst ZFS Datenspeichergeräte in so genannten Speicher-Pools zusammen. Ein solcher Speicher-Pool bestimmt die physischen Eigenschaften der Speicherung (Gerätestruktur, Datenredundanz usw.) und fungiert als flexibler Datenspeicher, aus dem Dateisysteme erstellt werden können. Dateisysteme sind nicht mehr auf bestimmte Speichergeräte beschränkt und können die Festplattenkapazität im Pool gemeinsam nutzen. Sie müssen die Kapazität eines Dateisystems nicht mehr vorher festlegen, da die Dateisysteme automatisch innerhalb der Festplattenkapazität erweitert werden, die im Speicher-Pool verfügbar ist. Wenn ein Pool um neuen Speicherplatz erweitert wird, können alle Dateisysteme dieses Pools diese neue Festplattenkapazität sofort nutzen, ohne dass dafür Konfigurationen geändert werden müssen. In mancherlei Hinsicht lässt sich die Funktionsweise eines Speicher-Pools mit der eines virtuellen Speichersystems vergleichen: Wenn ein DIMM-Speicherchip in ein System eingebaut wird, werden Sie vom Betriebssystem nicht gezwungen, Befehle auszuführen, um den neuen Speicher zu konfigurieren und einzelnen Prozessen zuzuweisen. Alle Prozesse des Systems verwenden automatisch diesen zusätzlichen Speicherplatz.
Transaktionale Semantik
ZFS ist ein transaktionales Dateisystem. Das bedeutet, dass der Dateisystemstatus auf dem Datenträger stets konsistent ist. Bei herkömmlichen Dateisystemen werden vorhandene Daten überschrieben. Dies kann dazu führen, dass sich ein Dateisystem in einem instabilen Zustand befindet, wenn beispielsweise zwischen dem Zeitpunkt der Zuweisung eines Datenblocks und dem der Verknüpfung mit einem Verzeichnis ein Stromausfall aufgetreten war. Früher wurde dieses Problem durch den Befehl fsck behoben. Dieser Befehl diente dem Zweck, den Zustand des Dateisystems zu überprüfen und zu versuchen, Inkonsistenzen zu beheben. Das Problem von inkonsistenten Dateisystemen verursachte Systemadministratoren viele Unannehmlichkeiten, und der Befehl fsck bot nicht die Garantie, alle Probleme zu beheben. Zuletzt wurden Dateisysteme entwickelt, die auf dem Konzept des so genannten Journaling beruhen. Beim Journaling werden Aktionen in einem eigenen Journal festgehalten, das im Falle von Systemabstürzen sicher eingespielt werden kann. Diese Methode verursacht jedoch unnötigen Datenverarbeitungsaufwand, da Daten zweimal geschrieben werden müssen. Außerdem entstehen oft weitere Probleme, wenn beispielsweise das Journal nicht fehlerfrei gelesen werden konnte.
Transaktionale Dateisysteme verwalten Daten mithilfe der so genannten Copy on Write-Semantik. Bei diesem Verfahren werden niemals Daten überschrieben, und jegliche Folge von Vorgängen wird entweder vollständig ausgeführt oder ganz ignoriert. Das bedeutet, dass ein Dateisystem bei diesem Verfahren durch Stromausfälle oder Systemabstürze grundsätzlich nicht beschädigt werden kann. Obwohl ganz zuletzt gespeicherte Daten unter Umständen verloren gehen können, bleibt das Dateisystem selbst stets konsistent. Darüber hinaus werden (mithilfe des O_DSYNC-Flags geschriebene) synchrone Daten stets vor der Rückkehr geschrieben, sodass sie niemals verloren gehen.
Prüfsummen und Daten mit Selbstheilungsfunktion
In ZFS werden alle Daten und Metadaten durch einen vom Benutzer auswählbaren Prüfsummenalgorithmus verifiziert. Herkömmliche Dateisysteme führten die Prüfsummenverifizierung datenblockweise aus, was auf die Volume-Verwaltungsschicht und den Aufbau dieser Dateisysteme zurückzuführen war. Aufgrund des herkömmlichen Aufbaus dieser Dateisysteme kann es vorkommen, dass bestimmte Fehler wie z. B. das Speichern eines Datenblocks an einem falschen Speicherort dazu führen kann, dass trotz fehlerhafter Daten keine Prüfsummenfehler vorhanden sind. ZFS-Prüfsummen werden so gespeichert, dass solche Fehler erkannt und der ordnungsgemäße Zustand des Dateisystems wiederhergestellt werden kann. Alle Prüfsummenverifizierungen und Datenwiederherstellungen finden auf Dateisystemebene statt und sind so für Anwendungsprogramme sichtbar.
Darüber hinaus bietet ZFS Selbstheilungsfunktionen für Daten. ZFS unterstützt Speicher-Pools mit unterschiedlichen Stufen der Datenredundanz. Bei Erkennung beschädigter Datenblöcke ruft ZFS die unbeschädigten Daten von einer redundanten Kopie ab und repariert die beschädigten Daten, indem es diese durch korrekte Daten ersetzt.
Konkurrenzlose Skalierbarkeit
Ein Schlüsselelement des ZFS-Dateisystems ist Skalierbarkeit. Das Dateisystem beruht auf der 128-Bit-Architektur, was die Speicherung von 256 Billiarden Zettabyte Daten ermöglicht. Alle Metadata werden dynamisch zugewiesen. Damit entfällt die Notwendigkeit, Inodes vorher zuweisen bzw. die Skalierbarkeit bei der ersten Erstellung eines Dateisystems anderweitig einschränken zu müssen. Alle Algorithmen wurden im Hinblick auf eine bestmögliche Skalierbarkeit entwickelt. Verzeichnisse können bis zu 248 (256 Billionen) Einträge enthalten, und für die Anzahl der Dateisysteme bzw. die Anzahl der in einem Dateisystem enthaltenen Dateien bestehen keine Beschränkungen.