前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql复制系列5-多线程复制

mysql复制系列5-多线程复制

原创
作者头像
wangwei-dba
修改2021-05-14 17:42:42
1.1K0
修改2021-05-14 17:42:42
举报
文章被收录于专栏:mysql-dbamysql-dba

mysql复制中最常见的问题就是主从复制延迟问题,mysql从一开始不支持并行复制,到一步一步的优化改进多线程复制,下面介绍一下mysql复制单线程到多线程复制的历程

1.单线程复制:

mysql复制最早就是单线程复制,当从库的io线程将主库二进制日志写进自身的中继日志之后,读取中继日志并进行回放的线程只有一个sql_thread,所以读取的事件被串行执行。如果主库执行一个大事务延迟一个小时,那么从库收到这个事务时就已经落后主库1个小时了,单线程复制效率极端低下。

2.基于databases的多线程复制:

mysql从5.6开始支持多线程复制,5.6最初开始是基于库级别的多线程复制

mysql5.6对主库改进group commit组提交,去掉prepare_commit_mutex锁来实现Binlog中事务的记录顺序事务的提交顺序是一致的,每次只能fsync一个事务的Binlog,group commit分3个阶段(在mysql数据库上层提交事务时,按照顺序将事务放入到队列)

flush阶段:将每个事务的二进制日志放入内存

sync阶段:将二进制日志刷新到磁盘,如果队列中有多个事务那么仅一次fsync操作就可以完成多个二进制日志的落盘(合并io操作提升性能)

commit阶段:根据顺序调用存储引擎层事务的提交,innodb存储引擎本身就支持group commit 这样就是实现了数据库中事务的并行提交。

对于从库而言主要改进了,从库的复制线程又增加了一个sql协调器线程,真正干活的sql线程被称为工作线程work线程。当主库有多个databases时,从库就可以根据多个databases之间相互独立没有冲突来实现多线程复制。基于databases多线程复制,允许并行回放的粒度为数据库级别,只有在同一时间修改的数据为不同databases才允许并回放,在现实的业务场景中不常用

3.logical_clock多线程复制:

mysql从5.7开始支持基于逻辑时钟的并行复制,对于logical_clock多线程复制,允许并行回放的粒度为事务级别的,理论只要事务之间不冲突都可以并行回放

二进制日志中新增了last_committed和sequence_number。last_committed表示事务在每个二进制日志文件中的binlog group编号,sequence_number为每个二进制日志文件中的事务编号。last_committed会有重复值,值相同表示事务在同一个binlog group中表示这些事务并行提交时没有冲突,随意在回放时具有相同的last_committed事务是可以并行回放的。

last_committed值是主库事务在进入prepare阶段时获取已经提交事务的最大的sequence_number

开启需要配置如下参数:

主库:

slave_parallel_type =logical_clock

从库:

slave_parallel_workers =N

slave-preserve-commit-order = ON

slave_parallel_type =logical_clock

4.writeset多线程复制:

writeset多线程复制从mysql5.7.22版本及以后的支持的,对logical_clock多线程复制的优化,通过计算每行记录的哈希值来确定是否是相同记录判断是否冲突。

writeset = hash(index_name,db_name,db_name_length,table_name,table_name_length,value,value_length)

writeset多线程复制对二进制日志的last_committed值得计算上做了优化,优化了主库在不同时间点提交不存在冲突事务生成相同的last_committed的值

开启writeset多线程复制

# maste

slave_parallel_type =logical_clock

loose-binlog_transaction_dependency_tracking = WRITESET / WRITESET_SESSION(会话内的事务不可以并行)

loose-transaction_write_set_extraction = XXHASH64

binlog_transaction_dependency_history_size = 25000 #默认

#slave

slave-parallel-type = LOGICAL_CLOCK

slave-parallel-workers = 32

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档