如何對 Amazon RDS for SQL Server 讀取複寫中的延遲進行疑難排解?
我有一個含讀取複寫的 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 數量來建立主要執行個體和複本執行個體。當讀取複寫與主要執行個體相比有高工作負載時,您也可以進一步擴展讀取複寫。
找出複寫延遲開始增加的時間範圍,然後採取以下動作:
- 檢查主要執行個體上的 WriteIOPS、WriteThroughput、NetworkReceiveThroughput 和 NetworkTrasmitThroughput 指標。判斷寫入活動是否導致延遲。然後,在讀取複寫上檢查相同時間期間內的相同指標。
- 檢查主要執行個體上是否有長時間執行的交易。若要檢查作用中交易的狀態,請執行類似以下範例的查詢:
SELECT * FROM sys.sysprocesses WHERE open_tran = 1;
識別等待和鎖死
檢查複本執行個體上是否有任何重大鎖定等待或鎖死。鎖死發生在 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。
相關資訊
相關內容
已提問 3 年前
已提問 3 年前
