我有一个包含只读副本的 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 不会自动减少源数据库实例与其只读副本之间的高副本滞后。
解决方法
检查您的资源利用率
使用 Amazon CloudWatch 增强监控和性能详情详细检查主实例和副本实例上的资源利用率。
确认 CPU 利用率不受限制。如果您使用可突增实例类型,请确保您有可用的 CPU 积分或您已开启 Unlimited(无限制)模式。
确保有足够的 FreeableMemory,且 ReadIOPS 和 WriteIOPS 符合预置配额。如果您使用 gp2 卷,请确认您有可用的突增余额。
检查 ReadThroughput 和 WriteThroughput 是否达到实例类型配额。
**注意:**副本实例中缺少资源可能会导致副本滞后。最佳做法是创建具有相同实例类型、存储类型和 IOPS 数量的主实例和副本实例。当与主实例相比使用量最小时,您还可以纵向扩展或缩减只读副本。
确定副本滞后开始增加的时间范围,然后执行以下操作:
识别等待和死锁
检查副本实例上是否存在任何严重的锁定等待或死锁。死锁将发生在 Select 和 DDL/DML 事务之间,且会导致从主实例应用事务日志出现延迟。
要检查是否存在阻止,请运行与以下示例类似的查询:
SELECT * FROM sys.sysprocesses WHERE blocked > 0;
检查副本滞后
在主实例上运行查询以检查副本滞后和最大副本滞后。
副本滞后
运行以下查询:
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(恢复)状态。
由于处理来自主实例的日志,因此当修改主实例或副本实例上的实例类型时,可能会暂时出现副本滞后。
此外,当修改存储类型或存储大小时,副本滞后可能会暂时出现,直到存储优化完成。您无法监控存储优化的进度。
如果您仍然遇到副本滞后问题,请检查副本实例上用户数据库的状态。要重播日志,数据库状态必须为 Online(在线)。
注意:
- 仅当新创建的数据库可以在只读副本上进行访问后,Amazon RDS 才会在滞后计算中包含这些数据库。
- 当 Amazon RDS 无法确定滞后时,例如在副本设置期间或当只读副本处于错误状态时,ReplicaLag 将返回 -1。
相关信息
在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本