Ist data = journal für Ext4 sicherer als data = ordered?

36

Der Standardjournalmodus für Ext4 ist data=ordered, was laut Dokumentation bedeutet, dass

"Alle Daten werden direkt in das Hauptdateisystem übertragen, bevor ihre Metadaten in das Journal übernommen werden."

Es gibt jedoch auch die data=journalOption, was bedeutet, dass

"Alle Daten werden in das Journal geschrieben, bevor sie in das Hauptdateisystem geschrieben werden. Durch Aktivieren dieses Modus werden die verzögerte Zuordnung und die O_DIRECT-Unterstützung deaktiviert."

Ich verstehe dies so, dass der data=journalModus alle Daten sowie Metadaten aufzeichnet, was auf den ersten Blick zu bedeuten scheint, dass dies die sicherste Option in Bezug auf Datenintegrität und Zuverlässigkeit ist, auch wenn dies für die Leistung möglicherweise weniger wichtig ist.

Sollte ich mich für diese Option entscheiden, wenn die Zuverlässigkeit von größter Bedeutung ist, die Leistung jedoch viel weniger? Gibt es irgendwelche Einschränkungen bei der Verwendung dieser Option?

Im Hintergrund befindet sich das betreffende System in einer USV, und das Schreib-Caching ist auf den Laufwerken deaktiviert.

Tim
quelle

Antworten:

30

Ja, es data=journalist die sicherste Methode, Daten auf die Festplatte zu schreiben. Da alle Daten und Metadaten in das Journal geschrieben werden, bevor sie auf die Festplatte geschrieben werden, können Sie unterbrochene E / A-Aufträge im Falle eines Absturzes immer wieder abspielen. Außerdem wird die Funktion für verzögerte Zuweisung deaktiviert , was zu Datenverlust führen kann .

Die 3 Modi werden in der Reihenfolge der Sicherheit im Handbuch dargestellt :

  1. data = journal
  2. Daten = bestellt
  3. data = Rückschreiben

Es gibt auch eine andere Option, die Sie interessieren könnte:

commit=nrsec    (*) Ext4 can be told to sync all its data and metadata
                    every 'nrsec' seconds. The default value is 5 seconds.

Die einzige bekannte Einschränkung ist, dass es furchtbar langsam werden kann. Sie können die Auswirkungen auf die Leistung verringern, indem Sie die Aktualisierung der Zugriffszeit mit dieser noatimeOption deaktivieren .

Coren
quelle
2
Sie weisen darauf hin, dass das Deaktivieren der verzögerten Zuordnung sicherer ist. Ich kann jedoch keinen Fall finden, in dem ein data=journalsichereres Ergebnis erzielt wird als mit data=ordered+ nodelalloc. Hast du eins?
Jérôme Pouiller
Die verzögerte Zuweisung, die zu Datenverlust führen kann, wird nicht deaktiviert.
Strg-Alt-Delor
3

Dieser Thread ist super alt, aber immer noch relevant.

Wir wollten viele winzige Schreibvorgänge in einer MySQL-Datenbank zusammenführen, die als VM unter KVM mit Ceph-RBD-Images ausgeführt wird.

Gast: CentOS 6 VMs / etc / fstab:

/dev/sda1               /                       ext4    defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,noatime,nodiratime,commit=60,data=journal,discard 1 1

Das Gerät '/ dev / sda' (1 TiB) befindet sich in einem NVMe-Pool mit komprimiertem Löschcode und ein relativ kleines (128 MiB) dediziertes Journalgerät in einem dreifach replizierten NVMe-Pool.

Hiermit die Befehle, die wir in einer Rettungsumgebung verwendet haben:

Nehmen Sie das Tagebuch ab:

tune2fs -O ^has_journal /dev/sda1;

Überprüfen Sie das Dateisystem auf Inkonsistenzen:

fsck.ext4 -f -C 0 /dev/sda1;

Blockgröße ermitteln:

tune2fs -l /dev/sda1;

Dediziertes Journalgerät formatieren (WARNUNG):

Die minimale Journalgröße sollte 1024 * Blockgröße betragen (aus Sicherheitsgründen verwenden wir 128 MiB).

Stellen Sie die Blockgröße so ein, dass sie der von / dev / sda1 entspricht

mke2fs -O journal_dev -L root_journal /dev/sdb1 -b 4096;

Hängen Sie das dedizierte Journalgerät an das Dateisystem an:

tune2fs -j -J device=LABEL=root_journal /dev/sda1;

MySQL-Einstellungen:

[mysqld]
innodb_old_blocks_time = 1000           # Prevent buffer pool pollution. Default as of MySQL 5.6
innodb_buffer_pool_size = 24576M        # MySQL Cache
innodb_log_buffer_size = 128M           # 25% of log_file_size
innodb_log_file_size = 512M             # 25% of the buffer_pool (no, not really)
query_cache_size = 128M                 # Query Cache
table_cache = 512                       # Make it large enough for: show global status like 'open%';
#mysqltuner.pl:
innodb_flush_method = O_DSYNC           # Don't validate writes. MySQL 5.6+ should use O_DIRECT
innodb_flush_log_at_trx_commit = 2      # Flush MySQL transactions to operating system cache
join_buffer_size = 256K
thread_cache_size = 4
innodb_buffer_pool_instances = 16
skip-innodb_doublewrite
David Herselman
quelle
2
so? Was hat sich geändert?
8.