我有一個含讀取複寫的 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 Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
檢查您的資源使用率
使用 Amazon CloudWatch Enhanced Monitoring 和 Performance Insights,以詳細檢查主要執行個體和複本執行個體上的資源使用率。
確認 CPU 使用率未受到限流。如果您使用可高載執行個體類型,請確定您有可用的 CPU 點數,或已開啟 Unlimited (無限制) 模式。
請確定有足夠的 FreeableMemory,且 ReadIOPS 和 WriteIOPS 符合佈建的配額。如果您使用 gp2 磁碟區,請確認您有可用的高載餘額。
檢查 ReadThroughput 和 WriteThroughput 是否已達到執行個體類型配額。
**注意:**複本執行個體資源不足可能會導致複寫延遲。最佳實務是使用相同的執行個體類型、儲存體類型和 IOPS 數量來建立主要執行個體和複本執行個體。當讀取複寫與主要執行個體相比有高工作負載時,您也可以進一步擴展讀取複寫。
找出複寫延遲開始增加的時間範圍,然後採取以下動作:
識別等待和鎖死
檢查複本執行個體上是否有任何重大鎖定等待或鎖死。鎖死發生在 Select 和 DDL/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 會延遲重新執行交易日誌,且您的資料庫可能會進入復原狀態。
因為日誌會從主要執行個體處理,所以當您修改主要執行個體或複本執行個體上的執行個體類型時,可能會暫時發生複寫延遲。
此外,當您修改儲存體類型或儲存體大小時,可能會暫時發生複寫延遲,直到儲存體最佳化完成為止。您可以在 AWS 管理主控台中監控儲存體最佳化進度,或使用 describe-db-instances AWS CLI 命令。
如果您持續遇到複寫延遲,請檢查複本執行個體上使用者資料庫的狀態。若要重新執行日誌,資料庫狀態必須是線上。
若要檢視 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 無法判斷延遲時,例如在複本設定期間或讀取複寫處於錯誤狀態時,ReplicaLag 會傳回 -1。
相關資訊
在 Amazon RDS 中使用 Microsoft SQL Server 的讀取複寫