主机名 | ip | 服务 |
---|---|---|
server3 | 172.25.254.3 | mysql |
server4 | 172.25.254.4 | mysql |
server3:主库
server4:从库
从库生成两个线程,一个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;
GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。
原理:
从服务器连接到主服务器之后,把自己执行过的GTID(Executed_Gtid_Set)
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 #IO和SQL打开即授权成功
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后提出的)