数据库是系统的核心资产,一旦发生宕机后果难以想象。mysql作为高可用数据库提供主从复制策略,通过该方式可以将数据库水平分布在多台机器上,分担主库的压力。可以说主从复制是mysql高可用的保证,是构建大型应用的基础。
主从复制作用
- 数据备份。对一个数据库的数据进行备份。
- 灾备。当主库宕机后从库可以进行故障转移,避免全部宕掉。
- 分担主库压力。主库负责写入,多台从库分担主库读压力。
- 数据分析。将数据分布到多个节点,分析只在从库进行,大量数据耗时查询对业务造成影响。
主从复制过程

- 1、从库通过io线程主动连接主库,携带自身日志位置。
- 2、主库收到从库同步请求,检查binlog是否有新日志产生。
- 3、主库检测到新日志则将新日志主动发送给从库io线程。
- 4、从库io线程收到同步日志,写入重放日志。
- 5、从库重放线程读取重放日志,将数据写入从库。
主从复制模式
mysql 支持3种复制模式:异步模式、半同步模式、全同步模式。
异步模式
顾名思义,主从复制是异步的。也就是说当主库将新增binlog发送给从库后不需要从库的ack确认。这种模式下主机无法感知从库的同步是否完成,由于网络或从库本身压力原因,从库同步可能失败导致主从库数据同步延迟加重。
半同步模式
主节点需要接收到一台从节点的ack返回信息即可认为本次的复制成功,否则等待直到超时时间,超时后切换成异步模式再提交。这样做的目的是为了降低主从的数据同步延迟,提高数据安全性,确保了事务提交后,binlog至少传输到了一个从库上,但不能保证从节点将此事务更新到db中。性能上会有一定的降低,同时响应时间会变长。
全同步模式
全同步模式是指主库和从库全部ack确认后才算成功,这种模式下性能最差。
并行复制
Mysql并行复制主要作用于从库的重放日志写入从库通过多个线程并发重放日志尽可能降低大量写库场景下的主从数据延迟的时间。
主从延迟
主从库由于依赖主从复制进行数据同步,数据一致性存在一定的延迟。影响延迟的因素主要有:
- 1、从库压力过大。当从库承担了大量的查询压力,CPU使用率居高不下,导致从库回放过慢,造成主从延迟。
- 2、主库大事务。从并行复制我们可以知道,同一个事务内的sql需要完整的执行才能保证数据一致性。如若一个事务过大,执行时间过长。那么从库至少需要等待这个事务完全执行完后才能接收到同步。
大事务同样也会影响主库的数据更新,因此我们需要在实际使用过程中尽量避免大事务,比如尽可能减小事务影响范围、大量数据更新插入分成多批进行处理、大事务拆成小事务等等。