引言

为什么需要主从复制

  • 在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
  • 做数据的热备
  • 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

什么是主从复制

​ MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

主从复制原理

  • 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
  • 备库I/O线程将主库上的日志复制到自己的中继日志(Re'lay Log)中。
  • 备库SQL线程读取中继日志的事件,将其重放到备库的数据库上。

主从复制方式,M是master主库,S是slave从库

  • M-S
  • M-M
  • M-S-S
  • M-M-S-S

接下来文章中主要介绍的是M-S(GTID),除了M-M-S-S和其他复制方式的时候有点区别,其他的的复制方式大同小异

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

环境配置

  • 准备好2台在Centos7中安装了MySQL 5.7.43的操作系统
  • 2台操作系统提前关闭防火墙和SElinux
  • 提前配置好/etc/hosts文件
  • 修改Centos7的主机名

参考文章

主库(master1)配置

设置主库主配置文件

vim /etc/my.cnf
在文件的末尾加入下面设置
log-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1

重启MySQL

systemctl restart mysqld
重启失败的话就是上面配置文件的修改出错了,好好检查

登录MySQL

mysql -uroot -p'密码'

创建用户和授权并刷新

create user 'rep'@'192.168.159.%' identified by '20011004+LmL';
grant replication slave on *.* to ‘rep’@'192.168.159.%' identified by '20011004+LmL';
flush privileges;

从库(slave2)配置

测试master1是否可以连接

mysql -hmaster1 -urep -p'20011004+LmL'

连接失败的话可能是防火墙和selinux没有关闭,关闭后重新连接

设置从库主配置文件

vim /etc/my.cnf
将下面设置添加到文件末尾
log-bin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1

重启MySQL

systemctl restart mysqld

重启MySQL后登录

systemctl restart mysqld
mysql -uroot -p'20011004**LmL'

删除从库日志

reset slave all;

配置连接主库

 change master to 
 master_host='master1', 
 master_user='rep',
 master_password='20011004+LmL',
 master_auto_position=1;

启动slave和查看slave

start slave;
show slave status\G

验证主从复制

总结

  • 主库和从库的主配置文件中2个server-id=“不同的数字“
  • 做主从架构的时候若是使用克隆虚拟机需要在/var/lib/mysql/auto.cnf下面修改uuid,在MySQL中查看uuid show variables like '%server_uuid%';
  • MySQL数据库的版本不同也会有问题,MySQL 8 的版本安全性相对较高,在做主从复制的时候要去修改一个表的数据,这里就不作过多介绍了
  • Centos7的防火墙和SELinux一定要关闭