MySQL 主从复制(Replication)是 MySQL 数据库中实现数据冗余与分布的重要机制。它通过在主数据库(Master)和从数据库(Slave)之间同步数据,提高数据可用性、分担读操作的压力,适用于负载均衡和高可用性场景。以下详细讲解 MySQL 主从复制的概念、原理、配置和注意事项。
一、MySQL 主从复制的核心原理
- 主数据库记录变更事件:
主库上的所有写操作(如INSERT
、UPDATE
和DELETE
)会记录在二进制日志(Binary Log)中。这些日志包含数据变更的详细信息。 - 从数据库拉取日志:
从库通过 I/O 线程从主库拉取这些二进制日志,并保存到自己的中继日志(Relay Log)中。 - 从数据库重放日志:
从库的 SQL 线程会读取中继日志,并执行其中的 SQL 语句以保持与主库的数据一致。
二、主从复制的模式
- 异步复制(Asynchronous Replication):
主库无需等待从库确认日志接收,性能高但有数据延迟和丢失风险。 - 半同步复制(Semi-Synchronous Replication):
主库在提交事务时会等待至少一个从库确认接收日志,确保部分数据同步。 - 组复制(Group Replication):
一种多主架构,允许多节点协作,提供更高的容错性。
三、主从复制的配置步骤
1. 准备工作
- 确保主库和从库的 MySQL 版本兼容。
- 配置网络互通(如防火墙允许 3306 端口)。
- 主库和从库必须拥有不同的 server-id。
2. 配置主库
编辑主库的 MySQL 配置文件(如 my.cnf
或 my.ini
):
[mysqld]
server-id = 1 # 主库唯一ID
log-bin = mysql-bin # 启用二进制日志
binlog-do-db = your_db # 选择需要复制的数据库(可选)
binlog-ignore-db = test # 忽略的数据库(可选)
重启 MySQL 服务:
sudo systemctl restart mysql
创建一个复制用户,并授权:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
记录当前二进制日志的状态:
SHOW MASTER STATUS;
输出示例:
File: mysql-bin.000001
Position: 154
3. 配置从库
编辑从库的配置文件:
[mysqld]
server-id = 2 # 从库唯一ID
relay-log = relay-bin # 启用中继日志
重启 MySQL 服务。
在从库上配置主从关系:
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='replicator',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', # 主库状态中记录的 File
MASTER_LOG_POS=154; # 主库状态中记录的 Position
启动从库复制:
START SLAVE;
4. 验证主从复制状态
在从库上查看状态:
SHOW SLAVE STATUS\G;
关键字段:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
表示主从复制正常运行。
四、主从复制的常见问题与解决
- 延迟问题:
当主库写入量大,从库压力过高时,可能导致数据延迟。可通过优化 SQL 查询、增加硬件性能或调整从库数量分担压力。 - 主从不一致:
如果主从数据不一致,可能需要重新同步数据。例如:
- 备份主库数据并还原到从库。
- 使用工具如
pt-table-checksum
检查差异。
- 复制中断:
如果复制停止,可以通过以下步骤修复:
- 查看
SHOW SLAVE STATUS\G
的Last_Error
。 - 跳过错误:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
五、扩展和优化
- 读写分离:
配合中间件(如 MySQL Proxy 或 MyCat),实现主库负责写,从库负责读,提升性能。 - 多主多从:
在高并发场景下,可以部署多个主库和多个从库,并结合分片策略提升效率。 - 监控工具:
使用 Percona Toolkit 或监控系统(如 Zabbix、Prometheus)实时跟踪复制状态。
六、主从复制的应用场景
- 高可用性:快速恢复故障,提高服务的容错率。
- 负载均衡:读写分离分担压力。
- 备份方案:利用从库作为热备份,避免对主库的操作干扰生产环境。