OneSQL :: 让备库的Binlog日志回放速度提升5倍,无须再担心备库时延!

MySQL备库的Binlog回放速度一直是一个大的问题,在主库上大量事务是由多个客户端会话并发产生的,而在备库上所有的工作只能由一个线程来处理,因此很容易主库上事务产生的速度比备库恢复的速度快,从而备库越来越落后于主库。短时间的延时也许可以接受,如果在非业务高峰时都有时延,就得想办法进行拆库了。在读写分离方案中,监控备库时延、自动踢出延时太久的从节点,可是方案成功的一个关键因素,所以需要尽量加快备库Binlog日志回放的速度。

下面是针对MySQL开源版本的一个测试,在备库上没有开启Binlog,为保证数据库在意外故障时的数据安全将“innodb_flush_log_at_trx_commit”选项设成“1”。

mysql_relaylog_trx_commit_one

从监控上可以看到,每秒钟从主库接收到将近2MB的Binlog日志(“Dump”列值),而SQL回放线程只能处理每秒不到400KB的Binlog日志(“Reco”列值),时延当然会越来越大!因为是从库,所以可以将数据库运行在非安全模式下,将参数“innodb_flush_log_at_trx_commit”设置成0后的表现如何呢?

mysql_relaylog_trx_commit_zero

交果已经好很多了,可以看到有差不多3倍的提升,能否做得更好呢?下面我们将备库替换成OneSQL的对应版本(100%兼容,可以随时切来切去),看看性能有无提升?

onesql_relaylog_perf_realflush

可以看到备库基本上没有了时延,从“Dump”和“Reco”两列的值来看,基本上相等,表示主备事务处理的性能一致,就不会有时延产生了。三个测试都是在同一台机器、相同的软件环境下进行的,并且OneSQL还是单线程结构的日志回放。

在OneSQL中为SQL回放线程引入了异步事务提交,回放线程在提交事务后不再等待刷盘,而是唤醒独立日志线程进行异步刷出,既实时保护了数据,又得到了良好的性能。在OneSQL中还对从节点的Relay Log锁进行了优化,减少了IO线程和SQL线程对锁的争用,从而得到的更高的性能提升,无论下面的存贮是低速的SATA盘、共享存贮,还是快速的PCIE-Flash设备。