Mysql 的主从复制、基于gtid的主从复制和半同步复制

主机环境:rhel7.3 selinux and firewalld disabled

主机名 ip 服务
server3 172.25.254.3 mysql
server4 172.25.254.4 mysql

server3:主库
server4:从库

配置要求:

mysql5.7版本

主从复制的原理:

在这里插入图片描述

从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

mysql的主从配置又叫replication,AB复制,基于binlog二进制日志,主数据库必须开启binlog二进制日志才能进行复制。

(1)主数据库将更改操作记录到binlog二进制日志(主数据库有log dump线程和从数据库的i/o线程传递binlog)。
(2)从库生成两个线程,一个i/o线程,一个SQL线程
(3)i/o线程去请求主库的binlog,并且得到的binlog日志写到relay log(中继日志)文件中
(4)然后主库会生成一个log dump线程,用来给从库的i/o线程传binlog;SQL线程,会读取中继日志文件,并解析成具体的操作执行,这样主从的操作就一致了,而最终的数据也就一致了。
  作为异步复制,其主库将事件写入binlog二进制文件,dump线程将binlog文件发送出去,不保证其他从节点是否会收到binlog二进制文件。

搭建步骤:

1.获得资源,解压(安装rpm包,不用编译)基础设置

[root@server3 mysql]# ls
master_ip_failover       mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar      sysbench
master_ip_online_change  mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
MHA-7                    send_report
[root@server3 mysql]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server3 mysql]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-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
[root@server3 mysql]# vim /etc/my.cnf
 29 log-bin=mysql-bin	#主库开启binlog日志
 30 server-id=1			#主从库id不同

2.启动mysql,作简单配置

[root@server3 mysql]# systemctl start mysqld
[root@server3 mysql]# cat /var/log/mysqld.log | grep password	#会发现生成初始密码
[root@server3 mysql]# mysql_secure_installation		#改密码,设定安全性
[root@server3 mysql]# mysql -uroot -pWestos+001		#登陆数据库

server4进行操作和第一步第二步相同(my.cnf不同)
在这里插入图片描述

3.在server3(主)上进行授权

mysql> grant replication slave on *.* to repl@'172.25.254.%' identified by 'Westos+001';	#授权
mysql> SHOW PLUGINS;		#查看插件
mysql> SHOW MASTER STATUS;	#查看从需要的信息

replication    表示授权复制的权限  
*.*         表示所有数据库可以进行同步 
repl         表示授权名,可以随意填写 
'172.25.254.%'   表示授权172.25.254.0/24的网段所有服务器可以同步, %表示任意
在这里插入图片描述

4.在server4(从)上进行授权

mysql> change master to master_host='172.25.254.3',master_user='repl',master_password='Westos+001',master_log_file='mysql-bin.000002',master_log_pos=692;	#授权
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes	#表示成功

在这里插入图片描述

测试:

在server3上创建表

mysql> CREATE DATABASE westos;
mysql> USE westos;
Database changed
mysql> CREATE table usertb (
    -> username varchar(10) not null,
    -> password varchar(15) not null);
mysql> DESC usertb;	#查看表信息
mysql> insert into usertb values ('user1','123');
mysql> select * from usertb;

在这里插入图片描述
在这里插入图片描述

在server4查看是否可以同步信息:

mysql> SHOW DATABASES;
mysql> use westos;
mysql> select * from usertb;

在这里插入图片描述

二、mysql的jtid下的主从复制

1.基本概念

GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。

原理:
从服务器连接到主服务器之后,把自己执行过的GTID(Executed_Gtid_Set)<SQL线程> 、获取到的GTID(Retrieved_Gtid_Set)<IO线程>发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去补全即可。当主服务器挂掉的时候,找出同步最成功的那台从服务器,直接把它提升为主即可。如果硬要指定某一台不是最新的从服务器提升为主, 先change到同步最成功的那台从服务器, 等把GTID全部补全了,就可以把它提升为主了。

搭建步骤:

1.先将mysql关闭,修改配置文件

[root@server3 mysql]# systemctl stop mysqld
[root@server3 mysql]# vim /etc/my.cnf
 29 log-bin=mysql-bin
 30 server-id=1
 31 gtid_mode=ON
 32 enforce-gtid-consistency=true
[root@server3 mysql]# systemctl start mysqld 
[root@server4 mysql]# systemctl stop mysqld
[root@server4 mysql]# vim /etc/my.cnf
 29 server-id=2
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
[root@server4 mysql]# systemctl start mysqld

2.在主库端进入mysql,进行授权(之前做过)

3.在从库端进入mysql,关闭slave,进行gtid授权

[root@server4 mysql]# mysql -uroot -pWestos+001
mysql> stop slave;
mysql> CHANGE MASTER TO
    -> MASTER_HOST = '172.25.254.3',	#主库ip
    -> MASTER_USER = 'repl',			#使用的用户(主库那边授权的用户身份)
    -> MASTER_PASSWORD = 'Westos+001',	#密码
    -> MASTER_AUTO_POSITION = 1;		#自动开启gtid的复制方式
mysql> start slave;
mysql> show slave status\G				#IOSQL打开即授权成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

测试:

在主库写入信息:

mysql> create database westos;
mysql> use westos
mysql> create table usertb (
    -> username varchar(10) not null,
    -> password varchar(15) not null);
mysql> desc usertb;	#查看表的结构
mysql> insert into usertb values ('user1','123');

在这里插入图片描述
在从库查看:

mysql> use westos
mysql> select * from usertb;

在这里插入图片描述

从库此时可以使用以下命令查看复制的信息是基于gtid的同步方式
mysql> show slave status\G

在这里插入图片描述

或者:
mysql> use mysql
mysql> select * from gtid_executed;

在这里插入图片描述

三、半同步复制

1.在主库安装插件,激活插件

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';	#查看安装的插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;	#激活插件

在这里插入图片描述

2.在从库安装插件,并激活

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

在这里插入图片描述

3.重启从库的IO线程

mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

在这里插入图片描述

4.在主库查看状态信息

mysql> show status like '%rpl%';	#可以看到半同步打开

在这里插入图片描述

mysql> show variables like '%rpl%';

在这里插入图片描述

5.在从库查看信息

mysql> show variables like '%rpl%';		#此时是半同步

在这里插入图片描述

测试:

测试1:将从库的IO线程关闭,在主库添加信息

从库:

mysql> STOP SLAVE IO_THREAD;				#此时主库收不到从库发送的ack,模仿网络卡顿

主库:

mysql> use westos;
Database changed
mysql> insert into usertb values ('user2','456');	#插入信息的时候会等待接收从的ack10秒,如果没接收到就不等待,此时从库会缺少添加的数据

在这里插入图片描述

从库查看:(信息同步不到)
在这里插入图片描述

在主库查看状态

mysql> show status like '%rpl%';			#此时已经变成异步,半同步关闭

在这里插入图片描述

mysql> insert into usertb values ('user3','456');

从库:

mysql> show status like '%rpl%';			#半同步关闭,异步开启
mysql> START SLAVE IO_THREAD;				#将IO打开,模拟网络通畅
mysql> select * from usertb;				#此时可以查看到数据同步

在这里插入图片描述
在这里插入图片描述

注意:此时默认的状态是半同步,会自动开启(半同步是mysql的5.5后提出的)

猜你喜欢

转载自blog.csdn.net/weixin_44209804/article/details/89496648
今日推荐