MySQL的主从复制是一种数据复制机制,允许数据从一个主数据库服务器(Master)实时同步到一个或多个从数据库服务器(Slave)。通过主从复制,用户可以实现读写分离、数据备份、高可用性等目标。以下是主从复制的核心要点:
1. 主从复制的核心原理
-
二进制日志(Binary Log)
- 主库将所有数据变更操作(如INSERT、UPDATE、DELETE)写入二进制日志(binary log)。
- 二进制日志保存了数据库的“操作历史”,是主从复制的数据源。
-
复制线程
-
主库:仅负责记录操作到二进制日志。
-
从库:
- I/O线程:连接主库,读取二进制日志到本地的中继日志(Relay Log)。
- SQL线程:读取中继日志,执行其中记录的操作以同步数据。
-
-
异步复制(默认模式)
- 主库在提交事务后无需等待从库确认,直接返回客户端。
- 优点:高性能;缺点:可能数据不一致(从库可能落后主库)。
-
半同步复制(Semi-Synchronous Replication)
- 主库需要至少一个从库确认接收日志之后才认为事务成功提交。
- 平衡性能与数据一致性,降低数据丢失风险。
-
全同步复制(Group Replication)
- 主库需所有从库确认接收日志后才返回,确保强一致性。
- 性能影响较大,适用于对一致性要求极高的场景。
2. 主从复制的配置步骤
假设主库IP为 192.168.1.100
,从库IP为 192.168.1.101
:
步骤1:主库配置
-
修改配置文件
my.cnf
[mysqld] server-id = 1 # 唯一ID(主从不能重复) log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志 binlog_format = ROW # 推荐使用ROW格式(精确记录每行变更)
-
重启MySQL服务
systemctl restart mysqld
-
创建复制用户
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES;
-
获取主库日志状态
SHOW MASTER STATUS; -- 记录结果中的 File(如mysql-bin.000001)和 Position(如120)
步骤2:从库配置
-
修改配置文件
my.cnf
[mysqld] server-id = 2 # 唯一ID(与主库不同) relay_log = /var/log/mysql/relay-bin.log read_only = ON # 从库设为只读(防止误写入)
-
重启MySQL服务
systemctl restart mysqld
-
设置主库信息并启动复制
CHANGE MASTER TO MASTER_HOST = '192.168.1.100', MASTER_USER = 'repl', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', -- 主库的File名 MASTER_LOG_POS = 120; -- 主库的Position值 START SLAVE; -- 启动复制
-
检查复制状态
SHOW SLAVE STATUS\G -- 关键字段: -- Slave_IO_Running: Yes(I/O线程正常) -- Slave_SQL_Running: Yes(SQL线程正常) -- Seconds_Behind_Master: 0(无延迟)
3. 主从复制的常见问题与解决
-
数据不一致
-
原因:从库写入冲突、网络中断、SQL线程错误等。
-
解决:
- 使用
mysqldump
重新全量同步,或工具如pt-table-checksum
检查并修复差异。
- 使用
-
-
复制延迟(Seconds_Behind_Master > 0)
-
原因:从库负载过高、主库写入量过大、网络带宽不足。
-
解决:
- 优化从库硬件资源(如SSD)。
- 使用并行复制(设置
slave_parallel_workers
)。 - 避免单线程大事务。
-
-
主库故障切换(Failover)
-
手动切换:
- 提升从库为主库(取消
read_only
)。 - 修改应用连接配置到新主库。
- 提升从库为主库(取消
-
自动切换:通过中间件(如MHA、Orchestrator)或集群方案(如InnoDB Cluster)。
-
4. 高级复制模式
-
基于GTID的复制(Global Transaction ID)
-
通过全局唯一事务ID替代传统二进制日志位置,简化主从切换。
-- 主库和从库均配置: gtid_mode = ON enforce_gtid_consistency = ON
-
-
链式复制(级联复制)
- 主 -> 从A -> 从B:减轻主库压力,适合多层架构。
-
多源复制(Multi-Source Replication)
- 单个从库可同时从多个主库同步数据。
5. 使用场景
- 读写分离:从库处理读请求,主库专注写操作。
- 数据备份:从库作为实时备份。
- 高可用性:主库故障时快速切换至从库。
- 异地容灾:跨地域部署从库。
总结
MySQL主从复制通过二进制日志实现数据同步,是构建高可用、高性能数据库架构的基石。掌握其核心原理和配置步骤后,可灵活应对不同业务场景的需求。对于关键系统,建议进一步探索半同步复制、GTID、以及自动化运维工具(如ProxySQL、Orchestrator)以提升可靠性和可维护性。