示例输出 B 显示主日志文件是 mysql-bin-changelog.066552。这也是主状态的文件参数,意味着IO_THREAD 与主数据库实例保持一致。在副本输出中,SQL 线程正在执行 Relay_Master_Log_File: mysql-bin-changelog.066530。这意味着 SQL_THREAD 滞后 12 个二进制日志。
通常,IO_THREAD 不会导致较高的复制延迟,因为 IO_THREAD 仅从主数据库实例读取二进制日志。但是,网络连接和网络延迟会影响服务器之间的读取速度。副本 IO_THREAD 可能会由于高带宽的使用而变慢。
如果副本 SQL_THREAD 是复制延迟的产生原因,那么这些延迟可能是由于以下原因导致的:
主数据库实例上长时间运行的查询
数据库实例类大小或存储空间不足
在主数据库实例上执行的并行查询
同步到副本数据库实例上的磁盘的二进制日志
副本上的 Binlog_format 设置为 ROW
副本创建滞后
主实例上长时间运行的查询
在主数据库实例上长时间运行的查询需要花费相同的时间在副本数据库实例上运行,这会增加 seconds_behind_master。例如,如果您在主数据库实例上启动了更改,该更改的运行时间为一个小时,那么在副本开始运行更改时,滞后时间将为一小时。由于更改可能还需要一个小时才能在副本上完成,因此在更改完成时,总滞后大约为两小时。这种延迟在预料之中,但您可以通过监控主实例上的缓慢查询日志来尽可能减少这种滞后。您还可以通过识别长时间运行的语句来减少滞后。然后,将长时间运行的语句分解为多个较小的语句或事务。有关更多信息,请参阅访问 MySQL 慢速查询日志和常规日志。
数据库实例类大小或存储空间不足
如果副本数据库实例类或存储配置小于主实例,则副本将受到限制,无法与主实例上的更改保持同步。确保副本的数据库实例类型与主数据库实例相同或级别更高。为保证复制有效运行,每个只读副本需要与源数据库实例相同数量的计算和存储资源。有关更多信息,请参阅数据库实例类。
在主数据库实例上执行的并行查询
如果您在主实例上执行并行查询,则它们将以串行顺序在副本上提交。这是因为默认情况下,MySQL 复制是单线程 (SQL_THREAD)。如果并行执行对源数据库实例的大量写入,则应使用单个 SQL_THREAD 序列化对只读副本的写入。这可能会导致源数据库实例和只读副本之间的滞后。
多线程(并行)复制适用于 MySQL 5.6、MySQL 5.7 及更高版本。有关多线程复制的更多信息,请参阅 二进制日志记录选项和变量的MySQL 文档部分。
多线程复制会导致复制中出现差距。例如,在跳过复制错误时,因为很难识别跳过了哪些事务,所以多线程复制并非最佳实践。这可能会导致主数据库实例和副本数据库实例之间的数据一致性存在差距。
同步到副本数据库实例上的磁盘的二进制日志
如果在副本上启用自动备份,则可能需要执行额外操作才能将二进制日志同步到副本上的磁盘。sync_binlog 参数的默认值设置为 1。如果将此值更改为0,则您将禁用 MySQL 服务器将二进制日志同步到磁盘的功能。操作系统 (OS) 偶尔会将二进制日志刷入磁盘,而非直接将日志记录到磁盘。
如果禁用二进制日志同步,这可以减少在每次提交时将二进制日志同步到磁盘所需的性能开销。然而,如果出现电源故障或操作系统崩溃,则某些提交可能无法同步到二进制日志。这可能会影响时间点恢复 (PITR) 功能。有关更多信息,请参阅 sync_binlog的 MySQL 文档部分。
副本上的 Binlog_format 设置为 ROW
如果将副本上的 binlog_format 设置为 ROW,并且执行更新的表缺少主键,则默认情况下,slave-rows-search-algorithms = TABLE_SCAN,INDEX_SCAN运行。此参数还会在副本上执行全表扫描。在这种情况下,短期解决方案是将搜索算法更改为 INDEX_SCAN,HASH_SCAN,以减少全表扫描的开销。对于永久解决方案,请向每个表添加显式主键。
有关 slave-rows-search-algorithms 参数的更多信息,请参阅slave-rows-search-algorithms的 MySQL 文档部分。
副本创建滞后
Amazon RDS 通过生成主实例的数据库快照来创建 MySQL 主实例的只读副本。然后,Amazon RDS 会恢复快照以创建新的数据库实例(副本)并在两者之间建立复制关系。
Amazon RDS 需要花时间来创建新的只读副本。建立复制关系后,会出现相当于创建主实例备份所需时长的滞后。要尽可能减少此滞后,请在调用副本创建之前创建手动备份。然后,副本创建过程生成的快照属于增量备份,速度更快。
从快照恢复只读副本时,副本不会等待所有数据从 Amazon Simple Storage Service (Amazon S3) 全部传输到与副本数据库实例关联的 Amazon Elastic Block Store (Amazon EBS) 卷。副本数据库实例可用于执行数据库操作,并且通过现有 Amazon EBS 快照创建的新卷会在后台加载(延迟加载)。
对于 Amazon RDS for MySQL 副本(基于 EBS 的卷),最初副本滞后可能会增加,因为加载效应可能会影响复制性能。有关更多信息,请参阅初始化 Amazon EBS 卷。
考虑启用 InnoDB 缓存预热功能,该功能可通过保存主数据库实例缓存池的当前状态,然后在还原的只读副本上重新加载缓存池来提高性能。有关 InnoDB 缓存预热的更多信息,请参阅 Amazon RDS 上的 MySQL。