purge binlog 性能优化

最近更新时间:2024-05-09 10:30:32

我的收藏

功能介绍

在数据库中,binlog 是用于记录数据库操作的日志文件,包括数据库的增删改操作等。随着时间的推移,binlog 文件会越来越多,占用大量磁盘空间,因此需要定期进行清理,也就是 purge binlog 操作。然而,purge binlog 和正常的 rotate 以及写事务会发生冲突,尤其是当 binlog 文件数量很多时,会导致在 purge binlog 操作时容易引起性能抖动。腾讯云内核团队通过对清理 binlog 文件场景的分析,对 purge binlog 的性能进行了优化。
优化 purge binlog 与 rotate binlog 的 LOCK_index 冲突,避免 rotate binlog 读取不到锁而无法继续 binlog 写入
当前在 purge binlog 持有 index lock 期间,binlog 达到了256M后需要 rotate binlog 时读取不到锁,导致写入停止,直到获取到 index lock 后才能继续。针对上述问题,主要优化为,如果 rotate binlog 读取不到 index lock,将不会 rotate binlog,将会继续写 binlog 到当前 binlog 文件。之后不断尝试获取 index lock,直到读取到 index lock 才会 rotate binlog。
减少了需要 purge 的 binlog 文件读取量,从而减少了锁
purge binlog 过程需要读取所有需要 purge 的 binlog 里的 Gtid 信息,然后写入到 mysql.gtid executed 表,所以 purge 期间的会一直持有 gtid 的排他锁,导致正常事务不能获取到 gtid 锁。针对上述问题,主要优化为,只读取 binlog 列表里的最后一个 binlog 文件里的 gtid,从而减少了 gtid 锁的持有时间,减少对正常事务的影响。
binlog 单个文件上限提高到10G,从而大量減少 rotate binlog 的次数
默认 binlog 大小为256MB,5000QPS压力下,大约每1.4s rotate 一次,每次 rotate 耗时10~20ms。当前 max_binlog_size 支持从256MB提升到10G(开源 MySQL 最大支持1G),同样压力下,56s rotate 一次,从而减少了 index 锁的获取频次。当前策略是设置为1G,可以根据业务压力的需要,进一步调整 max_binlog_size 的参数值。

支持版本

内核版本 TDSQL-C MySQL 版8.0 3.1.12及以上。
内核版本 TDSQL-C MySQL 版5.7 2.1.12及以上。

适用场景

在 binlog 文件数量很多时,执行 purge binlog 操作产生锁争用导致业务 binlog 写入阻塞的场景。

使用说明

通过参数使用该功能,将参数 txsql_binlog_rotate_try_lock_index,txsql_binlog_rotate_try_lock_log 设置为 ON,并设置参数 txsql_binlog_purge_check_file_count 的值为10,即可使用该能力,详细参数说明如下:
名称
是否全局
类型
默认
取值范围
说明
txsql_binlog_rotate_try_lock_index
全局
bool
ON
ON/OFF
设置为 ON 后,执行 binlog rotate 时如果读取不到 index 文件的锁,则放弃本次 rotate。
txsql_binlog_rotate_try_lock_log
全局
bool
ON
ON/OFF
设置为 ON 后,执行 binlog rotate 时如果读取不到 binlog 的锁,则放弃本次 rotate。
txsql_binlog_purge_check_file_count
全局
ulonglong
10
0-UINT64_MAX
执行 purge binlog 时会从 binlog index 文件获取 binlog 文件名,当 binlog 数量很多时,这个操作会很耗时,而正常情况下,只需要获取一个 binlog 文件名称就能达到目的。该参数控制了获取的文件名数量,0表示不限制,一般设置成10即可。