1、mysql同步原理
(1)、master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
(2)、slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。(slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。)
(3)、SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
2、同步方式
主从复制--异步复制原理
半同步复制原理:降低了主从延迟可能,但是影响主库性能
并行复制(mysql 5.7之后)
并行是指从库多线程apply binlog,库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)。
set global slave_parallel_workers=10; 设置sql线程数为10
3、主从复制延迟处理
主从延迟原因:当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。
方法一:插入后,更新缓存服务如redis,其他节点需先读缓存中的数据。然后再写入从mysql。
方法二:基于binlog单线程从主库到从库,主库添加时间戳做同步标记,读从库前检查同步时间戳标记是否同步。
方法三:采用并行复制机制,减缓延迟