Re: ZFS Snapshots bei laufendem Download

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Sun, 16 Feb 2014 12:27:49 +0100 (CET)

Sascha Klix wrote:
> ich bin neu im FreeBSD und ZFS Umfeld und sehe mir gerade die
> Möglichkeiten von ZFS an. Dabei kam ich auf die Frage was passiert,
> wenn man einen Snapshot anlegt, während gerade eine Datei auf die
> Festplatte geschrieben wird.
>
> Also habe ich einen größeren Download gestartet und einen Snapshot
> angelegt, während der Download noch lief. Nachdem der Download zuende
> war, hab ich einen Rollback von dem Snapshot gemacht und die Datei
> war natürlich kaputt weil alles, was nach dem Snapshot geschrieben
> wurde, war gelöscht.

Der entscheidende Punkt ist, dass das Dateisystem (hier ZFS)
nichts vom inneren Aufbau einer Datei weiß. Es weiß nicht,
ob eine längere Datei, an deren Ende gerade etwas geschrieben
(angehängt) wird, ein Download ist (z.B. ein Film) oder eine
Log-Datei oder sonst etwas. ZFS hat also im prinzip gar nicht
die Möglichkeit, zu entscheiden, was im Augenblick eines
Snapshots mit so einer Datei geschehen soll bzw. was wohl am
sinnvollsten wäre.

Das Dateisystem hat eigentlich keine andere Wahl, als einfach
zu dem Zeitpunkt zwischen zwei Schreibzugriffen einen Strich
zu ziehen und alles, was bis zu diesem Punkt geschrieben wurde,
dem Snapshot zuzuordnen. Und alles, was danach kommt, ist dann
halt nicht im Snapshot drin. Bei Log-Dateien ist das nicht
schlimm; dort fehlen dann halt einfach die neueren Einträge.
Eine Video-Datei ist dann natürlich unvollständig ("kaputt").

Rein theoretisch könnte der Snapshot-Code warten, bis alle
Dateien geschlossen wurden, so dass keine Schreibzugriffe mehr
stattfinden, aber wie lange soll er da warten? Log-Dateien
zum Beispiel werden oft nie geschlossen und bleiben so lange
offen, wie das Programm läuft, das sie geöffnet hat.

Langer Rede kurzer Sinn: ZFS kann nur dafür sorgen, dass das
Dateisystem selbst in einem konsistenten Zustand ist, nicht
aber die innere Struktur einer Datei.

> Muss man einfach damit leben, das sowas passieren kann oder
> kann ich irgendwie dafür sorgen, dass sowas nicht passiert. Man
> könnte natürlich dafür sorgen, dass zum Zeitpunkt des Snapshots
> so wenig wie möglich geschrieben wird. Aber das stell ich mir auf
> einem Produktivsystem eher schwierig vor.

Wenn Du möchtest, dass bei einem Snapshot auch der Inhalt
aller Dateien in einem konsistenten Zustand ist, musst Du
dafür sorgen, dass keine Schreibzugriffe auf dem Dateisystem
mehr stattfinden. Im Zweifel heißt das, alle Programme zu
beenden, die gerade darauf schreiben könnten.

Diese Problematik betrifft übrigens nicht speziell ZFS oder
FreeBSD. Bei anderen Snapshot-Implementationen (z.B. NetApp-
Filer) ist es ganz genauso. Es beschränkt sich nicht einmal
speziell auf Snapshots: Bei einem Journaling-Filesystem z.B.
hat man im Grunde genommen eine ganz ähnliche Problematik;
auch hier muss bei einem Rollback oder Replay (z.B. nach
einem Crash) ein Punkt zwischen zwei Schreibzugriffen
gesetzt werden.

> Und wie sieht es mit Datenbankdateien aus.

Das betrifft natürlich auch Datenbanken, wobei das in der
Praxis aber nicht so viel ausmacht. Bei PostgreSQL etwa ist
es praktisch unmöglich, die Datenbank bei einem Snapshot so
kaputtzumachen, dass sie nicht mehr geladen werden kann.
Mysql ist nicht ganz so robust, hat sich in den letzten
Jahren aber auch gebessert. Um Datenbanken würde ich mir
daher eher geringe Sorgen machen.

Darüber hinaus sollte man allerdings im Hinterkopf behalten,
dass Snapshots nicht das geeignetste Mittel sind, um Backups
von Datenbanken zu erhalten. In der Regel haben Datenbanken
einen eigenen Mechanismus für Backups (z.B. SQL-Dumps), und
diesen sollte man auch nutzen, denn dabei wird natürlich die
innere Struktur der Datenbank berücksichtigt.

> Die könnten ja auch beschädigt werden, wenn man im laufendem
> Betrieb Snapshots wiederherstellt.

Achtung: Snapshots sollte man auf keinen Fall im laufenden
Betrieb wieder herstellen! Der Datenbank-Code wird es übel
nehmen, wenn ihm unerwartet die Daten "unter dem Hintern"
manipuliert werden. Du solltest die Datenbank stoppen (und
evtl. andere Programme, die gerade aktiv auf dem Dateisystem
arbeiten und ähnliche Probleme bekommen könnten), und dann
den Rollback machen.

Fazit: Ob Snapshots geeignet sind, Backups eines laufenden
Produkivsystems zu machen, muss man im Einzelfall entscheiden
und Vor- und Nachteile gegeneinander abwägen.

Ich persönlich verwende Rollbacks von Snapshots höchstens auf
Development-Systemen, um zum Beispiel den Zustand nach einem
"missglückten" Experiment wiederherzustellen. Auf Produktiv-
Systemen verwende ich Snapshots nur, um einzelne Dateien
zurückzuholen, die versehentlich überschrieben oder gelöscht
wurden (Konfigurationsdateien, Webseiten usw., sofern sie sich
nicht sowieso in einer Versionsverwaltung befinden), aber in
der Regel nicht für komplette Rollbacks.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
"That's what I love about GUIs: They make simple tasks easier,
and complex tasks impossible."
        -- John William Chambless
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sun 16 Feb 2014 - 12:28:00 CET

search this site