本文介紹導致DTS增量遷移延遲或同步延遲過大的常見原因,以及相應的解決方案。您可以逐一排查這些原因,並根據解決方案恢複任務。
問題描述
DTS在進行增量任務時,遷移任務或同步任務出現延遲超過1000毫秒的情況。
可能原因
原因1:任務規格受限,且任務資料量過大。DTS的增量遷移或同步鏈路的各個規格有對應的RPS限制,當源庫的資料寫入量過大時(例如有大事務),達到了規格限流,就會導致任務延遲。
您可以在控制台上查看任務流量或者執行一鍵診斷功能,檢查當前鏈路是否到達相應規格的限制。查看方式,請參見監控任務效能、同步鏈路規格和遷移鏈路規格。
原因2:目標執行個體規格受限:目標庫執行個體的寫入效能已達到瓶頸。
以目標執行個體為RDS MySQL為例,您可以在RDS控制台的監控與警示頁面查看執行個體的CPU、記憶體、I/O等資源負載情況,並對照相應的執行個體規格,確認是否達到執行個體規格的限制。查看方式,請參見查看監控資訊和RDS MySQL標準版(原X86)主執行個體規格列表。
原因3:可能存在熱點更新,影響效能。無主鍵表可能會導致熱點行更新;源庫對單一表或者單一行的高頻度更新也會導致熱點更新。
以源執行個體為RDS MySQL為例,您可以通過SQL洞察和審計頁面查看源執行個體執行的事務情況,判斷是否存在熱點更新,比如事務集中在某幾張特定的表上。查看方式,請參見SQL洞察和審計。
原因4:源庫執行個體的讀取效能達到瓶頸或網路頻寬被打滿。
以源執行個體為RDS MySQL為例,您可以在RDS控制台的監控與警示頁面查看執行個體的IOPS等指標,並對照相應的執行個體規格,確認是否達到執行個體規格的限制。查看方式,請參見查看監控資訊和RDS MySQL標準版(原X86)主執行個體規格列表。
原因5:當DTS無法串連資料庫或由於其他報錯導致DTS寫入資料至目標庫發生異常時,DTS會進行多次重試,從而表現出同步延遲。此時您可以在控制台上查看任務是否處於重試中狀態,並單擊查看原因並修複,查看重試原因並進行相應修複。
比如,當目標庫執行個體為AnalyticDB for MySQL時,如源庫執行變更欄位類型的DDL操作,會導致DTS同步任務出現延遲,處於重試中狀態。這是因為目標執行個體AnalyticDB for MySQL不支援欄位類型變更,而DTS會在AnalyticDB for MySQL中多次重試DDL操作且執行失敗,從而表現出同步延遲。
原因6:目標庫帶有觸發器(trigger),會產生較大延遲。
以MySQL資料庫為例,可以使用如下命令查看是否有觸發器。
select * from information_schema.triggers where trigger_schema='<資料庫名>';原因7:在目標庫被同步的表存在既有主鍵又有唯一鍵等表結構複雜的情況下,當目標庫存在除DTS外其他業務寫入時可能會導致目標庫存在鎖表和慢SQL。
原因8:源庫存在大量DDL操作。
以源執行個體為RDS MySQL為例,您可以通過SQL洞察和審計頁面查看源執行個體中DDL的執行情況,判斷是否存在大量DDL操作。查看方式,請參見SQL洞察和審計。
原因9:遠距離傳輸導致的網路延遲。
您可以在工作清單頁面查看源庫和目標庫執行個體所屬地區。
原因10:源庫和目標庫中的表結構不一致。
原因11:控制台顯示可能有延遲。
解決方案
解法1:升級DTS增量遷移或同步的鏈路規格,提高遷移效能。更多資訊,請參見升級任務的鏈路規格。
解法2:升級目標庫的執行個體規格,提高目標庫執行個體寫入效能。
以目標庫執行個體為RDS MySQL為例,參考變更配置,升級執行個體配置。
解法3:在存在熱點行更新的情況時,等待熱點更新完畢。或者從業務上考慮盡量避免熱點更新。
解法4:提升源庫執行個體效能或升級網路頻寬。
以目標庫執行個體為RDS MySQL為例,參考變更配置,升級執行個體配置。
解法5:在控制台上查看具體的報錯內容,並進行相應修複。
本案例中,DTS在目標執行個體AnalyticDB for MySQL中多次執行DDL操作且失敗,導致DTS同步延遲,並進入重試狀態。如需恢複同步任務,建議您先將執行過DDL的表移出同步對象,待延時降0毫秒後,再刪除目標庫對應表,最後將該表重新加入同步對象。操作方式,請參見DTS同步資料常見問題和修改同步對象。
解法6:建議刪除或禁用目標庫的觸發器(trigger)。
以MySQL資料庫為例,可以使用命令
DROP TRIGGER [ IF EXISTS ] [資料庫名] <觸發器名>;刪除觸發器。說明如源庫存在觸發器,您可參考源庫存在觸發器時如何配置同步作業,來配置DTS任務。
解法7:檢查目標庫執行個體的鎖狀態、慢SQL以及表結構,然後調整目標庫寫入或者目標庫表結構來解決目標庫寫入鎖以及慢SQL問題。
本案例以MySQL資料庫為例,介紹鎖狀態和慢SQL、庫表結構的查詢方式,以及對應解決方式。
鎖狀態和慢SQL:使用命令
SHOW PROCESSLIST;查詢鎖表或者慢SQL進程,然後執行命令KILL [CONNECTION | QUERY]thread_id刪除該進程。庫表結構:使用命令
show create table <資料庫名>.<表名>;查看錶結構。以存在唯一鍵為例,請從業務上評估是否需要該唯一鍵,如不需要,則可以在目標庫執行命令alter table <資料庫名>.<表名> drop index <唯一鍵名>;進行刪除。
解法8:如DTS任務已經成功運行,則源庫應避免執行批量DDL。如必須執行DDL,請盡量在業務低峰期執行。
說明建議您在配置任務階段不勾選無需同步的DDL。
解法9:遠距離傳輸導致的網路延遲無法避免,您可以通過專線接入源庫和目標庫執行個體減少延遲。
解法10:根據實際情況調整表結構,確保源庫和目標庫的表結構保持一致。
解法11:請再觀察幾分鐘,並重新整理控制台。
更多資訊
全量任務慢的解決方案,請參見如何解決全量遷移慢或遷移卡住。