data = orderedとは対照的に、data = journalはExt4の方が安全ですか?


36

Ext4のデフォルトのジャーナルモードはdata=orderedであり、ドキュメントによると、

「すべてのデータは、メタデータがジャーナルにコミットされる前に、メインファイルシステムに直接出力されます。」

ただし、data=journalオプションもあります。つまり、

「すべてのデータはメインファイルシステムに書き込まれる前にジャーナルにコミットされます。このモードを有効にすると、遅延割り当てとO_DIRECTサポートが無効になります。」

これについての私の理解は、data=journalモードはすべてのデータとメタデータをジャーナルするということです。一見すると、これはデータの整合性と信頼性の面で最も安全なオプションであることを意味しているようですが、パフォーマンスにはそれほどではありません。

信頼性が最大の懸念事項であるが、パフォーマンスがそれほど重要でない場合、このオプションを選択する必要がありますか?このオプションを使用する際の注意事項はありますか?

背景として、問題のシステムはUPS上にあり、ドライブの書き込みキャッシュは無効になっています。

回答:


30

はい、data=journalデータをディスクに書き込む最も安全な方法です。すべてのデータとメタデータはディスクに書き込まれる前にジャーナルに書き込まれるため、クラッシュした場合に中断されたI / Oジョブをいつでも再生できます。また、データの損失につながる可能性のある遅延割り当て機能を無効にします。

3つのモードは、マニュアルの安全性の順に示されています

  1. data = journal
  2. data = ordered
  3. data = writeback

あなたに興味があるかもしれない別のオプションもあります:

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

唯一の既知の警告は、非常に遅くなる可能性があることです。このnoatimeオプションを使用してアクセス時間の更新を無効にすることにより、パフォーマンスへの影響を減らすことができます。


2
遅延割り当てを無効にする方が安全だと指摘します。ただし、+ data=journalより安全な結果が得られるケースは見つかりません。持っていますか?data=orderednodelalloc
ジェロームプイエラー16

データの損失につながる可能性のある遅延割り当てを無効にしているわけではありません。
ctrl-alt-delor

3

このスレッドは非常に古いですが、まだ関連しています。

MySQLデータベース上の多くの小さな書き込みをマージし、Ceph RBDイメージを使用してKVMの下でVMとして実行したかったのです。

ゲスト:CentOS 6 VMの/ etc / fstab:

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

「/ dev / sda」デバイス(1 TiB)は、圧縮された消去コード化NVMeプールにあり、トリプル複製NVMeプールに比較的小さな(128 MiB)専用ジャーナルデバイスがあります。

これでレスキュー環境で使用したコマンドは次のとおりです。

ジャーナルを切り離します。

tune2fs -O ^has_journal /dev/sda1;

ファイルシステムの不整合を確認します。

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

ブロックサイズを取得する:

tune2fs -l /dev/sda1;

専用ジャーナルデバイスのフォーマット(警告):

最小ジャーナルサイズは1024 *ブロックサイズである必要があります(安全のために128 MiBを使用しています)

/ dev / sda1のブロックサイズと一致するようにブロックサイズを設定します

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

専用のジャーナルデバイスをファイルシステムに接続します。

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

MySQL設定:

[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

2
そう?何が変わった?
sivann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.