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

时间: 2024-10-10 15:18:24

mysql复制原理/基于库的多线程复制原理/基于BLGC的多线程复制原理的相关文章

mysql 5.7主从库复制设置

1.创建复制用户 CREATE USER 'rep_user'@'%.192.168.0.106' IDENTIFIED BY '123456'; 2.权限授予 GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%.192.168.0.106'; 3.备份主库 C:\Users\Administrator>mysqldump -uroot --password --databases test01 >e:/temp/2 0170507/aa.sql E

004.MySQL主库手动复制至从库

一 主库手动复制至从库 1.1 Master主库锁表 1 mysql> flush tables with read lock; 2 Query OK, 0 rows affected (0.00 sec) 1.2 主库备份 1 [[email protected] ~]# mysqldump -uroot -p -B mydb > master.sql 说明:-B参数有建库语句. 1.3 从库导入数据库 1 [[email protected] ~]# mysql -uroot -padmi

Oracle 11 g duplicate功能_复制dataguard备库

Qracle 11g duplicate功能 不用备份源库,通过网络复制出standby库 1.在standby上grid用户配置listener 注意是指定oracle用户的家目录: 监听状态: [[email protected] ~]$lsnrctl LSNRCTL for Linux:Version 11.2.0.4.0 - Production on 19-MAY-2014 18:46:15 Copyright (c)1991, 2013, Oracle.  All rights re

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇幅讲 一.文本复制 读写都说了,我们来看下其他的操作,我们首先来看复制 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中 实现的步骤: 1.在D盘创建一个文件,用于存储文件中的数据 2.定义读取流和文件关联 3.通过不断的读写完成数据的存储 关闭资源 package com.lgl.hel

配置ECS上自建MySQL作为RDS从库过程中踩到的坑

环境: RDS版本:阿里云的5.6 ECS自建MySQL5.6.34(官方版本) 通过将阿里云rds的自动全量备份下载到ECS上,按照官方的步骤解压--> aploy-log ---> mv 到mysql的datadir 并启动mysql. 然后执行 reset slave all; reset master; change master to master_host='rm-xxxxxxxxx.mysql.rds.aliyuncs.com', master_user='rpl', maste

MySQL · 答疑解惑 · 备库Seconds_Behind_Master计算

背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库有更新时,备库都存在延迟,且延迟时间为备库执行时间+网络传输时间即t4-t2. 那么mysql是怎么来计算备库延迟的? 先来看show slave status中的一些信息,io线程拉取主库binlog的位置: Master_Log_File: mysql-bin.000001 Read_Maste

mysql基础之对库表操作

原文:mysql基础之对库表操作 查看一下所有的库,怎么办? Mysql>Show databases; 选库语句: Use 库名 创建一个数据库: create database 数据库名 [charset 字符集] 删除一个数据库: drop database 数据库名; 把数据库改改名? Mysql中,表/列可以改名,database不能改名. phpMyAdmin似乎有这功能? 他是建新库,把所有表复制到新库,再删旧库完成的. 当选了库之后,我们面对的是表 查看库下面的所有表: show

搭建mysql主从复制和删库数据恢复策略

搭建主从复制 主机: [mysqld] 下增加 vim /etc/my.cnf ## 设置 server_id,一般设置为 IP server_id=8 # # 复制过滤:需要备份的数据库,输出 binlog binlog-do-db=testdb #复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步) binlog-ignore-db=mysql # 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用 log-bin=master-log-1 binl

第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解.今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习.今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?典型回答所谓隔离级别(Isolation Level),就是在数据库事务中,