mysql主从复制是指将一台mysql数据库服务器(主库)的数据变更同步到多台mysql数据库服务器(从库)的技术,是构建高可用、高性能数据库架构的基础方案之一。

mysql主从复制的核心原理
主从复制的实现依赖三个核心线程和两个关键日志文件,整体流程可以分为三个步骤:
- 主库将数据的增删改操作记录到二进制日志(binlog)中
- 从库的I/O线程连接主库,读取主库的binlog内容并写入到自身的中继日志(relay log)中
- 从库的SQL线程读取中继日志中的内容,逐条执行SQL语句完成数据同步
mysql主从复制的配置步骤
1. 主库配置
首先修改主库的配置文件,开启binlog并设置唯一服务器ID:
[mysqld] # 开启二进制日志 log-bin=mysql-bin # 设置服务器唯一ID,取值范围1-231-1 server-id=1 # 指定需要同步的数据库,不配置则同步所有数据库 binlog-do-db=test_db # 指定不需要同步的数据库 binlog-ignore-db=mysql
重启主库后,创建用于从库同步的账号并授权:
-- 创建同步账号,允许从库IP连接 CREATE USER 'slave_user'@'192.168.0.%' IDENTIFIED BY 'slave_password'; -- 授予复制权限 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave_user'@'192.168.0.%'; -- 刷新权限 FLUSH PRIVILEGES; -- 查看主库状态,记录File和Position值 SHOW MASTER STATUS;
2. 从库配置
修改从库配置文件,设置唯一服务器ID:
[mysqld] # 设置从库唯一服务器ID,不能和主库及其他从库重复 server-id=2 # 开启中继日志 relay-log=mysql-relay
重启从库后,配置主库连接信息并启动同步:
-- 配置主库连接信息,替换对应的主库IP、端口、账号、密码、binlog文件和位置 CHANGE MASTER TO MASTER_HOST='192.168.0.10', MASTER_PORT=3306, MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; -- 启动从库同步线程 START SLAVE; -- 查看从库同步状态 SHOW SLAVE STATUSG
如果Slave_IO_Running和Slave_SQL_Running两个字段的值都是Yes,说明主从复制配置成功。
mysql主从复制的常见类型
根据同步粒度和延迟情况,主从复制可以分为以下几种类型:
| 复制类型 | 说明 | 适用场景 |
|---|---|---|
| 异步复制 | 主库写入binlog后立即返回结果,不等待从库同步确认,存在数据丢失风险 | 对数据一致性要求不高的读多写少场景 |
| 半同步复制 | 主库等待至少一个从库接收binlog并写入relay log后才返回结果,降低数据丢失风险 | 对数据一致性有一定要求的核心业务场景 |
| 全同步复制 | 主库等待所有从库都完成数据同步后才返回结果,性能损耗较大 | 对数据一致性要求极高的金融类场景 |
mysql主从复制的实际应用优势
- 提升读写性能:主库负责写操作,从库负责读操作,实现读写分离,减轻主库压力
- 数据备份容灾:从库可以作为数据备份节点,主库故障时可快速切换从库提供服务
- 负载均衡:多个从库可以分摊读请求压力,应对高并发访问场景
- 数据分析隔离:可以在从库上执行复杂的数据分析查询,避免影响主库的业务性能
常见问题及排查
如果主从同步出现延迟或中断,可以先查看从库的同步状态,根据错误信息排查:
- 如果是
Slave_IO_Running为Connecting,检查主库IP、端口、账号密码是否正确,网络是否通畅 - 如果是
Slave_SQL_Running为No,检查从库是否执行了和主库冲突的写操作,或者binlog文件位置是否匹配 - 同步延迟较大时,可以检查从库硬件性能、是否有大事务执行,或者调整主库的binlog刷盘策略