PolarDB MySQL版优化了大事务写Binlog造成其他事务写Binlog夯住的问题。本文介绍该优化的使用方法和使用限制。
背景信息
开启Binlog后,事务在提交时需要记录Binlog,该过程如下图所示。各个事务在执行过程中会将产生的Binlog临时记录在各自的Binlog Cache结构中。提交事务时,若这些事务同时提交,它们将排队从各自的Binlog Cache结构中读取Binlog并写入Binlog文件中。如果某个正在排队的事务(Trx2)需要写大量的Binlog,例如,Binlog的规模为1 GB,写Binlog文件的时间长,导致这段时间后面排队的事务也无法写Binlog文件,因而无法完成提交。因此,系统在这段时间不可写,导致出现了大量的慢SQL,进而可能导致客户端重试或连接暴涨等问题,从而进一步加大系统压力。
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时,会自动忽略。
这种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大事务优化机制。取值范围如下:
该参数修改后立即生效,无需重启集群。 |
loose_binlog_large_trx_threshold_up | Global | Binlog大事务优化的阈值。开启Binlog大事务优化机制后,当单个事务产生的Binlog大小超过该阈值时,将采用优化的Binlog提交方式。
该参数修改后立即生效,无需重启集群。 |
性能对比
当集群的存储类型为PSL5时,集群开启和关闭Binlog大事务优化机制的效果对比如下图所示:
可以看到,开启Binlog大事务优化机制后,大事务提交的耗时被大幅缩短,提交导致的IO压力和长时间持写锁的问题被彻底消除。