此篇博客的是在上一篇博客(mysql主从复制)的基础上写的
https://blog.csdn.net/weixin_40543283/article/details/87911286
此篇博客写的是基于gtid的半同步mysql主从复制
一、gtid的半同步mysql主从复制的原理介绍
1.什么是gtid?
GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由 UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
2.gtid有什么优点?
在原来基于二进制日志的复制中,从库需要告知主库要从哪个偏移量进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
如下图,可以查看到gtid的id号码
2.什么是异步复制和半同步复制
简单来说,异步复制就是直接把master的bin-log扔给slave,而不管slave有没有备份好relay-bin-log,而半同步则是在把master的bin-log扔给slave以后,需要slave返回一个ack值,才会进行提交刷盘
所以,异步复制和半同步复制的主要区别还是事务在主库写完binlog后需要从库返回一个已接受(ACK),才放回给客户端;
2.部署
环境:
- 虚拟机server1:master数据库
- 虚拟机server2:slave数据库
-
软件:mysql-5.7.24-1.el7.x86_64 ==> 点击下载
1.sever1:master节点
将软件使用scp传到server1和server2
安装mysql软件
yum install mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm -y
然后修改数据库设置文件
vim /etc/my.cnf ##添加下面的语句
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=true
然后开启数据库软件
systemctl start mysqld
cat /var/log/mysqld.log | grep password ##查看数据库的初始密码
mysql_secure_installation ##安全初始化,密码要复杂些,我设置的密码是Mysql1994.
进入数据库设置为master节点
mysql -pMysql1994.
mysql> grant replication slave on *.* to repl@'172.25.1.%' identified by 'Mysql1994.';
mysql> Flush privileges;
mysql> show master status;
如上,master节点就设置好了
接下来,进行半同步设置
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ##安装半同步master插件
mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; ##查看插件状态
mysql> SET GLOBAL rpl_semi_sync_master_enabled=ON; ##实现热同步
这就设置好了基于gtid的半同步复制的master
/var/lib/mysql/auto.cnf这个文件可以查看uuid
2.sever2:slave节点
安装mysql软件
yum install mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm -y
然后修改数据库设置文件
vim /etc/my.cnf ##添加下面的语句
server-id=2
gtid_mode=ON
enforce-gtid-consistency=true
然后开启数据库软件
systemctl start mysqld
cat /var/log/mysqld.log | grep password ##查看数据库的初始密码
mysql_secure_installation ##安全初始化,密码要复杂些,我设置的密码是Mysql1994.
先测试以下远程用户是否可以登陆
进入数据库设置为slave节点
mysql -pMysql1994.
mysql> change master to master_host='172.25.1.5',
master_user='repl',
master_password='Mysql1994.',
master_log_file='mysql-bin.000002',
master_log_pos=1398;
mysql> start slave;
mysql> show slave status\G
出现图片最下方的两个yes,这样就设置成功了,接下来设置半同步
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##安装slave插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; ##实现热同步
这就设置好了基于gtid的半同步复制的slave
var/lib/master.info是记录一些你的主数据库的信息,
3.测试:
思路:在server1上新建表格,然后故意停止掉slave,会发现slave等待十秒,然后会转为异步复制,当slave开启的时候,又会自动转为半同步
1)server1:
mysql> SHOW STATUS LIKE '%RPL%'; ##查看主数据库状态
mysql> SHOW VARIABLES LIKE '%RPL%'; ##查看设置信息
新建一个表
mysql> CREATE TABLE xupt(
-> username varchar(10) not null,
-> password varchar(50) not null
-> );
mysql> use nelws
mysql> insert into xupt values ('user5','123');
mysql> select * from xupt
一开始不要停止slave,在server1插入信息
在server2查看
第二次在往表格里插入数据未提交的时候,在server2上停止slave
mysql> use nelws
mysql> insert into xupt values ('user6','123');
mysql> select * from xupt
如上图,等了十秒,切换为了异步,当server2打开slave的时候,就会切换回来,看时间便知~
ok~