MySQL主从同步原理
MySQL主从同步原理
MySQL主从同步(Replication)是一种数据复制机制,允许将一个MySQL数据库服务器(主库)的数据自动同步到一个或多个其他服务器(从库)。其核心目标是实现数据备份、读写分离和高可用性。
主从复制的核心就是二进制日志,记录了所有数据定义语言,数据操作语言,不包括数据查询语言
主从同步的基本流程
- 主库将数据变更写到二进制日志(Binary Log,简称binlog)。binlog是主从同步的基础,记录了所有可能影响数据库内容的操作(如INSERT、UPDATE、DELETE等)。
- 从库的I/O线程会连接到主库,请求获取主库的binlog。主库的binlog dump线程会将binlog内容发送给从库的I/O线程。
- 从库的I/O线程将接收到的binlog内容写入到自己的中继日志(Relay Log)。中继日志的作用是暂存从主库接收到的数据变更,供后续处理。
- 从库的SQL线程会读取中继日志中的事件,并在从库上重新执行这些SQL操作,从而使从库的数据与主库保持一致。
主从同步的三种模式
基于语句的复制(Statement-Based Replication, SBR) 主库记录SQL语句本身到binlog,从库通过重放这些SQL语句来实现同步。优点是日志量小,但某些函数(如NOW())可能导致主从不一致。
基于行的复制(Row-Based Replication, RBR) 主库记录每行数据的变化到binlog。优点是准确性高,但日志量大,尤其在批量操作时。
混合模式复制(Mixed-Based Replication, MBR) 默认使用SBR,仅在可能引发不一致的情况下自动切换到RBR。结合了两者的优点,是MySQL推荐的模式。
主从同步的配置示例
主库配置(my.cnf):
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=MIXED
从库配置(my.cnf):
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
设置主从同步的命令:
-- 在主库创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';-- 在从库配置主库信息
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;-- 启动从库复制
START SLAVE;
主从同步的常见问题
数据延迟 从库由于硬件性能或网络问题,可能无法及时应用主库的变更,导致数据延迟。可以通过监控Seconds_Behind_Master
参数来发现。
主从不一致 某些操作可能导致主从数据不一致。可以使用pt-table-checksum
等工具进行校验,并通过pt-table-sync
工具修复。
复制中断 网络问题或主库binlog被清理可能导致复制中断。需要重新配置复制起点或修复网络问题。