Binlog大事务优化

PolarDB MySQL版优化了大事务写Binlog造成其他事务写Binlog夯住的问题。本文介绍该优化的使用方法和使用限制。

背景信息

开启Binlog后,事务在提交时需要记录Binlog,该过程如下图所示。各个事务在执行过程中会将产生的Binlog临时记录在各自的Binlog Cache结构中。提交事务时,若这些事务同时提交,它们将排队从各自的Binlog Cache结构中读取Binlog并写入Binlog文件中。如果某个正在排队的事务(Trx2)需要写大量的Binlog,例如,Binlog的规模为1 GB,写Binlog文件的时间长,导致这段时间后面排队的事务也无法写Binlog文件,因而无法完成提交。因此,系统在这段时间不可写,导致出现了大量的慢SQL,进而可能导致客户端重试或连接暴涨等问题,从而进一步加大系统压力。

image

PolarDB MySQL版针对性地推出大事务优化方案来解决该问题,使用该优化方案后,大事务写Binlog不再阻塞其它写Binlog事务的提交,避免系统短时间不可写入,从而产生大量写请求慢SQL或连接暴涨等问题。

版本要求

PolarDB MySQL版产品版本需为企业版或标准版,数据库引擎版本需为8.0.1,且小版本为8.0.1.1.42及以上。

说明

您可以通过查询版本号来确认集群版本。

使用限制

开启Binlog大事务优化后,大事务产生的Binlog将独占一个Binlog文件。如下图所示,其所在Binlog文件的头部除了包括Format Description Event、Previous Gtids Log Event等,还包括一个占位Event:Ignorable Log Event,当下游解析到该Event时,会自动忽略。

image

这种Binlog结构需要注意如下问题:

  • 下游复制节点无法使用以database并发方式的Multi-Threaded Replication,但可以使用logical clock并发方式,禁止指定slave_parallel_workers>0, slave_parallel_type='DATABASE',但允许指定slave_parallel_workers> 0, slave_parallel_type= 'logical_clock'

  • 对大事务所在的Binlog文件禁用checksum,其它Binlog文件不受影响。

使用方法

您需要将参数loose_enable_large_trx_optimization的值设置为ON来开启Binlog大事务优化机制。开启优化后,通过设置参数loose_binlog_large_trx_threshold_up来定义使用这种优化机制的事务大小的阈值。

说明

关于如何设置参数,请参见设置集群参数

参数的具体说明如下表:

参数名称

级别

参数说明

loose_enable_large_trx_optimization

Global

开启或关闭Binlog大事务优化机制。取值范围如下:

  • OFF(默认):关闭Binlog大事务优化机制。

  • ON:开启Binlog大事务优化机制。

该参数修改后立即生效,无需重启集群。

loose_binlog_large_trx_threshold_up

Global

Binlog大事务优化的阈值。开启Binlog大事务优化机制后,当单个事务产生的Binlog大小超过该阈值时,将采用优化的Binlog提交方式。

  • 默认值:1 GB

  • 取值范围:200 MB~300 GB

该参数修改后立即生效,无需重启集群。

性能对比

当集群的存储类型为PSL5时,集群开启和关闭Binlog大事务优化机制的效果对比如下图所示:

image

可以看到,开启Binlog大事务优化机制后,大事务提交的耗时被大幅缩短,提交导致的IO压力和长时间持写锁的问题被彻底消除。