web-dev-qa-db-ja.com

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

Ext4のデフォルトのジャーナルモードはdata=ordered、つまり、ドキュメントごとに、

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

ただし、data=journalオプション、つまり

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

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

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

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

37
Tim

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

3つのモードは、安全性の順に manual に示されています。

  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オプションを使用してアクセス時間の更新を無効にすることにより、パフォーマンスへの影響を軽減できます。

31
Coren

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

VM under KVM using Ceph RBD imagesを使用して、MySQLデータベースに多くの小さな書き込みをマージしたかったのです。

ゲスト: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
4
David Herselman