mysql主从复制是什么
一、主从复制原理
-
二进制日志(Binary Log)
主服务器(Master)将所有写操作(如INSERT、UPDATE、DELETE)记录到二进制日志中,作为数据变更的唯一来源。日志按事务顺序记录,确保数据一致性。 -
中继日志(Relay Log)
从服务器(Slave)通过I/O线程从主服务器拉取二进制日志,存储到本地中继日志中。SQL线程随后解析并执行这些日志,实现数据同步。 -
线程角色
- 主服务器:仅需记录二进制日志,无额外线程。
- 从服务器:
- I/O线程:连接主服务器,拉取二进制日志到中继日志。
- SQL线程:执行中继日志中的SQL语句,更新本地数据。
-
复制模式
- 异步复制(默认):主服务器提交事务后立即返回,不等待从服务器确认,可能导致数据丢失。
- 半同步复制:主服务器需等待至少一个从服务器确认接收日志后才返回,减少数据丢失风险。
- 全同步复制:需所有从服务器确认,延迟高,极少使用。
二、配置步骤
主服务器配置
-
启用二进制日志
修改my.cnf
,添加以下配置:[mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog-do-db = your_database 指定复制的数据库
重启MySQL服务:
sudo systemctl restart mysql
。 -
创建复制用户
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES;
记录二进制日志位置:
SHOW MASTER STATUS;
(需记录File
和Position
)。
从服务器配置
-
配置唯一server-id
修改my.cnf
:[mysqld] server-id = 2 relay_log = /var/log/mysql/mysql-relay-bin.log
重启MySQL服务。
-
设置主从关系
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123; START SLAVE;
验证状态:
SHOW SLAVE STATUS\G
,确保Slave_IO_Running
和Slave_SQL_Running
为Yes
。
三、常见问题与解决方案
-
复制延迟
- 原因:网络延迟、从库性能不足、大事务或长查询。
- 优化:
- 升级从库硬件(如SSD、增加CPU/内存)。
- 启用并行复制(MySQL 5.6支持库级别并行,5.7支持事务组并行)。
- 优化SQL语句,减少批量操作。
-
错误处理
- IO线程故障:检查网络连通性,重置从库:
STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO ...; START SLAVE;
。 - SQL线程报错:跳过错误:
SET GLOBAL sql_slave_skip_counter = 1;
。
- IO线程故障:检查网络连通性,重置从库:
-
数据不一致
- 主从延迟导致读写分离时的短暂不一致,可通过应用层容忍或强制读主库。
四、应用场景
-
读写分离:主库处理写操作,从库分担读压力,提升并发性能。
-
高可用性:主库故障时,从库可快速接管服务。
-
数据备份与灾难恢复:从库作为实时备份,支持快速恢复。
-
级联复制:多层从库结构,扩展复制范围。
五、注意事项
时间同步:主从服务器需使用NTP同步时间,避免日志解析错误。
- 自增主键冲突:避免主从同时写入,或使用
AUTO_INCREMENT_INCREMENT
和AUTO_INCREMENT_OFFSET
配置。 - 监控:定期检查
SHOW SLAVE STATUS
,关注Seconds_Behind_Master
和错误日志。
通过合理配置和优化,MySQL主从复制可显著提升系统性能、可靠性和扩展性,是构建高可用数据库架构的基石。