概述
主从复制是指将主数据库的DDL 和DML操作通过二进制日志传到从库服务器中,然后再从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
优点
- 主库出现问题,可以快速切换到从库提供服务
- 实现读写分离,降低主库的访问压力
- 可以再从库中执行备份,以避免备份期间隐形阿根主库服务
原理
- 主数据库(Master):主数据库是被复制的源头,负责接收应用程序的写操作(INSERT、UPDATE、DELETE等),并记录这些操作到自身的binlog(二进制日志)中。binlog记录了所有数据库的变更操作,以二进制的形式存储。
- 从数据库(Slave):从数据库是复制的目标,它会连接到主数据库,并请求主数据库的binlog。从数据库将主数据库的binlog复制到自己的relay log(中继日志)中,然后执行relay log中的操作,从而实现与主数据库的数据同步。
- 主从复制过程:
- 主数据库将写操作记录到binlog中。
- 从数据库连接到主数据库,并请求binlog中的数据。
- 主数据库将binlog中的数据传输给从数据库。
- 从数据库将binlog中的数据写入到自己的relay log中。
- 从数据库执行relay log中的操作,将改变反映他自己的数据,使自己的数据与主数据库保持同步。
搭建
服务器准备
开放指定的3306端口号:
firewall-cmd --zone=public --add-port=2206/tcp -permanent
firewall0cmd -reload
关闭服务器的防火墙
systemctl stop firewalld
systemctl disable firewalld
主库配置
1.修改配置文件/etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^23-1,默认为1
server-id=1
#是否只读,1代表只读,0代表读写
read-only=0
#忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
2.重启MySQL服务器
systemctl restart mysqld
3.登录msyql,创建远程连接的账号,并授予主从复制权限
#创建itcast用户,并设置密码,该用户可以再任意主机连接该MySQL服务
CREATE USER 'itcast'@'%'IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
4.通过指令,查看二进制日志坐标
show master status;
字段含义说明:
file:从哪个日志文件开始推送日志文件
position:从哪个位置开始推送日志
binlog_ignore_db:指定不需要同步的数据库
从库配置
1.修改配置文件/etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^23-1,和主库不一样既可
server-id=2
#是否只读,1代表只读,0代表读写
read-only=1
2.重新启动MySQL服务
systemctl restart mysqld
3.登录MySQL,设置主库配置
CHANGE REPLICATION SOURCE TO SOURCE_HOST='XXX.XXX',SOURECE_USER='XXX',SOURCE_PASSWORD='XXX',SOURCE_LOG_FILE='XXX',SOURCE_LOG_POS=XXX;
上述是8.0.23中的语法。如果是msyql是8.0.23之前的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST='XXX.XXX.XXX.XXX',MASTER_USER='XXX',MASTER_PASSWORD='XXX',MASTER_LOG_FILE='XXX',MASTER_LOG_POS=XXX;
参数名 | 含义 |
---|---|
SOURCE_HOST | 主库IP地址 |
SOURCE_USER | 连接主库的用户名 |
SOURCE_PASSWORD | 链接主库的密码 |
SOURCE_LOG_FILE | binlog日志文件名 |
SOURCE_LOG_POS | binlog日志文件位置 |
4.开启同步操作
start replica; #8.0.22之后
start slave; #8.0.22之前
5.查看主从同步的装填
show replica status;
show slave status;