共计 3231 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章主要讲解了“MySQL 主从数据库同步延迟问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“MySQL 主从数据库同步延迟问题怎么解决”吧!
MySQL 的主从同步是一个很成熟的架构,优点为:
①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;
②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。
相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是 MySQL 的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?
鸿蒙官方战略合作共建——HarmonyOS 技术社区
MySQL 数据库主从同步延迟原理。
MySQL 数据库主从同步延迟是怎么产生的。
MySQL 数据库主从同步延迟解决方案。
1. MySQL 数据库主从同步延迟原理。
答:谈到 MySQL 数据库主从同步延迟原理,得从 mysql 的数据库主从复制原理说起,mysql 的主从复制都是单线程的操作,主库对所有 DDL 和 DML 产生 binlog,binlog 是顺序写,所以效率很高,slave 的 Slave_IO_Running 线程到主库取日志,效率很比较高,下一步, 问题来了,slave 的 Slave_SQL_Running 线程将主库的 DDL 和 DML 操作在 slave 实施。DML 和 DDL 的 IO 操作是随即的,不是顺 序的,成本高很多,还可能可 slave 上的其他查询产生 lock 争用,由于 Slave_SQL_Running 也是单线程的,所以一个 DDL 卡主了,需要 执行 10 分钟,那么所有之后的 DDL 会等待这个 DDL 执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的 DDL 也需要执行 10 分,为什 么 slave 会延时?”,答案是 master 可以并发,Slave_SQL_Running 线程却不可以。
2. MySQL 数据库主从同步延迟是怎么产生的。
答:当主库的 TPS 并发较高时,产生的 DDL 数量超过 slave 一个 sql 线程所能承受的范围,那么延时就产生了,当然还有就是可能与 slave 的大型 query 语句产生了锁等待。
3. MySQL 数据库主从同步延迟解决方案
答:最简单的减少 slave 同步延时的方案就是在架构上做优化,尽量让主库的 DDL 快速执行。还有就是主库是写,对数据安全性较高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而 slave 则不需要这么高的数据安全,完全可以讲 sync_binlog 设置为 0 或者关闭 binlog,innodb_flushlog 也 可以设置为 0 来提高 sql 的执行效率。另外就是使用比主库更好的硬件设备作为 slave。
mysql-5.6.3 已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,Oracle 使用的是以数据库 (schema) 为单位做多线程,不同的库可以使用不同的复制线程。
基于局域网的 master/slave 机制在通常情况下已经可以满足 实时 备份的要求了。如果延迟比较大,就先确认以下几个因素:
鸿蒙官方战略合作共建——HarmonyOS 技术社区
网络延迟
master 负载
slave 负载
一般的做法是,使用多台 slave 来分摊读请求,再从这些 slave 中取一台专用的服务器,只作为备份用,不进行其他任何操作,就能相对 *** 限度地达到 实时 的要求了
slave_net_timeout 单位为秒 默认设置为 3600 秒 参数含义:当 slave 从主数据库读取 log 数据失败后,等待多久重新建立连接并获取数据 master-connect-retry 单位为秒 默认设置为 60 秒 参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。
通常配置以上 2 个参数可以减少网络问题导致的主从数据同步延迟
判断主从延时,通常有两个方法:
1.Seconds_Behind_Master vs 2. mk-heartbeat,下面具体说下两者在实现功能的差别。
可以通过监控 show slave statusG 命令输出的 Seconds_Behind_Master 参数的值来判断,是否有发生主从延时。
其值有这么几种:
NULL - 表示 io_thread 或是 sql_thread 有任何一个发生故障,也就是该线程的 Running 状态是 No, 而非 Yes。0 - 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为 lag 不存在。正值 - 表示主从已经出现延时,数字越大表示从库落后主库越多。负值 - 几乎很少见,只是听一些资深的 DBA 说见过,其实,这是一个 BUG 值,该参数是不支持负值的,也就是不应该出现。
Seconds_Behind_Master 是通过比较 sql_thread 执行的 event 的 timestamp 和 io_thread 复制好的 event 的 timestamp(简写为 ts)进行比较,而得到的这么一个差值。我们都知道的 relay-log 和主库的 bin-log 里面的内容完全一 样,在记录 sql 语句的同时会被记录上当时的 ts,所以比较参考的值来自于 binlog,其实主从没有必要与 NTP 进行同步,也就是说无需保证主从时钟的 一致。你也会发现,其实比较真正是发生在 io_thread 与 sql_thread 之间,而 io_thread 才真正与主库有关联,于是,问题就出来了, 当主库 I / O 负载很大或是网络阻塞,io_thread 不能及时复制 binlog(没有中断,也在复制),而 sql_thread 一直都能跟上 io_thread 的脚本,这时 Seconds_Behind_Master 的值是 0,也就是我们认为的无延时,但是,实际上不是,你懂得。这也就是为什 么大家要批判用这个参数来监控数据库是否发生延时不准的原因,但是这个值并不是总是不准,如果当 io_thread 与 master 网络很好的情况下,那么 该值也是很有价值的。(就好比:妈 ndash; 儿子 ndash; 媳妇的关系,妈与儿子亲人,媳妇和儿子也亲人,不见得媳妇与妈就很亲。开个玩笑:-)之前,提到 Seconds_Behind_Master 这个参数会有负值出现,我们已经知道该值是 io_thread 的最近跟新的 ts 与 sql_thread 执行到 的 ts 差值,前者始终是大于后者的,唯一的肯能就是某个 event 的 ts 发生了错误,比之前的小了,那么当这种情况发生时,负值出现就成为可能。
方法 2. mk-heartbeat,Maatkit*** 工具包中的一个工具,被认为可以准确判断复制延时的方法。
mk-heartbeat 的实现也是借助 timestmp 的比较实现的,它首先需要保证主从服务器必须要保持一致,通过与相同的一个 NTP server 同步时钟。它需要在主库上创建一个 heartbeat 的表,里面至少有 id 与 ts 两个字段,id 为 server_id,ts 就是当前的时间戳 now(),该结构也会被复制到从库上,表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这个周期默认为 1 秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期去比较,复制过来记录的 ts 值与主库上的同一条 ts 值,差值为 0 表示无延时,差值越大表示 延时的秒数越多。我们都知道复制是异步的 ts 不肯完全一致,所以该工具允许半秒的差距,在这之内的差异都可忽略认为无延时。这个工具就是通过实打实的复 制,巧妙的借用 timestamp 来检查延时。
感谢各位的阅读,以上就是“MySQL 主从数据库同步延迟问题怎么解决”的内容了,经过本文的学习后,相信大家对 MySQL 主从数据库同步延迟问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!