一、引语
mysql主从复制是一种常用的数据库复制技术,可以实现数据的高可用性和负载均衡。通过主从复制,我们可以将数据从一个mysql主服务器复制到一个或多个从服务器,从而实现数据的冗余备份和读写分离。本文将介绍mysql主从复制的原理、配置步骤以及常见问题的解决方法。
二、主从复制的原理
- 主服务器(master)负责接收和处理所有的写操作,并将写操作记录到二进制日志(binary log)中。
- 从服务器(slave)连接到主服务器,并通过读取主服务器的二进制日志来复制主服务器上的数据变更操作。
- 从服务器将接收到的数据变更操作应用到自己的数据库中,从而保持与主服务器数据的一致性。
三、主从复制的基本步骤
传统主从复制的基本过程如下:
1)、mysql slave端的io进程连接上master,向master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、master接收到来自slave的io进程的请求后,负责复制的io进程根据slave的请求信息,读取相应日志内容,返回给slave 的io进程。并将本次请求读取的bin-log文件名及位置一起返回给slave端。
3)、slave的io进程接收到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的最末端,并将读取到的master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉master"我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我";
4)、slave的sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在master端真实执行时候的那些可执行的内容,并在自身执行。
简单来说就是:
主:i/o进程
从:i/o进程 从服务器通过i/o进程跟主服务器的i/o进程通信将主服务器的binlog日志同步过来,并且根据binlog日志的内容通过sql进程往从库写数据
四、实验过程
1、准备环境
准备两台干净的虚拟机(centos 7),不建议使用克隆,并且要在同一网段。每台虚拟机都要安装mysql 5.7版本的数据库。
再实验之前关闭防火墙和selinnx
systemctl stop firewalld #关闭防火墙
setenforce 0 #关闭selinux
给两台分别改名为master和slave
hostnamectl set-hostname master
hostnamectl set-hostname slave
对两台机器做映射处理,进行ip解析方便两台连接,但是这一步不是一定要做,没有强制要求。
vim到/etc/hostd文件下,再尾行添加上
master的ip地址 master
slave的ip地址 slave
#两台机器都要分别添加上
做到这里我们的环境就算准备完成,接下来我们就可以进行配置了
2、master配置
修改配置文件
在/etc/my.conf目录下添加
log-bin=/var/lib/mysql/master
server-id=1
gtid_mode=on
enforce_gtid_consistency=1
添加完成后我们要重启一下mysql服务
systemctl restart mysqld
mysql数据库重启完成后我们要登录mysql中创建一个用户并授权
grant replication slave,super,reload on *.* to slave@'%' identified by '创建用户的密码';
完成上述操作,master的配置就结束,接下来我们就可以配置slave了
3、配置slave
修改配置文件
在/etc/my.conf目录下添加
log-bin=/var/lib/mysql/master
server-id=2
gtid_mode=on
enforce_gtid_consistency=1
完成配置我们同样要重启mysql数据库
systemctl restart mysqld
和配置master一样,我们同样要登录mysql,但不是创建用户,而是与master中的mysql用户进行连接
change master to master_host='slave',master_user='slave',master_password='密码',master_auto_position=1;
开启slave
start slave
开启后我们可以使用show命令查看是否成功
show slave status \g
看到下面的yes就表示成功了
我们现在就可以再master主机上写,就可以同步到slave主机上了,可以实现读写分离和备份.
五、主从复制实验中的问题
主从复制实验的过程我们可能遇到很多问题,我下面来说一下常见的问题
1、新版本mysql 做gtid方式出现错误
先在master上查看现在的gtid号
mysql> show master status\g
....
executed_gtid_set: 130fc529-a688-11ec-9793-000c2922001e:1-2,f5d2ff8f-a688-11ec-981d-000c29a7f0ed:1-2
....
在slave上操作
# mysql -u root -p'密码'
mysql> set @@global.gtid_purged='130fc529-a688-11ec-9793-000c2922001e:1-2,f5d2ff8f-a688-11ec-981d-000c29a7f0ed:1-2';
如果master上拿到的是一个gtid,那么按照上面的语法,重复两次就可以,比如:
mysql> set @@global.gtid_purged='f24c3ee0-7a88-11ed-a20e-000c29988ddf:1-3,f24c3ee0-7a88-11ed-a20e-000c29988ddf:1-3';
2、mysql server uuid重复问题,因为克隆 导致记录uuid的文件内容没有发生任何变化
解决:
1.全新机器
或者
2.直接修改文件/var/lib/mysql/auto.cnf 内的uuid
使用命令 # uuidgen 生成全新uuid直接替换文件内的旧uuid即可
六、结语
mysql主从复制是一种强大的数据库复制技术,可以提供数据的高可用性、冗余备份和负载均衡。通过正确配置和管理主从复制,我们可以确保数据的一致性和可靠性,提高系统的性能和可用性。希望本文对你理解和实施mysql主从复制有所帮助,并能在你的项目中发挥作用。
如果你对mysql主从复制还有其他问题或需要更深入的学习,建议你继续探索mysql的官方文档和相关资源,以获得更多的指导和实践经验。祝你在使用mysql主从复制的过程中取得成功!
发表评论