Mysql优化学习之MTS机制、GTID、二/三阶段提交、组提交汇总分析

时间:2021-09-02 01:51:27   收藏:0   阅读:4

MTS机制(针对的是relaylog与binlog的执行效率)

一、Mysql早在5.6.x版本之前在Server层存在两种线程I/O线程和SQL线程,其中I/O线程在主从数据库结构中负责读取主库的binlog中position位置之后的内容,写入从库的relaylog文件中,整个过程是顺序读取效率比较高。SQL线程将从库relaylog中读取SQL语句或行数据变化记录通过写回从库。

二、Mysql在5.6.x版本之后存在基于schema(库)级别的并行复制,此时SQL线程由coordinator和worker线程两部分组成,其中coordinator线程(协调器)判决redolog中的操作若为同一事务中的顺序操作要放入同一worker线程中处理(线程调度和抢占是由cpu决定的,带有随机性),同一行数据的不同事务操作也要放入同一worker线程中处理。若为事务跨库操作,则等所有worker线程执行完毕之后执行。

三、Mysql在5.7.x并行复制不在基于库,对二进制日志格式也不做限制且引入了事务分组提交也就是所谓的组提交,对于一组组提交可以进行并行回放(把relaylog中涉及修改行数据sql语句执行)。slave-parallel-type可选参数为DATABASE(默认值,基于库的并行复制方式)、LOGICAL_CLOCK(基于组提交的并行复制方式)。

组提交(针对的是事务提交的阶段,影响TPS指标)、三阶段提交

组提交使用的前提是双1设置也就是sync_binlog = 1 和 innodb_flush_log_at_trx_commit = 1

sync_binlog

sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。

sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

innodb_flush_log_at_trx_commit

Mysql普遍使用WAL机制(write ahead log),那么具体的应用就是redolog,可以在宕机的情况下保持一致性与原子性,在mysql中可以通过修改配置参数innodb_log_files_in_group和innodb_log_file_size配置日志文件数量和每个日志文件大小,redolog采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。(在磁盘中ib_logfile_x为redolog),其中write pos表示当前日志记录的位置,check point表示将commit后的相关记录擦除掉,临时文件也会被删除。在此阶段会将redolog中的信息写入binlog。

如果仅一次执行一个事务对于磁盘IO性能会有影响,组提交发生在写入redolog之后的prepare阶段,在commit之前会有三个队列,分别代表flush,sync,commit三个阶段。队首的事务会得到prepare_commit_mutex锁,那么排在后面的事务相应的也同样如此,因为一次只有队首事务获得锁,从而避免了锁争,死锁等情况。

flush阶段:

sync阶段:

commit阶段:

ps:二阶段提交是redolog到binlog分别提交的过程,三阶段提交为组提交的过程

GTID全局事务ID(单库也能使用并行复制)

gtid_mode = on

enforce_gtid_consistency = on

即可开启GTID模式,好处之一是不用在找binlog pos位置的而是通过CHANGE MASTER TO MASTER_HOST=‘xxx‘, MASTER_AUTO_POSITION=1,取代了之前的master_file,master_positon。在故障修复中也可以采用MASTER_AUTO_POSITION=‘X’的方式。在每次提交事务之前都会生成全局唯一的事务ID,每个binlog记录的生成会有一个递增的sequence_number标记事务,还有lastcommited标记上次的提交,那么一个组里的lastcommited的值必定相同,可以进行并行回放执行。最后有xid是标记xa事务即分布式事务。使用GTID复制模式时,不支持create temporary table 和 drop temporary table。但是在autocommit=1(开启自动事务,但仍需手动提交)的情况下可以创建临时表,Master端创建临时表不产生GTID信息,所以不会同步到slave,但是在删除临时表的时候会产生GTID会导致主从中断。

ps:

redolog需要与binlog配合使用才能达到ACID的效果。

max_binlog_size控制每个binlog文件的大小

binlog_format有三种格式

ps:binlog_max_flush_queue_time 在MySQL的5.7.9及之后版本不再生效,原为用于从flush队列中取事务的超时时间,这主要是防止并发事务过高,导致某些事务的响应时间上升。

(未完待更新)

原文:https://www.cnblogs.com/Qyehui/p/15212498.html

评论(0)
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!