大家可能会发现,自己的主从复制会存在主从数据延迟的问题,甚至会导致读写分离,架构设计在业务层出现较为严重的问题,比如迟迟无法读取到主库已经插入的数据。但这可能并不是 MySQL 复制的问题,而是业务没有根据 MySQL 复制的特点进行设计。
本篇文章,我们就来看一下主从复制延迟的原因,以及如何避免这个令人头疼的问题。
一、逻辑日志的优缺点
MySQL 复制基于的二进制日志是一种逻辑日志,其写入的是每个事务中已变更的每条记录的前项、后项。有了每条记录的变化内容,用户可以方便地通过分析 MySQL 的二进制日志内容,准时地将 MySQL 中的数据同步到异构的数据平台,如 HBase、ES、Hive 等大数据平台。
逻辑日志简单易懂,方便数据之间的同步,但它的缺点是:事务不能太大,否则会导致二进制日志非常大,一个大事务的提交会非常慢。
假设有个 DELETE 删除操作,删除当月数据,由于数据量可能有 1 亿条记录,可能会产生 100G 的二进制日志,则这条 SQL 在提交时需要等待 100G 的二进制日志写入磁盘,如果二进制日志磁盘每秒写入速度为 100M/秒,至少要等待 1000 秒才能完成这个事务的提交。
所以在 MySQL 中,一定要对大事务特别对待, 总结起来就是:
-
1、设计时,把 DELETE 删除操作转化为 DROP TABLE/PARTITION 操作;
-
2、业务设计时,把大事务拆成小事务。
对于第一点(把 DELETE 删除操作转化为 DROP TABLE/PARTITION 操作),主要是在设计时把流水或日志类的表按时间分表或者分区,这样在删除时,二进制日志内容就是一条 DROP TABLE/PARITION 的 SQL,写入速度就非常快了。
而第二点(把大事务拆分成小事务)也能控制二进制日志的大小。比如对于前面的 DELETE 操作,如果设计时没有分表或分区,那么可以进行如下面的小事务拆分:
DELETE