您可以通过开启WRITESET模式,设置binlog_transaction_dependency_tracking
和transaction_write_set_extraction
参数来控制事务的冲突检测机制,以便提高备库回放并行度,降低主从延迟。
WRITESET简介
MySQL默认的基于主库组提交来判断事务冲突的COMMIT_ORDER
模式,在一定程度上会受到主库并发度的影响。WRITESET模式解决了这个问题,当该模式开启时,每个事务提交时,会将当前事务修改的数据行与其他事务修改的数据行比较,只要事务修改的数据行互相不冲突,就可以在备库并行回放,能够解决大部分的备库回放并发度不够的问题。
开启条件
支持开启WRITESET的版本如下:
RDS MySQL 5.7小版本在20211231及以上。
RDS MySQL 8.0小版本在20210930及以上。
在DDL,大事务,修改外键表和无主键表这几种业务场景中,事务的冲突检测会从WRITESET退化到COMMIT_ORDER
模式,此时备库的可并发度不会比COMMIT_ORDER
差,建议备库和只读有复制延迟问题的用户主动开启WRITESET模式。
开启配置
开启WRITESET需要完成如下参数设置,详细操作请参见设置实例参数。
transaction_write_set_extraction = XXHASH64
binlog_transaction_dependency_tracking = WRITESET
binlog_transaction_dependency_history_size = 500000
binlog_transaction_dependency_history_size
是内存中保存的做冲突检测的数据行数量的上限值,该值越大,保存的数据行越多,事务间冲突检测后并发度越高。
参数取值规则
binlog_transaction_dependency_tracking
参数与transaction_write_set_extraction
参数存在关联关系,不正确的对应关系不允许设置,会被拦截。需要按照以下规则设置参数值。
binlog_transaction_dependency_tracking | transaction_write_set_extraction |
|
|
|
|
参数解释
binlog_transaction_dependency_tracking
和transaction_write_set_extraction
参数支持的内核小版本范围为:
RDS MySQL 5.7:[20211231, 99999999)
RDS MySQL 8.0:[20210930, 99999999)
binlog_transaction_dependency_tracking
:含义:在多线程并行回放(
replica_parallel_workers
或slave_parallel_workers
大于0)中,binlog_transaction_dependency_tracking
用于决定如何计算事务之间的冲突和依赖关系,让备库能够并行回放Binlog中的事务。默认值:
WRITESET
可选值及含义:
COMMIT_ORDER
:依赖主库组提交判断事务之间的依赖关系。如果两个事务在主库能够并行提交,表示这两个事务没有冲突,能够在备库并行回放。此模式容易受到主库并发度的影响。WRITESET
:用行级别粒度判断事务之间的依赖关系。在有主键或唯一键的表中,只要两个事务没有更新同一行,那么这两个事务就能在备库并行回放。不受主库并发的影响。WRITESET_SESSION
:同一SESSION
的事务在备库串行回放,不同SESSION
的事务按照WRITESET
的规则在备库回放。
transaction_write_set_extraction
:含义:用于决定
WRITESET
使用何种哈希算法计算数据行的哈希值。开启WRITESET
后,将使用此算法计算出的数据行哈希值,判断事务之间是否修改了相同的数据行。默认值:
XXHASH64
可选值及含义:
OFF
:不计算数据行的哈希值,要求WRITESET
处于关闭状态。XXHASH64
:使用64位的Hash
算法计算数据行的哈希值。
相关文档
您可以通过参数诊断功能,获取实例参数优化方案。
MySQL官方文档: