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
Antwort
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.
DirectIO bietet nicht die Garantien, die diese Frage stellt. Aber OSYNC Flag zu öffnen tut das, was erwartet wird, sicher. – ArekBulski
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.
- 1. std :: transformieren, um Garantien
- 2. Garantien über Schlüsseleindeutigkeit in std :: unordered_multimap
- 3. Gibt MFCreateAggregateSource irgendwelche Garantien für die Bestellung?
- 4. Hat die Reihenfolge der Attribute irgendwelche Garantien?
- 5. Implementierung der Oauth2-Anmeldung, Schwerwiegender Fehler: Klasse "Google_Service" nicht gefunden
- 6. Implementierung für implizite soziale Anmeldung im Frühjahr-Boot-Projekt
- 7. Garantien für die Adresse der Basisklasse in C++?
- 8. HttpURLConnection Kabel Anmeldung in Android
- 9. Rubys "nächste" Implementierung in Python
- 10. Was sind die Garantien für Scala Access Qualifiers?
- 11. Anmeldung in Django 1.5
- 12. Anmeldung in DBCP
- 13. Anmeldeskript Anmeldung nicht in
- 14. Sichere Anmeldung in Phonegap
- 15. Automatische Anmeldung in Android
- 16. Garantien für die Art von Threads für ExecutorService-Instanzen
- 17. Macht Amazon S3 irgendwelche Garantien für Ihre Daten?
- 18. Gibt es Garantien bezüglich der relativen Adressen von __DATA-Etiketten?
- 19. Anmeldung bei ASP.net Anmeldung über Google-Konto
- 20. Automatische Anmeldung
- 21. Effizienz der Anmeldung in PHP?
- 22. Domänenübergreifende Anmeldung in ASP.NET-Website
- 23. Anmeldung mit LinkedIn in Symfony
- 24. Anmeldung in Twitter mit curl
- 25. Anmeldung in einer PHP-Webanwendung
- 26. Facebook-Anmeldung mit OpenID implementieren
- 27. Wie aktiviere ich die Anmeldung in Thinktecture IdentityServer v3?
- 28. Implementierung von java.util.Map Verwendung Einsetzfolge als Auftrag
- 29. Android Login - Beste Implementierung
- 30. Implementierung von JSON ShouldSerialize in WebAPI
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. –