如何排查我的 RDS for SQL Server 只读副本中的滞后问题?

上次更新日期:2022 年 10 月 14 日

我有一个包含只读副本的适用于 Microsoft SQL Server 的 Amazon Relational Database Service(Amazon RDS)实例。我在数据库实例中遇到以下问题之一:

  • 副本滞后突然增加。
  • 对实例的修改开始导致副本滞后。
  • 只读副本实例上的数据库不可访问。

该如何对此类问题进行故障排除?

简短描述

Amazon RDS for SQL Server 企业版支持在同一区域内创建只读副本。数据复制是异步操作,它使用 Always-On 技术将数据从主实例复制到副本实例。RDS for SQL Server 不会干预以缓解源数据库实例与其只读副本之间的高副本滞后。

解决方法

1.    使用 Amazon CloudWatch 检查主实例和副本实例上的资源利用率。使用增强监控和性能详情功能在细粒度级别检查资源使用情况。

主实例和副本实例指标的重要注意事项:

2.    最佳做法是创建具有相同实例类、存储类型和 IOPS 数量的主实例和副本实例。这样可以避免由于副本实例中资源不足而导致的副本滞后。此外,根据工作负载,如果与主实例相比使用量最小,则可以扩大或缩小只读副本。

3.    确定副本滞后开始增加的时间范围,然后执行以下操作:

根据副本滞后的开始时间,检查主实例上的 WriteIOPSWriteThroughputNetworkReceiveThroughputNetworkTrasmitThroughput 指标。确定滞后是否由写入活动所致。检查只读副本上的同一时间段内是否有相同的指标。

检查主实例上是否存在长时间运行的事务。以下是检查活动事务状态的示例查询:

SELECT * FROM sys.sysprocesses WHERE open_tran = 1;

4.    在副本实例上,检查是否存在任何显著的锁定等待或死锁。SelectDDL/DML 事务之间发生死锁,导致从主实例应用事务日志出现延迟。

以下是检查是否存在阻塞的示例查询:

SELECT * FROM sys.sysprocesses WHERE blocked > 0;

5.    查询以检查副本滞后和最大副本滞后。

副本滞后

SELECT AR.replica_server_name
     , DB_NAME (ARS.database_id) 'database_name'
     , AR.availability_mode_desc
     , ARS.synchronization_health_desc
     , ARS.last_hardened_lsn
     , ARS.last_redone_lsn
     , ARS.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states ARS
INNER JOIN sys.availability_replicas AR ON ARS.replica_id = AR.replica_id
--WHERE DB_NAME(ARS.database_id) = 'database_name'
ORDER BY AR.replica_server_name;

验证只读副本上的“last_hardened_lsn”值是否有进展。

最大副本滞后

对于 SQL Server,ReplicaLag 指标表示落后的数据库的最大滞后(以秒为单位)。例如,如果您有两个数据库分别滞后 5 秒和 10 秒,则 ReplicaLag 为 10 秒。ReplicaLag 指标返回以下查询的值。在主实例上运行查询。

select max(secondary_lag_seconds) max_lag  from sys.dm_hadr_database_replica_states;

6.    启动只读副本创建后,将从主实例拍摄快照,然后恢复以创建只读副本实例。事务日志将重播,以便将数据与主实例同步。但是,在您创建新实例后,该实例会出现延迟加载,从而导致副本滞后。这是预期行为。为了最大限度地减少延迟加载的影响,请在创建只读副本时使用 IO1 类型存储,然后根据需要将其转换回 GP2。

7.    在主实例上分批运行事务。这样做可以避免运行长事务,并使事务日志文件的大小保持最小。除非在高副本滞后期间需要,否则不要重新启动副本实例,因为这样做会进一步延迟事务日志的重播。

8.    修改主实例或副本实例上的实例类可能会导致临时副本滞后。这是预期行为,因为将处理来自主实例的日志。

在存储优化完成之前,更改存储类型或存储大小会对副本滞后产生更持久的影响。无法确定在 RDS 实例上完成的存储优化百分比。

9.    如果只读副本达到存储已满状态,则不会处理来自主实例的事务日志,并且副本滞后会增加。

如果您怀疑存储已满是由 TempDB 或临时表造成的,请重新启动副本实例以临时释放空间。

10.    如果副本滞后状态没有进展,请检查副本实例上用户数据库的状态。要重播日志,数据库状态必须为 Online(联机)。

但应注意以下几点:

  • 除非可在只读副本上进行访问,否则新创建的数据库不会包含在滞后计算中。
  • 如果 RDS 无法确定滞后,例如在副本设置期间或只读副本处于错误状态时,ReplicaLag 将返回 -1

这篇文章对您有帮助吗?


您是否需要账单或技术支持?