SQLite auf ZFS und DRBD
Beobachtung
SQLite erzeugt viele kleine und teilweise synchrone Schreibzugriffe. Abhängig vom verwendeten Journal-Modus werden neben den eigentlichen Datenbankseiten zusätzliche Journal- oder WAL-Daten geschrieben. Im Cluster home-tamay-cloud zeigten SQLite-Workloads auf replizierten ZFS-Volumes besonders hohe IO-Latenzen und eine starke Write Amplification.
Die Anwendung, das Dateisystem, das ZFS-Zvol und das physische Medium können unterschiedliche Blockgrößen verwenden. Kleine Änderungen der Datenbank müssen dadurch möglicherweise auf größere Blöcke des darunterliegenden Storage-Backends abgebildet werden.
SQLite
|
v
Dateisystem
|
v
ZFS zvol
|
v
DRBD-Replikation
|
v
Consumer-SSD
Erkenntnis
Ein ungünstiges Verhältnis zwischen den Schreibgrößen der Anwendung und den Blockgrößen des Storage-Backends kann zusätzliche Read-Modify-Write- und Copy-on-Write-Operationen verursachen. ZFS-Metadaten, synchrone Schreibzugriffe und DRBD-Replikation verstärken die daraus entstehende physische Schreiblast.
Die Kombination aus SQLite, ZFS, DRBD und einer Consumer-SSD ohne DRAM-Cache bildet deshalb einen ungünstigen Storage-Pfad. Eine kleine logische Änderung innerhalb der SQLite-Datenbank kann mehrere Schreiboperationen auf dem physischen Datenträger auslösen.
Konsequenz
SQLite-Workloads mit relevanter Schreiblast werden nicht ohne vorherige Messung auf replizierten ZFS-Volumes betrieben. Tests müssen das tatsächliche Dateisystem, den Journal-Modus, die Blockgrößen, die Replikation und ein realistisches Schreibmuster berücksichtigen.
Abhängig von den Anforderungen werden folgende Alternativen bevorzugt:
-
LVM-basierte LINSTOR-Volumes
-
Lokaler Storage ohne DRBD
-
NVMe-basierter Storage
-
PostgreSQL für Anwendungen mit höherer Schreiblast oder eigener Replikation
Die pauschale Deaktivierung synchroner Schreibzugriffe ist keine geeignete Lösung, da sie die zugesicherten Haltbarkeitseigenschaften der Anwendung oder des Dateisystems verändern kann.