您的位置:首页 > 数据库 > MySQL

mysql复制原理/基于库的多线程复制原理/基于BLGC的多线程复制原理

2016-06-13 15:39 302 查看
mysql复制原理/基于库的多线程复制原理/基于BLGC的多线程复制原理

单线程主从复制:
从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql,
主要由以下三个线程完成.
dump thread: 在主库上,发送binlog
io thread: 在slave上,接收,转存,请求binlog
sql thread :在slave 上,重做binlog

基于库的多线程复制原理:

从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql,
主要由以下三个线程完成.
dump thread: 在主库上,发送binlog
io thread: 在slave上,接收,转存,请求binlog
sql thread :在slave 上,读取binlog,并分配binlog给work thread (分配原则,判断并行执行的事务是否拥有相同的数据库)
work thread:执行binlog ,可以有多个

多线程复制

mysql5.7 基于BLGC的多线程复制原理,同时处于prepare阶段的事务不会有冲突。
在mysql5.7 的binlog中新增了两个字段来来标注哪些事务可以并行执行,和binlog的写入顺序
last_committed:事务提交编号,同一组内的事务,编号相同,可以并行执行。
sequence_number:binglog写入顺序,用户确保master的binlog顺序和slave的binlog顺序的一致。

多线程复制中的一些问题
1.binlog以组为顺序并发重做,如果上一组binlog中有某个sql执行失败,整组sql是否回滚,slave复制是否暂停?
如果一组中的某个sql执行失败,整组sql都会回滚,
这个时候整个slave是否会暂停,有待验证

2.并行复制中如何保证master上的binlog和slave上binglog的顺序一致
在mysql5.7中为了实现并行复制,特地在binlog日志中增加了两个字段,last_committd,sequence_number,
在slave上按组并行重放的时需要等待组中所有sql执行完成,然后在flush阶段按照sequence_number排序,并行提交,
这样就保证了,master上binlog的的写入顺序就和slave上的binlog的写入顺序相同了。

参考资料
http://www.tuicool.com/articles/EvQjEr
mysql5.7并行复制相关简介:
http://blog.itpub.net/28218939/viewspace-1975822/
http://blog.itpub.net/28218939/viewspace-1975856/
http://www.ttlsa.com/mysql/mysql-5-7-enhanced-multi-thread-salve/
http://dev.mysql.com/doc/refman/5.6/en/replication-implementation-details.html

本文出自 “SQLServer MySQL” 博客,请务必保留此出处http://dwchaoyue.blog.51cto.com/2826417/1788704
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: