Ext4のデフォルトログモードはドキュメントによるdata=ordered
と
「メタデータがジャーナルにコミットされる前に、すべてのデータがデフォルトのファイルシステムに直接強制されます。」
ただし、オプションがありますdata=journal
。
「すべてのデータは、基本ファイルシステムに書き込まれる前にジャーナルにコミットされます。このモードを有効にすると、遅延割り当てとO_DIRECTサポートは無効になります。」
私が理解しているのは、このdata=journal
モードがメタデータだけでなくすべてのデータを記録することです。表面的には、これがパフォーマンスの面でそれほど安全ではないとしても、データの整合性と信頼性の面で最も安全なオプションであることを意味するようです。
信頼性が最も重要でパフォーマンスが重要ではない場合は、このオプションを選択する必要がありますか?このオプションを使用するときに注意することはありますか?
背景として、問題のシステムはUPSにあり、ドライブからの書き込みキャッシュは無効になっています。
答え1
はい、data=journal
これがディスクにデータを書き込む最も安全な方法です。すべてのデータとメタデータはディスクに書き込まれる前にログに書き込まれるため、競合が発生した場合はいつでも中断されたI / O操作を再生できます。また無効になります。遅延割り当てそのうちの特徴はデータ損失が発生する可能性がある。
この3つのモードは安全な順序で配置されています。手動:
- データ=ジャーナル
- データ=ソート
- データ = 書き込み保存
興味のある別のオプションがあります。
commit=nrsec (*) Ext4 can be told to sync all its data and metadata
every 'nrsec' seconds. The default value is 5 seconds.
唯一知られている注意事項は、速度が非常に遅くなる可能性があることです。このオプションを使用してアクセス時間の更新を無効にすると、パフォーマンスへの影響を減らすことができますnoatime
。
答え2
このスレッドは非常に古いですが、まだ関連性があります。
私たちは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」デバイス(1TiB)は圧縮された削除コーディングNVMeプールにあり、トリプルレプリケーションNVMeプールには比較的小さい(128MiB)専用ログデバイスがあります。
構造環境で使用するコマンドは次のとおりです。
別のログ:
tune2fs -O ^has_journal /dev/sda1;
ファイルシステムに矛盾がないか確認してください。
fsck.ext4 -f -C 0 /dev/sda1;
ブロックサイズのインポート:
tune2fs -l /dev/sda1;
プライベートログデバイスのフォーマット中(警告):
最小ログサイズは1024 *ブロックサイズでなければなりません(安全のために128MiBを使用してください)。
/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