Es wird immer einen Kompromiss zwischen Ausfallsicherheit und Leistung geben.
Mit MySQL auf ext4 bewirkt der Standardwert barriers = 1 zwar eine Verlangsamung, die erste Aktion sollte jedoch nicht darin bestehen, das Journal zu deaktivieren oder data = writeback einzuschalten.
Erstens, wenn Ausfallsicherheit von großer Bedeutung ist, lohnt sich ein batteriegepuffertes RAID auf jeden Fall.
Die von mir ausgewählten Einhängeoptionen, insbesondere für nicht batteriegepuffertes RAID, sind:
/dev/mapper/vg-mysql--data /var/lib/mysql/data ext4 defaults,noatime,nodiratime,barrier=1,data=ordered 0 0
Dabei wird absichtlich nicht data = writeback verwendet, da ich keine Beschädigung des Dateisystems riskieren möchte, die dazu führt, dass "alte Daten nach einem Absturz und einer Journalwiederherstellung in Dateien angezeigt werden" (Zitat von man mount
).
Die ideale Konfiguration in my.cnf für die vollständige Ausfallsicherheit bei E / A-bezogenen Einstellungen ist:
[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
Ich habe mich für die folgende Abfolge von Kompromissen entschieden, um die Leistung zu steigern:
sync_binlog = 0
: Dies ist die erste MySQL-Konfiguration, die ich aus der vollen Ausfallsicherheit heraus ändere. Der Grund dafür ist, dass es eine signifikante Leistungsverbesserung gibt, insbesondere dort, wo binlog_format=row
(leider für Jira erforderlich). Ich verwende genügend MySQL-Replikate im Cluster, sodass ich eine Binärkopie von einem anderen Replikat erstellen würde, wenn das Binärprotokoll durch ein Stromausfallszenario beschädigt würde.
innodb_flush_log_at_trx_commit = 2
: Während ein Wert von 1 für die vollständige ACID - Konformität erforderlich ist, wird bei jedem Commit der Protokollpuffer in die Datei geschrieben, der Vorgang zum Löschen auf die Festplatte wird jedoch nicht ausgeführt Die Protokolldatei wird auch dann einmal pro Sekunde erstellt, wenn der Wert 2 ist. Beachten Sie, dass aufgrund von Prozessplanungsproblemen nicht 100% ig jede Sekunde gespült wird. " (Zitat aus MySQL-Dokumenten)
- Aktualisieren Sie die zu verwendenden Mount-Optionen
data=writeback
. Beachten Sie, dass Sie, wenn dies Ihr Root-Dateisystem ist, auch eine Kernel-Befehlszeilenoption übergeben müssen. Darauf habe ich bei coderwall ein paar Schritte gemacht .
- Testen Sie verschiedene Werte von
innodb_flush_method
. Es wird gezeigt, dass O_DIRECT die Leistung in einigen Workloads verbessert, aber es ist nicht selbstverständlich, dass dies in Ihrer Umgebung funktioniert.
- Upgrade auf SSDs, wobei in diesem Fall werden Sie auch erhöhen wollen
innodb_io_capacity
, und tune Einstellungen wie innodb_adaptive_flushing
, innodb_read_io_threads
, innodb_write_io_threads
, innodb_purge_threads
, und andere mögliche Einstellungen.