2012-05-24 4 views
7

Wenn man eine Folge von write(2) in Linux/Unix durch fdatasync(2) oder fsync(2) oder sync(2) getrennt auszustellen waren, ist sichergestellt, dass die erste write() wird auf der Festplatte vor Ihrem zweiten Schreib begangen werden() ? Die folgende SO post scheint zu sagen, dass solche Garantien nicht gegeben werden können, da mehrere Caching-Schichten beteiligt sind. Für Datenbanksysteme, die Konsistenz gewährleisten, scheint dies wichtig zu sein, da bei der WAL-Wiederherstellung (Write Ahead Logging) Ihre Protokolle auf der Festplatte gespeichert werden müssen, bevor sie tatsächlich geändert werden, so dass im Falle eines Anwendungs ​​/ Systemfehlers Sie können zu Ihrem letzten bekannten konsistenten Zustand zurückkehren. Wie wird dies in einem aktuellen Datenbanksystem sichergestellt/implementiert?Garantien in Vorausschreib Implementierung Anmeldung

+0

Ich würde die Erklärungen auf der SQLite-Website betrachten. Es beschreibt, wie die verwendeten Ansätze einen Überblick darüber geben, wann Hardware- (Synchronisations-) Flushes verwendet werden usw. –

Antwort

1

Der Systemaufruf sync() ist praktisch keine Hilfe überhaupt; es verspricht, die Schreib-zu-Datenträger-Operationen zu planen, aber das ist alles.

Die normale verwendete Technik ist die richtigen Optionen, wenn Sie open() der Dateideskriptor für die Plattendatei einzustellen: O_DSYNC, O_RSYNC, O_SYNC. Allerdings kommen die fsync() und fdatasync() ziemlich nah an die gleichen Effekte. Sie können auch auf O_DIRECTIO schauen, das oft unterstützt wird, obwohl es von POSIX überhaupt nicht standardisiert ist.

Letztendlich setzt das DBMS auf O/S, um sicherzustellen, dass Daten, die auf eine Festplatte geschrieben und synchronisiert werden, sicher sind. Solange das Gerät immer das zurückgibt, was das DBMS zuletzt geschrieben hat, auch wenn es aufgrund des Caching noch nicht auf der Festplatte liegt (weil es im nichtflüchtigen Cache gesichert ist, oder so ähnlich), ist es nicht kritisch . Wenn auf der anderen Seite NAS (Network Attached Storage) vorhanden ist, die nicht garantieren, dass das, was Sie zuletzt geschrieben haben (und auf dem Datenträger sicher war) beim Lesen zurückgegeben wird, kann Ihr DBMS leiden, wenn es erforderlich ist Wiederherstellung. Sie entscheiden also, wo Sie Ihr DBMS speichern, und stellen sicher, dass der Speicher vernünftig funktioniert. Wenn der Speicher nicht wie die hypothetische Festplatte ausreichend funktioniert, können Daten verloren gehen.

+0

DirectIO bietet nicht die Garantien, die diese Frage stellt. Aber OSYNC Flag zu öffnen tut das, was erwartet wird, sicher. – ArekBulski

0

Ja, fsync in modernen Versionen des Kernels beide flush Speicher (Puffer-Cache) auf Festplatte und Festplatte Hardware-Puffer zu Plattenteller. Die Man-Seite sagt, dass ältere Kernel nur das erste tun.

BESCHREIBUNG FSYNC() überträgt („Flush“) alle in Kerndaten von (zum dh modifizierte Puffer-Cache-Seiten), modifiziert die Datei in durch die Datei bezeichnet Beschrei- tor fd auf die Platte Gerät (oder andere permanente Speichergerät), so dass alle geänderten Informationen abgerufen werden können, auch nachdem das System abgestürzt oder neu gestartet wurde. Dazu gehört Schreiben oder Löschen eines Disk-Cache, falls vorhanden. Der Anruf blockiert, bis das Gerät meldet, dass die Übertragung abgeschlossen ist. Es löscht auch Metadaten-Informationen, die zugeordnet sind, mit der Datei (siehe Stat (2)).

Die fsync() - Implementierungen in älteren Kernen und weniger verwendeten filesystems weiß nicht, wie Datenträger-Caches bereinigt werden. In diesen Fällen müssen Plattencaches mit hdparm (8) oder sdparm (8) deaktiviert werden, um einen sicheren Betrieb zu gewährleisten.

Dies bezieht sich auf Anwendungen, die angefordert werden können. Fsync ist eine Schnittstelle, die Dateisysteme für Anwendungen bereitstellen, Dateisysteme selbst verwenden etwas anderes darunter. Dateisysteme verwenden Barrieren bzw. explizite Flushes und FUA-Requests, um das Journal zu committen.Schauen Sie sich LWN post.

Verwandte Themen