[关闭]
@gy-ban 2017-07-16T08:42:29.000000Z 字数 2316 阅读 706

mysql 主从复制之--GTID

mysql


前言

最近公司开始使用阿里云RDS,由于默认不提供查询slave,所以想在ECS上自建一个slave,下面我们就来讲解如何在ECS上建立RDS的slave。
首先我们来看一下RDS自身的主从结构

应用连接RDS,流量通过SLB指向主从节点的master,所以如果我们连接RDS的账户具有REPLICATION SLAVE, REPLICATION CLIENT的权限,则就可以把主库master的产生的binlog同步到本地数据库中去,实现数据同步。
但是这种根据binlog文件和位点来同步RDS的数据到本地的方式非常容易导致同步中断,因为当RDS发生了主备切换(主备切换,重启,跨机迁移),本地数据库所指向RDS的binlog 位点则会发生变化(RDS主库与备库的binlog位点是不一致的),这样就会导致本地数据库与RDS的数据复制同步中断。

在RDS 5.6的版本中主备同步使用新复制方式GTID,RDS的主备具有相同的GTID,那么如果主备发生切换,重启或者迁移,主备的GTID是不会发生变化,那么ECS和RDS的同步链路则不会发生中断,所以如果要将RDS的数据同步到本地,则需要将RDS升级到5.6的版本。

什么是GTID

MySQL 5.6的新特性之一,加入了全局事务ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力。用于取代过去通过binlog文件偏移量定位复制位置的传统方式。借助GTID,在发生主备切换的情况下,MySQL的其它Slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
那么什么是GTID,mysql的GTID复制又是一种怎样的方式?
GTID = server_uuid:transaction_id
其中server_uuid由MySQL在第一次启动时自动生成并被持久化到auto.cnf文件里,TID(transaction_id)是一个从1开始的自增计数,表示在这个主库上执行的第n个事务。一个数值对应一个事务。MySQL会保证事务与GTID之间的1 : 1映射。这里需要注意的是,如果不小心把auto.cnf文件清空了,重启mysql会重新生成uuid
例如:
e6954592-8dba-11e6-af0e-fa163e1cf111:1
其中“e6954592-8dba-11e6-af0e-fa163e1cf111” 就是server_uuid,后面的1为transaction_id

GTID优点

在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后change master to指向新的master,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道master的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。

GTID原理

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,
在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
这里我们需要注意到的是:
在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。

GTID配置

编译my.cnf,增加如下参数
server_id #服务器ID,必须唯一
gtid_mode=on #开启gtid模式
enforce_gtid_consistency=true #启动强制GTID的一致性,如果开启GTID功能则此参数必须要开启(Maradb中此参数无效了)。slave在做同步复制时,无须找到binlog日志和POS点,直接change master to master_auto_position=1即可,自动根据GTID进行同步数据。
binlog_format=row #启用基于行的二进制日志的记录,对于复制更容易校验,不容易出错。
log-slave-updates=true #从服务器是否将从主服务器收到的更新操作记录进本机的二进制日志中
log-bin = mysql-bin #必须开启

上面6个参数不管是master还是slave都需要开启,新的slave建立master连接的语句也有所变化

  1. CHANGE MASTER TO MASTER_HOST='x.x.x.x',MASTER_PORT=3306,MASTER_USER='repl', MASTER_PASSWORD='xxxxxx', MASTER_AUTO_POSITION=1;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注