跳至内容

如何对我的 Amazon RDS for SQL Server 只读副本中的滞后问题进行故障排除?

2 分钟阅读
0

我有一个包含只读副本的 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 实例。我想对 Amazon RDS for SQL Server 实例中的副本滞后问题进行故障排除。

简短描述

Amazon RDS for SQL Server 企业版支持在同一 AWS 区域和跨区域创建只读副本。数据复制是异步操作,该操作使用 Always-On 技术将数据从主实例复制到副本实例。RDS for SQL Server 不会自动减少源数据库实例与其只读副本之间的高副本滞后。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

检查资源利用率

使用 Amazon CloudWatch 增强监控和性能详情详细检查主实例和副本实例上的资源利用率

确认 CPU 利用率不受限制。如果您使用可突增实例类型,请确保您有可用的 CPU 积分或您已开启 Unlimited(无限制)模式。

确保有足够的 FreeableMemory,且 ReadIOPSWriteIOPS 符合预置配额。如果您使用 gp2 卷,请确认您有可用的突增余额

检查 ReadThroughputWriteThroughput 是否达到实例类型配额

**注意:**副本实例中缺少资源可能会导致副本滞后。最佳做法是创建具有相同实例类型、存储类型和 IOPS 数量的主实例和副本实例。与主实例相比,当工作负载较高时,您还可以进一步纵向扩展只读副本。

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

  • 检查主实例上的 WriteIOPSWriteThroughputNetworkReceiveThroughputNetworkTrasmitThroughput 指标。确定写入活动是否导致了滞后。然后,在同一时间段内检查只读副本上的相同指标。
  • 检查主实例上是否存在长时间运行的事务。要检查活动事务的状态,请运行与以下示例类似的查询:
    SELECT *
    FROM sys.sysprocesses
    WHERE open_tran = 1;

识别等待和死锁

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

要检查是否存在阻止,请运行与以下示例类似的查询:

SELECT * FROM sys.sysprocesses WHERE blocked > 0;

捕获有关只读副本中死锁事件的信息,请使用跟踪标志、system_health 会话或 xml_deadlock_report 扩展事件会话来识别死锁。

检查副本滞后

在主实例上运行查询以检查副本滞后和最大副本滞后。

副本滞后

运行以下查询:

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;

**注意:**请将 database_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;

管理数据同步和实例运行状况

当创建只读副本时,Amazon RDS 会从主实例拍摄快照,然后恢复快照以创建只读副本实例。Amazon RDS 将重播事务日志,以便将数据与主实例同步。但是,在您创建新实例后,该实例会出现延迟加载,从而导致副本滞后。这是预期行为。为了减少延迟加载的影响,请在创建只读副本时使用 io1 或 io2 卷类型。创建副本后,您可以转换回 gp2 或 gp3 卷类型。

在主实例上分批运行事务以避免长事务,并使事务日志文件大小保持较小。请仅在高副本滞后期间需要时重启副本实例。否则,Amazon RDS 会延迟事务日志重播,且您的数据库可能会进入 Recovery(恢复)状态。

由于处理来自主实例的日志,因此当修改主实例或副本实例上的实例类型时,可能会暂时出现副本滞后。

此外,当修改存储类型或存储大小时,副本滞后可能会暂时出现,直到存储优化完成。您可以在 AWS 管理控制台中监控存储优化进度或使用 describe-db-instances AWS CLI 命令。

如果您仍然遇到副本滞后问题,请检查副本实例上用户数据库的状态。要重播日志,数据库状态必须为 Online(在线)。

要查看 Amazon RDS for SQL Server 只读副本中处于 RECOVERY 状态的数据库的进度,请运行以下查询:

SELECT command, percent_complete, estimated_completion_time, start_time  
FROM sys.dm_exec_requests  
WHERE command IN ('RESTORE DATABASE', 'RECOVERY', 'ROLLBACK', 'ROLLFORWARD')

注意:

  • 仅当新创建的数据库可以在只读副本上进行访问后,Amazon RDS 才会在滞后计算中包含这些数据库。
  • 当 Amazon RDS 无法确定滞后时,例如在副本设置期间或当只读副本处于 Error(错误)状态时,ReplicaLag 将返回 -1

相关信息

在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本