频道栏目
首页 > 资讯 > MySQL > 正文

mysql数据库的主从复制原理介绍

18-07-25        来源:[db:作者]  
收藏   我要投稿

数据库主从复制

MySQL传统复制:

基于MySQL二进制文件(mysql-bin.000001),加上对应日志文件中每个事件的偏移量位置点(postion)。

三个线程:主库BinlogDump,从库IO和SQL线程

过程:1、Master所有数据库变更写进Binary log

2、主库dump线程把Binary log内容发送到从库slave上(slave被动接受数据,不是主动去获取)。

3、从库Slave IO线程读取Master上Binary log日志信息,把接受到的Binary log日志写到本地中继日志 Relay log

4、Slave SQL线程读取Ralay log日志内容写入本地数据库实例

GTID复制的原理:

一、GTID的概述:

1、全局事物标识:global transaction identifieds。

2、GTID事物是全局唯一性的,且一个事务对应一个GTID。

3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。

5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制);但是从5.7.5版本开始无需在GTID模式下启用参数log_slave_updates

二、GTID的组成部分:

GTID = source_id:transaction_id

source_id正常即是server_uuid,在第一次启动时生成(函数generate_server_uuid)

transaction_id是顺序化的序列号(sequence number),在每台MySQL服务器上都是从1开始自增长的序列,是事务的唯一标识。例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

三、GTID的工作原理:

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。

2、主库dump线程把Bin log内容发送到从库slave上

3、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。

4、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。如果有记录,说明该GTID的事务已经执行,slave 会忽略。如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

5、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

四、GTID的限制

1、在一个事务里面混合使用引擎如Innodb(支持事务)、MyISAM(不支持事务), 造成多个GTIDs和同一个事务相关联出错(不能混合使用mysql引擎)

2、CREATE TABLE…..SELECT 不能使用,该语句产生的两个event在某一情况会使用同一个GTID(同一个GTID在slave只能被使用一次)

1th event:创建表语句create table

2th event:插入数据语句insert

3、CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 不能在事务内使用 (启用了--enforce-gtid-consistency参数)。

问题:主机和从机事务更新的不同步,就算是没有网络或者其他系统的异常,当业务并发上来时,slave因为要顺序执行master批量事务,导致很大的延迟。所以引入半同步复制

半同步复制:

semi-sync replication,半同步

解决复制延迟问题,延迟会导致数据不同步

AFTER_COMMIT(5.6默认值)master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。

AFTER_SYNC(5.7默认值,但5.6中无此模式)master 将每个事务写入binlog , 传递到slave 刷新到磁盘(relay log)。master等待slave 反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。 即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。

因此5.7引入了after_sync模式,带来的主要收益是解决after_commit导致的master crash主从间数据不一致问题,因此在引入after_sync模式后,所有提交的数据已经都被复制,故障切换时数据一致性将得到提升。

mysql 全同步组复制(MGR)

去中心化分布式全同步(官方文档)

mysql group replication

相关TAG标签
上一篇:python中用drop函数删除某列或者某行的操作教程
下一篇:数据库相关的DDL语句使用记录
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站