Se si dovesse emettere una serie sequenziale di write(2)
in Linux/Unix separati da fdatasync(2)
o fsync(2)
o sync(2)
è garantito che il primo write() sarà impegnata su disco prima della seconda operazione di scrittura() ? Il seguente numero SO post sembra dire che tali garanzie non possono essere fornite, poiché sono coinvolti più livelli di memorizzazione nella cache. Per i sistemi di database che garantiscono la coerenza questo sembra essere importante, poiché nel ripristino WAL (Write Ahead Logging), i registri devono essere permanenti sul disco prima di modificare effettivamente i dati, in modo che in caso di un errore dell'applicazione/sistema puoi tornare al tuo ultimo stato coerente noto. Come viene garantito/implementato in un sistema di database reale?Garanzie in scrittura annotando avanti nell'attuazione
risposta
La chiamata di sistema sync()
non è praticamente di alcun aiuto; promette di pianificare le operazioni di scrittura su disco, ma questo è tutto.
La tecnica normale utilizzato è quello di impostare le opzioni corrette quando si open()
il descrittore di file per il file del disco: O_DSYNC
, O_RSYNC
, O_SYNC
. Tuttavia, lo fsync()
e lo fdatasync()
si avvicinano molto agli stessi effetti. Puoi anche guardare a O_DIRECTIO
che è spesso supportato, sebbene non sia standardizzato affatto da POSIX.
In definitiva, il DBMS si affida all'O/S per garantire che i dati scritti e sincronizzati su un disco siano sicuri. Finché il dispositivo restituirà sempre ciò che il DBMS ha scritto l'ultima volta, anche se non è ancora sul disco reale a causa del caching (perché è stato eseguito il backup nella cache non volatile, o qualcosa del genere), allora non è critico . Se, dall'altra, hai NAS (network attached storage) che non garantisce che quello che hai scritto l'ultima volta (e che è stato detto sia sicuro su disco) viene restituito quando lo leggi, quindi il tuo DBMS può soffrire se deve farlo recupero. Quindi, scegli dove riporre i tuoi DBMS con cura, assicurandoti che lo spazio di archiviazione funzioni sensibilmente. Se la memoria non funziona a sufficienza come il disco ipotetico, si può finire per perdere dati.
DirectIO non fornisce le garanzie richieste da questa domanda. Ma il flag OSYNC per aprire fa quello che ci si aspetta, certo. – ArekBulski
Sì, fsync
nelle versioni moderne del kernel fa sia svuotare la memoria (buffer cache) sul disco e il buffer hardware del disco sul piatto. La pagina man dice che i kernel più vecchi erano soliti fare solo la prima cosa.
DESCRIZIONE fsync() trasferimenti ("vampate") tutti i dati modificati in-core di (cioè pagine di cache buffer modificato per) il file di cui dal file descri- tor fd al disco dispositivo (o altro dispositivo di memorizzazione permanente ) in modo che tutte le informazioni modificate possano essere recuperate anche dopo che il sistema si è bloccato o è stato riavviato. Ciò include scrittura o svuotamento di una cache del disco, se presente. I blocchi di chiamata fino a quando il dispositivo segnala che il trasferimento ha completato. Inoltre scarica le informazioni sui metadati associati allo con il file (vedere stat (2)).
Le implementazioni fsync() nei kernel più vecchi e meno utilizzati file system non sanno come svuotare le cache del disco. In questi casi le cache del disco dei casi devono essere disabilitate utilizzando hdparm (8) o sdparm (8) per garantire un funzionamento sicuro.
Si riferisce a ciò che le applicazioni possono richiedere. Fsync è un'interfaccia che i filesystem forniscono alle applicazioni, i filesystem stessi usano qualcos'altro sotto. I filesystem usano barriere, o piuttosto scarichi espliciti e richieste FUA per il commit del journal.Guarda LWN post.
- 1. Garanzie sull'indirizzo di baseclass in C++?
- 2. Garanzie sull'unicità della chiave in std :: unordered_multimap
- 3. std :: trasformare garanzie di ordine
- 4. annotando molti punti con testo in mayavi usando mlab
- 5. Garanzie di inizializzazione dell'array Java
- 6. Redirect o in avanti
- 7. Spring MVC, in avanti
- 8. Google Cloud Bigtable Durata/Disponibilità Garanzie
- 9. Informazioni sul segreto in avanti
- 10. Scala e riferimenti in avanti
- 11. Cosa sono le dichiarazioni in avanti in C++?
- 12. Correzione degli errori in avanti in .NET
- 13. escaping le barre in avanti in elasticsearch
- 14. In errore Riprendi Avanti in Javascript?
- 15. dired indietro/avanti funzione
- 16. avanti regressione graduale
- 17. avanti-dichiarando puntatore template
- 18. QTableView Zoom avanti/indietro
- 19. avanti dichiarando informazioni eredità
- 20. Programmazione C: lista argomenti variabili in avanti
- 21. in avanti da log4net a NLog
- 22. Selettore avanti a più oggetti in Swift
- 23. Perché std :: avanti inutile in questo contesto
- 24. std :: vector in avanti tipo dichiarato
- 25. riferimenti di classe avanti in Scala?
- 26. Gestisci avanti e indietro in Richfaces
- 27. Compatibilità avanti o indietro in Android?
- 28. EGIT respinto in avanti non veloce
- 29. Prendi l'ultimo frammento in pila avanti
- 30. scala riferimento in avanti estende definizione
Vorrei dare un'occhiata alle spiegazioni sul sito SQLite. Descrive come gli approcci utilizzati in quanto fornisce una panoramica su quando vengono utilizzati gli svuotamenti hardware (sincronizzazione), ecc. –