Il buffer Doublewrite di XtraDB/InnoDB
Il buffer doublewrite di InnoDB è stato implementato per recuperare le pagine scritte a metà. Questo può accadere se vi è una interruzione della corrente mentre InnoDB sta scrivendo una pagina su disco. Leggendo quella pagina, InnoDB può verificare la corruzione dal fatto che i checksum non corrispondono. Tuttavia, per effettuare il recupero, occorre avere una copia intatta della pagina.
Il buffer doublewrite fornisce quella copia.
Quando InnoDB invia una pagina al disco, questa viene prima scritta nel buffer doublewrite. Solo quando il buffer è stato inviato al disco, InnoDB scrive la pagina nella destinazione finale. Durante il recupero, InnoDB scansiona il buffer doublewrite e per ogni pagina valida che trova controlla se anche la pagina corrispondente nel file dei dati è valida.
Sebbene i dati siano scritti due volte, il buffer doublewrite non implica il doppio dell'I/O, perché i dati sono scritti nel buffer in un grande blocco sequenziale con una singola chiamata a fsync(). Impiega però un tempo maggiore, e l'effetto diviene visibile con uno storage veloce e un carico di lavoro con molte scritture.
Le impostazioni del buffer Doublewrite
Il buffer doublewrite può essere spostato su un drive differente, riducendo il contenimento sulle letture casuali. E' possibile usare la variabile di sistema innodb_doublewrite_file per specificare la posizione. Poiché il buffer doublewrite è costituito soprattutto da scritture sequenziali, un HDD tradizionale è una scelta migliore rispetto a SSD.
Per disattivare il buffer doublewrite, si imposta la variabile di sistema innodb_doublewrite a 0
. Questa operazione non è raccomandata nei sistemi di produzione. Una possibile alternativa sono le scritture atomiche - si veda FusionIO DirectFS atomic write support per i dettagli.