• 欢迎访问蜷缩的蜗牛博客 蜷缩的蜗牛
  • 微信搜索: 蜷缩的蜗牛 | 联系站长 kbsonlong@qq.com
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

【转载】sync_binlog和innodb_flush_log_at_trx_commit 浅析

数据库 蜷缩的蜗牛 2年前 (2017-03-07) 93次浏览 已收录 1个评论

innodb_flush_log_at_trx_commit 和 sync_binlog 两个参数是控制 MySQL 磁盘写入策略以及数据安全性的关键参数。本文从参数含义,性能,安全角度阐述两个参数为不同的值时对 db 性能,数据的影响.

一 参数意义

innodb_flush_log_at_trx_commit

如果 innodb_flush_log_at_trx_commit 设置为 0,log buffer 将每秒一次地写入 log file 中,并且 log file 的 flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
如果 innodb_flush_log_at_trx_commit 设置为 1,每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file,并且 flush(刷到磁盘)中去.
如果 innodb_flush_log_at_trx_commit 设置为 2,每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file.但是 flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL 会每秒执行一次 flush(刷到磁盘)操作。

注意:

  由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证 100%的“每秒”。

sync_binlog

sync_binlog 的默认值是 0,像操作系统刷其他文件的机制一样,MySQL 不会同步到磁盘中去而是依赖操作系统来刷新 binary log。

当 sync_binlog =N (N>0) ,MySQL 在每写 N 次 二进制日志 binary log 时,会使用 fdatasync()函数将它的写二进制日志 binary log 同步到磁盘中去。

注:

   如果启用了 autocommit,那么每一个语句 statement 就会有一次写操作;否则每个事务对应一个写操作。

根据上述描述,我做了一张图,可以方便大家查看。

二 性能

两个参数在不同值时对 db 的纯写入的影响表现如下:

 

 

 测试场景 1 测试场景 2 测试场景 3测试场景 4测试场景 5
innodb_flush_log_at_trx_commit2 1112
sync_binlog10001000110001000

 

场景TPS
场景 141000
场景 233000
场景 326000
场景 433000

由此可见,当两个参数设置为双 1 的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL 的写操作才能达到最高性能。

三 安全

当 innodb_flush_log_at_trx_commit 和 sync_binlog  都为 1 时是最安全的,在 mysqld 服务崩溃或者服务器主机 crash 的情况下,binary log 只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双 11 会导致频繁的 io 操作,因此该模式也是最慢的一种方式。

当 innodb_flush_log_at_trx_commit 设置为 0,mysqld 进程的崩溃会导致上一秒钟所有事务数据的丢失。
当 innodb_flush_log_at_trx_commit 设置为 2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

双 1 适合数据安全性要求非常高,而且磁盘 IO 写能力足够支持业务,比如订单,交易,充值,支付消费系统。双 1 模式下,当磁盘 IO 无法满足业务需求时 比如 11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N 为 500 或 1000) 且使用带蓄电池后备电源的缓存 cache,防止系统断电异常。

四 小结

系统性能和数据安全是业务系统高可用稳定的必要因素。我们对系统的优化需要寻找一个平衡点,合适的才是最好的,根据不同的业务场景需求,可以将两个参数做组合调整,以便是 db 系统的性能达到最优化。

参考文章

http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

http://dev.mysql.com/doc/refman/5.1/en/replication-options-binary-log.html#sysvar_sync_binlog

本文转载于http://blog.itpub.net/22664653/viewspace-1063134/


蜷缩的蜗牛 , 版权所有丨如未注明 , 均为原创丨 转载请注明【转载】sync_binlog 和 innodb_flush_log_at_trx_commit 浅析
喜欢 (1)
[]
分享 (0)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽