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:
从库2:
主从同步:
主库:
从库1:
从库2:
n 4 压力测试
每次100个并发连接数,执行5次
首先测试一主一从
主库:
然后测试一主二从
主库:
最后测试一主三从
主库:
通过测试可以看出来,GTID的主从复制在一主一从的时候主数据库的性能较好,一主二从的时候主数据库的性能也还好,但是一主三从的时候主库的性能就降低了不少,通过不断压力测试,最低的查询时间都比前两种要高,主服务器的性能降低了。
经典的mysql主从复制,需要主服务器先备份出所有的数据,然后上传到从服务器,从服务器将主库备份的数据导入本地数据库,然后才开始主从复制。因为这种方式从库需要知道主库的bin log以及还原点。
GTID这种主从复制,从库的数据库可以什么都没有,它会自动将主库中所有的数据同步到本地,最后从库和主库的数据一模一样。