在弹性和性能之间总会有一个权衡。
在ext4上使用MySQL时,默认的barriers = 1确实会导致速度变慢,但是第一个操作不应是禁用日记功能或打开data = writeback。
首先,如果恢复能力至关重要,那么电池供电的RAID当然是值得的。
我选择的安装选项,尤其是在非电池支持的RAID上:
/dev/mapper/vg-mysql--data /var/lib/mysql/data ext4 defaults,noatime,nodiratime,barrier=1,data=ordered 0 0
这是有意不使用data = writeback的,因为我不想冒文件系统损坏的风险,导致“崩溃和日志恢复后,旧数据出现在文件中”(引用来自man mount
)。
为了使I / O相关设置具有全面的弹性,my.cnf中的理想配置是:
[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
我选择了以下折衷顺序以提高性能:
sync_binlog = 0
:这是我第一个脱离完全弹性的MySQL配置。这样做的原因是,它可以显着提高性能,尤其是在某些情况下binlog_format=row
(不幸的是,对于Jira而言)。我在集群中使用了足够的MySQL副本,如果binlog因断电而损坏,我将从另一个副本进行二进制复制。
innodb_flush_log_at_trx_commit = 2
:虽然要完全符合ACID的要求,值为1,但值为2“,则在每次提交时,日志缓冲区都会写到文件中,但不会对其执行刷新到磁盘的操作。值也为2时,日志文件也会每秒发生一次。请注意,由于流程调度问题,每秒刷新一次并不能保证100%每秒发生一次。” (引自MySQL文档)
- 更新安装选项以使用
data=writeback
。请注意,如果这是您的根文件系统,则还需要传递内核命令行选项。我在coderwall上做了一些步骤。
- 测试的各种值
innodb_flush_method
。显示O_DIRECT可以在某些工作负载中提高性能,但是并不能在您的环境中正常工作。
- 升级到固态硬盘,在这种情况下,你还需要提高
innodb_io_capacity
,并调整设置,如innodb_adaptive_flushing
,innodb_read_io_threads
,innodb_write_io_threads
,innodb_purge_threads
,和其他可能的设置。