2012-05-24 6 views
7

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

+0

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. –

risposta

1

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.

+0

DirectIO non fornisce le garanzie richieste da questa domanda. Ma il flag OSYNC per aprire fa quello che ci si aspetta, certo. – ArekBulski

0

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.