【问题标题】:Why would long running select queries cause a replication lag in MySQL slave database?为什么长时间运行选择查询会导致 MySQL 从数据库中的复制滞后?
【发布时间】:2018-07-11 11:09:56
【问题描述】:

我们有一个带有副本的 MySQL(5.7 带有基于行的复制)。

现在,主节点每秒执行大约 3000 次插入,而副本似乎读取得很好。但是,有时我们会执行长时间的选择查询(运行时间为 10 到 20 秒)。在这些查询期间,复制延迟变得非常大。

我不明白的是,执行 selects(不锁定任何表)的常用 mysql 线程如何导致复制线程变慢(即它执行大约 2.5K 插入而不是像 master 那样执行 3K)?我需要精确调整什么?

现在我检查了从属的状态,这与 IO 线程无关——这个线程可以很好地从主控读取事件。它是 SQL 从属线程,不知何故无法赶上。隔离级别是已提交读,因此选择查询可能会锁定一些记录并使从属线程等待。但我不确定。

更新。我再次检查了 - 结果表明,即使是从属服务器上的一个繁重的查询(例如扫描整个表)也会产生滞后。好像slave sql线程被阻塞了,但我不明白为什么?

更新 2。我终于找到了解决方案。首先,我将 slave_parallel_workers 的数量增加到 4 并将 slave_parallel_type 设置为 LOGICAL_CLOCK。但是,这很重要,这根本没有给我任何改进,因为交易是依赖的。但是,在我将 master binlog_group_commit_sync_delay 增加到 10000(即 10 毫秒)后,延迟消失了。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    mysql 从数据库中复制滞后的原因可能有很多。 但正如你提到的

    这是 SQL 从属线程,不知何故无法赶上。

    假设 IO 工作正常,Percona 说(强调我的):

    [...] 当从属 SQL_THREAD 是复制延迟的来源时,可能是因为来自复制流的查询在从属上执行的时间太长。这有时是因为主/从之间的不同硬件、不同的模式索引、工作负载。此外,从属 OLTP 工作负载有时会因为锁定而导致复制延迟。
    例如,如果对 MyISAM 表的长时间运行读取会阻塞 SQL 线程,或者针对 InnoDB 表的任何事务都会创建 IX 锁,并且在 SQL 线程中阻塞 DDL。另外,考虑到从服务器在 MySQL 5.6 之前是单线程的,这将是从服务器 SQL_THREAD 延迟的另一个原因

    【讨论】:

    • 感谢回复,但我自己终于找到了解决方案。查看我编辑的帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多