Mysql主从复制之GTID新特性

 

n  1 GTID复制原理

GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系的mysql服务器上也是唯一的。正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。

n  1.1当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。

n  1.2 当binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。

n  1.3 sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。

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

n  1.5 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。

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

 

n  2 GTID复制实现过程

n  2.1 试验环境

[root@mysqlserver ~]# cat/etc/redhat-release

CentOS release 6.6 (Final)

 

Master : 192.168.200.134

Slave1 : 192.168.200.136

Slave2 : 192.168.200.137

 

n  2.2 安装mysql

下载好Mysql源:mysql57-community-release-el6-8.noarch.rpm

 

Yum安装mysql源

 

[root@mysqlserver software]# yumlocalinstall mysql57-community-release-el6-8.noarch.rpm –y

 

Yum安装mysql

 

[root@mysqlserver software]# yuminstall mysql-community-server –y

 

这里安装的是最新版的mysql-5.7

到这里已经安装好了,启动mysql的方式和以前一样

在启动mysql之前我们先将selinux关掉

 

[root@mysqlserver ~]# vim/etc/selinux/config

SELINUX=disabled

[root@mysqlserver ~]# setenforce 0

 

在防火墙上开启3306端口

 

[root@mysqlserver ~]# iptables -AINPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

 

然后开始启动mysql

 

[root@mysqlserver software]#service mysqld start

 

Mysql的5.7版本对进入数据库的root密码要求很高,要求要改两次密码

首先确保数据库的状态是关闭的

[root@mysqlserver software]#service mysqld stop

先跳过授权表直接进入数据库

[root@mysqlserver ~]# mysqld_safe--user=mysql --skip-grant-tables &

[root@mysqlserver ~]# mysql –uroot –p

直接回车进去

 

mysql>update mysql.user setauthentication_string=password(‘abc123ABC’) where user='root';

mysql>flush privileges;

mysql>quit

 

[root@mysqlserver ~]# mysql –uroot –pabc123ABC

mysql> set globalvalidate_password_policy=0;

mysql> alter mysql.userroot@localhost identified by 'abc123ABC';

 

n  2.3 GTID实现过程

n  2.3.1 主从库开启gtid

[root@mysqlserver ~]# vim/etc/my.cnf

需要添加如下三条记录

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

n  2.3.2 主从库均开启bin log

log-bin=/var/lib/mysql/mysql-bin

binlog_format = row

n  2.3.4主库授权用户

mysql>grant replication slave on*.* to yang@’192.168.200.%’ identified by ‘abc123ABC’;

mysql>flush privileges;

n  2.3.5从库change master连主库

[root@mysqlslave1 ~]# mysql -uroot-pabc123ABC

mysql> change master tomaster_host='192.168.200.134',master_user='yang',master_password='abc123ABC',master_auto_position=1;

 

n  2.3.6 打开从库连接主库的开关

mysql> start slave;

 

n  3 实验测试

从库1:

mysql GTID主从复制_mysql

 

从库2:

mysql GTID主从复制_主从复制_02

 

主从同步:

   主库:

mysql GTID主从复制_主从复制_03

 

从库1:

mysql GTID主从复制_mysql_04

 

从库2:

mysql GTID主从复制_mysql_05

 

n  4 压力测试

 

每次100个并发连接数,执行5次

 

首先测试一主一从

主库:

mysql GTID主从复制_主从复制_06

 

然后测试一主二从

主库:

mysql GTID主从复制_主从复制_07

 

最后测试一主三从

主库:

mysql GTID主从复制_主从复制_08

 

通过测试可以看出来,GTID的主从复制在一主一从的时候主数据库的性能较好,一主二从的时候主数据库的性能也还好,但是一主三从的时候主库的性能就降低了不少,通过不断压力测试,最低的查询时间都比前两种要高,主服务器的性能降低了。

 

 

   经典的mysql主从复制,需要主服务器先备份出所有的数据,然后上传到从服务器,从服务器将主库备份的数据导入本地数据库,然后才开始主从复制。因为这种方式从库需要知道主库的bin log以及还原点。

   GTID这种主从复制,从库的数据库可以什么都没有,它会自动将主库中所有的数据同步到本地,最后从库和主库的数据一模一样。