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”设备 (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