加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

怎么理领会mysql GTID主从复制

发布时间:2021-12-20 18:35:08 所属栏目:MySql教程 来源:互联网
导读:本篇内容介绍了怎么理解mysql GTID主从复制的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、GTID的概述: 1、全局事物标识:global transaction
本篇内容介绍了“怎么理解mysql 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(强制)。
 
二、GTID的组成部分:
 
前面是server_uuid:后面是一个序列号
 
例如:server_uuid:sequence number
 
7800a22c-95ae-11e4-983d-080027de205a:10
 
UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
 
Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。
 
三、GTID比传统复制的优势:
 
1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
 
2、更简单的搭建主从复制。
 
3、比传统复制更加安全。
 
4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
 
四、GTID的工作原理:
 
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
 
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
 
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
 
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
 
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
 
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
 
要点:
 
1、slave在接受master的binlog时,会校验master的GTID是否已经执行过(一个服务器只能执行一次)。
 
2、为了保证主从数据的一致性,多线程只能同时执行一个GTID。
 
六、使用GTID搭建mysql的主从复制的主要参数:
 
[mysqld]
 
#GTID:
 
gtid_mode=on
 
enforce_gtid_consistency=on
 
server_id=2003306    #每天实例的server_id都要不一样
 
#binlog
 
log-bin=mysqlbin
 
log-slave-updates=1   #允许下端接入slave
 
binlog_format=row      #强烈建议,其他格式可能造成数据不一致
 
#relay log
 
skip_slave_start=1
 
注意:建议使用mysql-5.6.5以上的最新版本。
 
(二)、启动GTID的两种方法:
 
方法一、
 
1、如果是在已经跑的服务器,你需要重启一下mysql server。
 
2、启动之前,一定要先关闭master的写入,保证所有slave端都已经和master端数据保持同步。
 
3、所有slave需要加上skip_slave_start=1的配置参数,避免启动后还是使用老的复制协议。
 
方法二、
 
1、如果是新搭建的服务器,直接启动就行了。
 
七、master-slave搭建的注意事项:
 
(一)、使用GTID的方式,把salve端挂载master端:
 
1、启动以后最好不要立即执行事务,而是先change master上。
 
2、然后在执行事务,当然知不是必须的。
 
3、使用下面的sql切换slave到新的master。
 
stop slave;
 
change master to
 
master_host = 192.168.100.200,
 
master_port = 3306,
 
master_user = abobo,
 
master_password=123,
 
master_auto_position = 1;
 
(二)、如果给已经运行的GTID的master端添加一个新的slave
 
有两种方法:
 
方法一、适用于master也是新建不久的情况。
 
1、如果你的master所有的binlog还在。可以选择类似于上面的方法,安装slave,直接change master to到master端。
 
2、原理是直接获取master所有的GTID并执行。
 
3、优点:简单方便。
 
4、缺点:如果binlog太多,数据完全同步需要时间较长,并且master一开始就启用了GTUD。
 
方法二、适用于拥有较大数据的情况。(推荐)
 
1、通过master或者其他slave的备份搭建新的slave。(看第三部分)
 
2、原理:获取master的数据和这些数据对应的GTID范围,然后通过slave设置@@global.gtid_purged跳过备份包含的gtid。
 
3、优点:是可以避免第一种方法的不足。
 
4、缺点:相对来说有点复杂。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读