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 删除。