2026-02-26 17:22:07
MySQL主从复制原理
MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行。从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
一、主从复制的原理
主库(Master)操作:
当主库上的数据发生改变时(如DML或DDL操作),这些改变会被记录到二进制日志(binlog)中。
主库会生成一个log dump线程,用于向从库发送二进制事件。
从库(Slave)操作:
从库会生成两个线程:一个I/O线程和一个SQL线程。
I/O线程负责请求主库的binlog内容,并将其写入到从库本地的中继日志(relay-log)中。
SQL线程负责从中继日志中读取二进制日志事件,并在从库上重放这些事件,以更新从库的数据,使其与主库保持一致。
二、主从复制的具体步骤
配置从库连接主库:
从库通过执行CHANGE MASTER TO语句连接主库,提供连接的用户名、密码、端口、IP地址等信息,并指定二进制日志的起点位置(文件名和位置号)。
启动从库复制:
执行START SLAVE命令,启动从库的复制进程。
建立连接并请求binlog:
从库的I/O线程与主库的log dump线程建立连接。
根据CHANGE MASTER TO语句提供的文件名和位置号,I/O线程向主库发起binlog的请求。
发送并接收binlog:
主库的log dump线程根据从库的请求,将本地binlog以事件的方式发送给从库的I/O线程。
从库的I/O线程接收这些binlog事件,并将其存放到本地的relay-log中。
重放binlog并更新数据:
从库的SQL线程读取relay-log中的日志事件,并解析成SQL语句逐一执行。
这些SQL语句的执行会更新从库的数据,使其与主库保持一致。
三、注意事项
主库必须开启binlog功能:
为了实现主从复制,主库必须开启binlog功能,以便记录数据的改变。
从库也建议开启binlog功能:
为了数据安全考虑,从库也可以开启binlog功能。这样,在从库上也可以进行主从复制,实现链式复制或多级复制。
MySQL版本一致性:
MySQL复制最好确保主库和从库上的MySQL版本相同。如果不能满足版本一致,那么要保证主库的版本低于从库的版本,以避免兼容性问题。
时间同步:
主库和从库之间的时间需要同步,以确保复制的一致性和准确性。
四、MySQL主从复制的形式
一主一从:
一个主库和一个从库,主库负责写操作,从库负责读操作。
主主复制:
两个主库互相作为对方的从库,可以实现双向复制和负载均衡。但需要注意数据冲突和一致性问题。
一主多从:
一个主库和多个从库,主库负责写操作,多个从库负责读操作。可以提高读操作的并发性和可用性。
多主一从:
多个主库和一个从库,多个主库的数据都会复制到从库上。但需要注意数据的一致性和冲突解决。
联级复制:
多个从库之间形成链式复制关系,可以实现多级复制和数据分发。
五、主从同步延时分析
MySQL的主从复制是单线程操作,当主库的并发较高或产生大量DML操作时,从库的SQL线程可能无法及时处理这些事件,导致复制延时。
解决方案:
分库架构:
采用分库架构,将数据库服务平行扩展,分散压力。
读写分离:
实现读写分离,一主多从,主库负责写操作,从库负责读操作。
加入缓存层:
在业务和数据库之间加入缓存层(如Memcache或Redis),降低数据库的读压力。
分散压力:
将不同业务的数据库物理上放在不同机器上,分散压力。
使用更好的硬件设备:
使用比主库更好的硬件设备作为从库,减小复制延时。
使用MTS并行复制技术:
MySQL 5.7之后引入了MTS(Multi-Threaded Slaving)并行复制技术,可以永久解决复制延时问题。
