写这篇文章是因为之前有一个数据库删除操作,需要批量删除数据。当时没把删除速度控制好,导致主从延迟,出了个小事故。今天我们就来看看为什么会出现主从延迟,以及如何处理主从延迟等相关问题。坐下来准备出发!-思维导图-主从通用架构随着访问量越来越大,单体数据库的容量已经捉襟见肘。因此,利用主库写入数据,从库读取数据,衍生出读写分离的主从架构。在生产环境中,常见的主从架构有很多。下面是一些常见的架构模式。主从复制的原理了解了主从的基本架构和相关配置后,下面就进入正题了。对于主从,通常的操作是主库写数据,从库读数据。这样做的好处是通过分散读写压力,避免所有的请求都打到主库上。同时,通过从库的横向扩展,系统的可扩展性和负载能力也得到了极大的提升。但问题来了。从库中的数据必须和主库保持一致,所以主库中的数据写入后需要同步到从库。如何维护主从库的数据一致性,主库如何实时同步数据到从库?基本原理Mysql中主从复制有两个非常重要的日志文件:binlog(二进制日志文件)和relaylog(中继日志文件)。主从同步过程中,主库会将所有操作事件记录在binlog中,从库通过开启I/O线程与主库保持通信,并检测一定时间内binlog日志文件是否发生变化间隔。如果binlog日志发生变化,主库会产生一个binlogdump线程,将binlog传递给从库I/O线程。将binlog从库上的I/O线程复制到它自己的中继日志中。最后,从库中的SQL线程读取relaylog中的事件,重播到从库。主从延迟的原因在上面的过程中,我们已经知道了主从复制的相关过程,但是主库更新时会同步从库,那么为什么会出现主从延迟呢?随机重放Mysql主库写入binlog的操作是顺序写入的。前面我们提到过,磁盘的顺序读写速度是非常快的。同样,从库的I/O线程运行日志的速度效率也很高。但是不要忘了,还有一个SQL线程用于数据replay,replay过程是随机写入磁盘的。至此,你应该明白了,在某个时刻,relaylog中的数据来不及replay到从库中,就会出现主从延迟。主库高并发知道了从库中SQL线程的replay情况,当然就不难理解主库高并发造成的主从延迟。在某一时刻,大量的写请求打到了主库,这就意味着需要不断的写入binlog。这时候从库中的SQL线程就会不堪重负,自然会出现主从延迟。锁等待对于SQL单线程来说,遇到阻塞的时候,会一直等到执行成功再继续。如果在某个时刻,从库因为查询等待锁,此时,只有当前操作完成后,才会执行后面的操作,同样会出现主从延迟.主从延迟处理知道了主从延迟的原因,我们来看看如何处理。并行复制由于SQL单线程replay的速度有限,那么可以使用多线程replay吗?MySQL5.6版本后,提供了并行复制的方式,通过将SQL线程转换为多个工作线程进行重放,解决了主从延迟问题。降低主库的并发,你可能会说,我用的是低版本的数据库,升级不了版本,怎么办?对于主库高并发的情况,只能通过这种方式控制并发来解决延迟,多使用Redis。读主库的情况大家一定很熟悉。对于一些实时性要求高的数据,是无法从备库读取的。逾期半天以上,不得交年终奖。总结主从复制的原理主从复制中有两个非常重要的日志文件,binlog和relaylog,分别位于主库和从库。其中binlog是主从复制的基础。操作事件写入binlog,通过I/O线程传输到从库进行同步。主从延迟的原因从库中SQL线程的重放过程是随机写入磁盘的,SQL线程是单线程的,所以如果数据来不及重放,就会造成主从延迟.主库的高并发会导致写操作不断的写入binlog,可能对SQL线程不堪重负,造成主从延迟。如果在replay的时候遇到lockwaiting,也是造成延迟的原因之一。主从延迟处理MySQL5.6及以后版本通过并行复制解决了SQL单线程带来的主从延迟问题。对于低版本,可以通过降低主库的并发来解决。如果对实时数据要求比较严格,可以通过读取主库来达到目的。
