MySQL主从复制原理详解

描述

什么是主从复制

简单讲,MySQL主从复制就是数据写入一台服务器(主服务器)后,同时还会额外写入另外的服务器(从服务器)。也就是说数据会写多份,这样做的目的主要有两个:

1)备份数据;

2)做负载均衡,对于写来说没有效果,但是对于读是可以做到负载均衡的。

主从复制原理

binlog

1)主上将所有变更事件记录到binlog里

2)从发起请求连接主

3)主的binlog备份线程将binlog传给从

4)从的I/O线程将binlog解析成自己的relay log

5)从的SQL线程根据relay log来执行具体的SQL语句

MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

概念解释

Binlog:binary log,主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。在主库中,只要有更新事件出现,就会被依次地写入到binlog中,之后会推送到从库中作为从库进行复制的数据源。

Binlog dump线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。对于每一个即将发送给从库的sql事件,binlog dump线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。

从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

基于GTID的主从复制

1)什么是GTID

GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识,保存在mysql数据目录下的auto.cnf文件里。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

2)GTID的作用

根据GTID可以知道事务最初是在哪个实例上提交的,GTID的存在方便了Replication的Failover(故障切换)

3)GTID比传统复制的优势

更简单的实现failover,不用以前那样在需要找log_file和log_Pos。更简单的搭建主从复制。比传统复制更加安全。GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

4)GTID的工作原理:

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

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

③ sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

④ 如果有记录,说明该GTID的事务已经执行,slave会忽略。

⑤ 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

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

审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分