MySQL主从同步(主从复制)
mysql主从同步是什么
MySQL 主从同步(Master-Slave Replication)是一种将数据从一个 MySQL 数据库服务器(主库,Master)复制到一个或多个其他服务器(从库,Slave)的技术。它基于二进制日志(binlog)实现数据的实时或近实时同步,是 MySQL 高可用性和扩展性的基础。
工作原理
- 主库记录变更:主库将所有数据变更操作(如 INSERT、UPDATE、DELETE)记录到二进制日志(binlog)中。
- 从库复制 binlog:从库通过 IO 线程连接主库,读取主库的 binlog 并写入自己的中继日志(relay log)。
- 从库执行变更:从库的 SQL 线程读取中继日志,将其中的变更操作在本地执行,实现数据同步。
优点
- 读写分离:将读请求分发到多个从库,减轻主库压力,提升系统整体吞吐量
- 灾备:当主库故障时,从库可作为主库的热备份,降低数据丢失风险。
缺点
- 数据延迟:主从同步存在延迟(尤其是主库写压力大时),从库数据可能不是实时的。
- 维护与资源消耗: 多个从库需要占用大量的服务器资源,同时也增加了维护复杂度
实现步骤
1.准备两台服务器(也可以一台机器多个MySQL实例,参考在一台CentOS服务器上开启多个MySQL服务-CSDN博客),一主一从,并且安装了MySQL(本文档基于CentOS7 和 MySQL5.7)
2.主服修改mysql配置文件 /etc/my.cnf,重启mysql生效,systemctl restart mysqld
[mysqld]
# server-id,集群中的server-id不能出现重复的
server-id=1
# 开启bin-log日志,可以指定具体路径
log-bin=mysql-bin
# 行级复制
binlog-format=ROW
3.从服修改mysql配置文件 /etc/my.cnf,重启mysql生效,systemctl restart mysqld
[mysqld]
server-id = 2
# 启用中继日志(记录主服发送的binlog),可以指定具体路径
relay-log = mysql-relay-bin
# 同步的数据库
replicate-do-db = zero
# 设置从服数据库为只读(可选)
read-only=1
4. 主服、从服创建mysql主从同步专用用户
# 创建用户,且只有指定IP能够访问
CREATE USER 'repl'@'对方IP' IDENTIFIED BY 'your_password';
# 授予复制权限,且只有指定IP能够访问,*.*表示允许访问所有数据库的所有表
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'对方IP' ;
# 刷新权限
FLUSH PRIVILEGES;
5. 将数据导入到从服,导出数据时最好停止相关服务,或者锁表
# 导出数据,--single-transaction保证备份一致性,--master-data=2以注释形式记录binlog信息
mysqldump -u root -p --single-transaction --master-data=2 --databases zero > zero.sql
6.获取备份文件中的binlog信息
head -50 zero.sql | grep MASTER_LOG_FILE
# 输出示例:
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000707', MASTER_LOG_POS=3828256;
7.从服执行SQL,建立主从同步关系,MASTER_LOG_FILE 和 MASTER_LOG_POS 字段与上一步获取的相对应
CHANGE MASTER TO
MASTER_HOST='主服IP',
MASTER_USER='repl',
MASTER_PASSWORD='PASSWORD',
MASTER_LOG_FILE='bin-log.000707',
MASTER_LOG_POS=3828256;
# 启动同步线程
START SLAVE;
# 查看同步状态,输出的数据中Slave_IO_Running和Slave_SQL_Running字段均为Yes则是成功
SHOW SLAVE STATUS\G;
### 主服对zero数据库进行增删改,观察从服的zero库数据是否同步
### 如何判断从服数据是否完全同步?
# 从服执行SQL
SHOW SLAVE STATUS\G
# 主服执行SQL
SHOW MASTER STATUS;
# 对比从服的Relay_Log_File和Exec_Master_Log_Pos字段值与主服的File和Position字段值是否一致