本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Aurora MySQL 的二進位日誌複寫延遲進行故障診斷
本節提供設定為二進位日誌複本之 Aurora MySQL 的二進位日誌複寫延遲指引。它涵蓋複寫架構、平行複寫、相依性追蹤、監控和組態最佳實務。
二進位日誌複寫會在 MySQL 相容資料庫之間複寫資料。本節涵蓋的二進位日誌複寫是非同步的:來源不會在遞交交易之前等待複本確認變更的套用。這不適用於半同步複寫。在半同步複寫中,來源會等待至少一個複本確認收到交易,然後再遞交。例如,適用於 Amazon RDS for MySQL 的多可用區域資料庫叢集使用半同步複寫,這超出本節的範圍。複本會透過 I/O 執行緒維持與來源的持續連線,以持續串流二進位日誌事件。本節適用於 Aurora MySQL 為複本的所有 binlog 複寫拓撲。來源可以是另一個 Aurora MySQL 叢集、Amazon RDS for MySQL、內部部署 MySQL 或 Amazon EC2 上的 MySQL。當 Aurora MySQL 是複寫至任何 MySQL 相容目標的來源時,本節也適用。
注意
對於跨區域複寫使用案例,請考慮使用 使用 Amazon Aurora 全球資料庫作為二進位日誌式複寫的替代方案。Aurora Global Database 使用專用基礎設施進行複寫,相較於跨區域的二進位日誌複寫,延遲較低且需要的操作管理更少。
現在遇到延遲峰值? 略過背景資料並以 開頭識別複寫延遲瓶頸,以判斷 I/O 執行緒或 SQL 執行緒是瓶頸,然後遵循該案例的連結: 對 I/O 執行緒延遲進行故障診斷或 針對 SQL 執行緒延遲進行故障診斷。
主題
MySQL 複寫架構
MySQL 複寫是透過特殊的執行緒實作:
-
二進位日誌傾印執行緒 (來源) – 在複本連線時建立。將二進位日誌內容傳送至複本。在 中顯示
SHOW PROCESSLIST為「Binlog Dump」執行緒。 -
複寫 I/O 執行緒 (複本) – 連線至來源並請求二進位日誌更新。將它們寫入複本的轉送日誌。無論多執行緒複寫 (MTR) 組態為何,每個複寫通道一律單一執行緒。
-
複寫 SQL 執行緒 (複本) – 讀取轉送日誌並套用交易。附加元件一律包含一個從轉送日誌讀取交易的協調器執行緒,以及套用它們的 N 個工作者執行緒,其中 N 是 的值
replica_parallel_workers。使用 時replica_parallel_workers=1,單一工作者會依序套用交易。使用replica_parallel_workers >= 2,協調器會將獨立交易指派給多個工作者執行緒以進行平行套用。注意
設定
replica_parallel_workers=0自 MySQL 8.0.30 起已棄用,且在未來 MySQL 版本中可能會移除。改用replica_parallel_workers=1做為單執行緒。
複寫程序的運作方式如下:
來源會執行 DML、DCL 或 DDL 陳述式。
遞交時,來源會將資料寫入二進位日誌。
複本上的 I/O 執行緒會擷取事件並將其寫入轉送日誌。
SQL 執行緒會從轉送日誌套用變更 (單執行緒或多執行緒)。
識別複寫延遲瓶頸
複寫延遲可能發生在兩個區域:I/O 執行緒或 SQL 執行緒。第一步是判斷哪個元件落後。
注意
中的 Seconds_Behind_Source 欄位會SHOW REPLICA STATUS測量記錄來源事件與套用 SQL 執行緒之間的延遲。此指標不會特別指出 I/O 執行緒延遲。若要識別 I/O 執行緒延遲,您必須比較二進位日誌位置,如下列步驟所述。
注意
本節中顯示的一些 MySQL 命令和內部字串,例如 SHOW MASTER STATUS,使用舊版術語。本文件全部使用偏好的術語「來源」和「複本」。
判斷哪個複寫執行緒延遲
-
在複本上,執行 /
Source_Log_FileRead_Source_Log_Pos(I/O 執行緒位置)SHOW REPLICA STATUS並將其與來源SHOW MASTER STATUS上的File/Position進行比較。如果這些差異很大 (相差 >50 MB 或 >1 個 binlog 檔案),則 I/O 執行緒會延遲。 -
比較 I/O 執行緒位置與 SQL 執行緒位置 (
Relay_Source_Log_File/Exec_Source_Log_Pos)。如果 I/O 執行緒趕上,但 SQL 執行緒落後 (相隔 >50 MB),SQL 執行緒就是瓶頸。
使用僅限複本資料進行快速初始評估
您可以僅使用複本端資料執行初始評估。執行SHOW REPLICA STATUS兩次,相隔 1-2 分鐘,並遵循下列事項:
如果
Read_Source_Log_Pos正在提升Exec_Source_Log_Pos,但停滯或提升速度較慢,SQL 執行緒就是瓶頸 (案例 B)。繼續執行「針對 SQL 執行緒延遲進行故障診斷」。如果
Read_Source_Log_Pos和Exec_Source_Log_Pos都在Seconds_Behind_Source成長時停止,則 I/O 執行緒可能會落後。進行組態變更之前,請先使用 比較複本位置與來源SHOW MASTER STATUS,如先前程序的步驟 1 所述。
| 案例 | I/O 執行緒與來源 | SQL 執行緒與 I/O 執行緒 | 瓶頸 |
|---|---|---|---|
| A | 遠落後 (>50 MB) | 關閉 (<10 MB) | I/O 執行緒 |
| B | 關閉 (<10 MB) | 遠落後 (>50 MB) | SQL 執行緒 |
| C | 遠落後 | 遠落後 | 兩者 (以 I/O 開頭) |
範例解譯二進位日誌位置
下列範例顯示如何比較二進位日誌位置以判斷瓶頸。
在複本上, SHOW REPLICA STATUS 會傳回:
Source_Log_File: mysql-bin.000045 Read_Source_Log_Pos: 524288000 Relay_Source_Log_File: mysql-bin.000045 Exec_Source_Log_Pos: 524200000
在來源上, SHOW MASTER STATUS會傳回:
File: mysql-bin.000045 Position: 1073741824
若要判斷 I/O 執行緒延遲,請從來源位置減去 I/O 執行緒位置:
(1073741824 − 524288000) / 1048576 = 524 MB – I/O 執行緒遠遠落後於來源 (案例 A)。
若要判斷 SQL 執行緒延遲,請從 I/O 執行緒位置減去 SQL 執行緒位置:
(524288000 − 524200000) / 1048576 = 0.08 MB – SQL 執行緒與 I/O 執行緒保持同步。
在此情況下,請將疑難排解重點放在 I/O 執行緒上。如需詳細資訊,請參閱對 I/O 執行緒延遲進行故障診斷。
複寫延遲峰值的剖析
常見的模式是 突然遽增,Seconds_Behind_Source然後快速返回接近零。當來源上長時間執行的 DML (例如 UPDATE 掃描數百萬個資料列,但只修改幾分鐘) 需要幾分鐘才能執行時,就會發生這種情況。透過以 ROW 為基礎的二進位記錄,只有修改的資料列會寫入二進位日誌。當 SQL 執行緒取得此事件時,它會根據來源上的交易開始時間來計算延遲。這會產生較大的初始值。不過,因為只需要套用幾列,所以複本會快速趕上進度。這是預期的行為,並不表示持續的複寫問題。
對 I/O 執行緒延遲進行故障診斷
I/O 執行緒負責從來源擷取二進位日誌事件,並將其寫入轉送日誌。常見原因和解決方案:
| 原因 | 如何識別 | Resolution |
|---|---|---|
| 網路頻寬限制 | 檢查 CloudWatch NetworkReceiveThroughput / NetworkTransmitThroughput |
使用具有較高網路容量的執行個體;確保來源和複本上的類似執行個體類別 |
| 網路延遲 (跨區域或內部部署) | 來源和複本之間的地理距離;高往返時間 | 對於內部部署來源,請使用 進行專用、低延遲的連線 |
| 來源的資源限制條件 | 高 CPU (CPUUtilization)、記憶體壓力 (FreeableMemory) |
擴展來源執行個體。每個連線複本都會在來源上建立 binlog 傾印執行緒 – 如果來源受到資源限制,則減少連線複本的數量。 |
| 具有 BLOB/TEXT 資料的大型交易 | 透過 SumBinaryLogSize CloudWatch 指標監控二進位日誌事件大小 |
設定 binlog_row_image=noblob;啟用二進位日誌交易壓縮 (binlog_transaction_compression=ON)。先在非生產環境中測試 – 壓縮會增加來源和複本的 CPU 使用率。 |
| 已達到轉送日誌空間限制 | Replica_IO_State 顯示「等待複本 SQL 執行緒釋放足夠的轉送日誌空間」 |
這表示 SQL 執行緒是根本原因,而不是 I/O 執行緒。先定址 SQL 執行緒延遲。在 Aurora MySQL 中,預設值relay_log_space_limit約為 953 MiB。當 SQL 執行緒無法快速套用變更時,此訊息是正常操作的一部分。此訊息不一定表示 I/O 執行緒效能問題。 |
I/O 執行緒延遲的最佳化策略
-
至少使用與來源相同的執行個體類別 – 此方法提供足夠的 CPU、記憶體、I/O 容量和網路頻寬。
-
確保有足夠的網路頻寬 – 使用具有高網路容量的執行個體。對於內部部署來源,請考慮專用頻寬和更一致的網路體驗。
-
檢查來源端資源,特別是使用許多複本 – 監控來源的 CPU、記憶體、網路和 Binlog I/O。 每個連接的複本都會在來源上新增 binlog 傾印執行緒,因此提供許多複本的來源本身可能會成為瓶頸。建議您在擴展複本之前確認來源未飽和。如果來源受到資源限制,請考慮減少連線複本的數量。
-
驗證 Aurora binlog I/O 快取是否作用中 – binlog I/O 快取可減少來源上的磁碟 I/O,以提供二進位日誌事件。它會在 Aurora MySQL 2.10 版及更高版本中自動啟用 – 不需要設定。如果來源是 Aurora 叢集,請確認快取正在與 搭配使用
SHOW GLOBAL STATUS LIKE 'aurora_binlog_io_cache%'。如需詳細資訊,請參閱最佳化 binlog 複寫。 -
啟用二進位日誌交易壓縮 – 在參數群組
binlog_transaction_compression=ON中設定 。減少頻寬需求。此設定具有下列考量:壓縮會增加來源和複本上的 CPU 使用率。
首先在非生產環境中進行測試,以找出壓縮和資源使用率之間的最佳平衡。
或者,使用 調整壓縮層級
binlog_transaction_compression_level_zstd(預設值:3,範圍:1–22)。
-
將二進位日誌的寫入降到最低 – 設定
binlog_row_image=noblob以消除二進位日誌中的 BLOB/TEXT 資料。如果複本具有參考 BLOB 資料欄的觸發條件,請勿使用 。如需詳細資訊,請參閱 MySQL 網站上的 binlog_row_image。 -
在來源上實作複寫篩選條件 – 使用
binlog-do-db或binlog-ignore-db排除不必要的資料庫。這些是需要重新啟動的靜態參數。重要
來源端篩選條件完全影響寫入二進位日誌的內容。排除的資料庫不會複寫到任何下游複本。如果來源是自我管理的 MySQL 執行個體 (內部部署或 Amazon EC2),則排除的資料庫也不適用於二進位日誌型point-in-time復原。Amazon RDS for MySQL 不支援來源端 Binlog 篩選 (
binlog-do-db/binlog-ignore-db不可設定);請改用複本端複寫篩選條件。Aurora 會將叢集磁碟區用於 PITR,且不受二進位日誌篩選條件影響以進行備份。
針對 SQL 執行緒延遲進行故障診斷
SQL 執行緒是 I/O 執行緒趕上來源但Seconds_Behind_Source正在成長時的瓶頸。若要量化延遲,請監控 15 分鐘的時段。比較來源 (來自 Position 的差異SHOW MASTER STATUS) 的 binlog 產生率與複本 (差異) 上的 SQL Exec_Source_Log_Pos 執行緒套用率。
常見原因和解決方案:
| 原因 | 如何識別 | Resolution |
|---|---|---|
| 單執行緒複寫 | SELECT @@global.replica_parallel_workers; 傳回 0 或 1 |
使用 WRITESET 相依性追蹤來啟用多執行緒複寫 (MTR)。如果時鐘衝突很高,僅 MTR 不會解決延遲。如需調校相依性追蹤,請參閱 ;來源上的相依性追蹤如需識別時鐘衝突錯誤日誌多執行緒複本統計資料,請參閱 。 |
| 缺少主索引鍵 | 如果沒有主索引鍵 (或使用 NOT NULL 的唯一索引鍵),複本會針對 UPDATE 和 DELETE 操作中的每個修改資料列執行完整資料表掃描。使用下列查詢來識別沒有主索引鍵的資料表:
|
將主索引鍵新增至所有複寫的資料表。如果無法立即新增明確的主金鑰,請考慮將 sql_generate_invisible_primary_key 參數設定為 (在基於 MySQL 8.0.30 和更新版本的 Aurora MySQL 3 版本中可用),以啟用產生不可見的主金鑰 ON(GIPK)。如需產生不可見主要金鑰的詳細資訊,請參閱 MySQL 網站上的產生不可見主要金鑰 |
| 來源上的大型寫入交易 | 修改許多資料列 (例如大量 UPDATE 或 DELETE) 的交易會複寫為單一單位,無論 MTR 組態為何,只能套用一個工作者執行緒。在來源上,使用下列項目識別作用中的長期執行寫入交易:在複本上,一名工作者在 中的相同陳述式上保持忙碌, SHOW PROCESSLIST而其他工作者則閒置。長時間執行的閒置交易或等待來源鎖定的交易本身不會導致複寫延遲 – 只有遞交的寫入磁碟區才重要,因為事件會在遞交時到達二進位日誌。 |
將大量操作分成較小的交易 (例如,每次遞交幾千列),讓複本可以平行套用。如需運作範例,請參閱 範例 4:單一大型交易無法平行化。 |
| DDL 操作 | DDL 會封鎖其他複寫事件 | 使用線上結構描述變更工具,或使用藍/綠部署。在低流量期間排程 DDL。對於 pt-online-schema-change,請參閱 Percona 網站上的 Percona Toolkitgh-ost,請參閱 GitHub 網站上的 gh-ost |
| 次佳的平行複寫組態 | 工作者使用率低;協調器統計資料中有高時鐘衝突。檢查多執行緒複本統計資料錯誤日誌項目中的「等待時鐘衝突」欄位 (請參閱 錯誤日誌多執行緒複本統計資料)。相對於「經過秒」的高值表示交易經常被相依性封鎖。 | 調校相依性追蹤 (WRITESET) 和工作者計數 |
| 來自分析工作負載的資源爭用 | 與 SQL 執行緒競爭資源的複雜 OLAP 查詢 (CPU、記憶體) | 將分析工作負載分隔為專用複本 |
| 過期的資料表統計資料 | 複本上的次佳查詢計畫。使用以下查詢來識別具有過時統計資料的資料表 (超過 7 天):
|
在具有過時統計資料的資料表上ANALYZE TABLE定期執行 |
使用複本端複寫篩選條件減少套用工作負載
Aurora MySQL 3.01.0 版及更高版本支援複本端複寫篩選條件。使用這些項目在套用期間略過不相關的資料庫或資料表,以減少 SQL 執行緒工作負載。SQL 執行緒會套用複本端篩選條件 – I/O 執行緒仍會從來源擷取所有二進位日誌事件,因此這些篩選條件只會減少套用工作,而非網路傳輸。與來源端篩選條件 (僅在資料庫層級操作) 不同,複本端篩選條件支援使用 replicate-do-table和 的資料表層級精細程度replicate-ignore-table。如需詳細資訊,請參閱使用 Aurora MySQL 設定複寫篩選條件。
多執行緒複寫 (MTR)
使用 MTR 時,複本會平行套用獨立交易。它無法將單一大型交易分割為平行部分。平行處理的程度受限於來源寫入的相依性資訊。
啟用 MTR 時 (replica_parallel_workers >= 2),SQL 附加器會分割為協調器執行緒和多個工作者執行緒。協調器會從轉送日誌讀取交易。它會檢查來源內嵌在每個交易中的邏輯時間戳記 (last_committed 和 sequence_number)。然後,它會將獨立交易指派給可用的工作者執行緒,以進行平行執行。如果兩個交易不共用資料相依性,則兩個交易是獨立的,也就是說,如果它們修改不同的資料列。來源會使用設定的相依性追蹤方法,在遞交時間決定這些相依性,並將其記錄在二進位日誌中。複本無法增加超過來源允許的平行處理。
MTR 是建議的預設值
我們建議在啟用 MTR 的情況下執行複本。MTR 預設會在 MySQL 8.0.27 及更高版本中啟用 (replica_parallel_workers=4),包括基於這些版本的 Aurora MySQL 3 版本。在舊版 (Aurora MySQL 2.12.1 及更高版本,或 8.0.27 之前以 MySQL 版本為基礎的版本) 上,透過replica_parallel_workers將 設定為 2 或更高的值來明確啟用它。當平行處理無法使用時,保持啟用 MTR 的成本很少,並讓複本在工作負載允許時利用它。
在下列情況下,MTR 不會減少延遲:
瓶頸是 I/O 執行緒 (網路/頻寬問題)。
延遲是由單一長時間執行的交易所造成。
複本是 CPU 飽和 (執行緒越多,情況越差)。
資料表缺少主索引鍵 (強制完整資料表掃描、否定平行處理)。
來源上的相依性追蹤
來源決定哪些交易可以使用 binlog_transaction_dependency_tracking 參數平行套用。建議值:WRITESET。
-
COMMIT_ORDER – 根據遞交時間追蹤相依性。最適合用於高並行和大型群組遞交。低並行環境中的有限平行處理。
-
WRITESET (建議) – 追蹤實際的資料列層級資料相依性。效能永遠至少與 COMMIT_ORDER 一樣好。大幅改善低並行工作負載。需要資料表具有主索引鍵。
在下列情況下,WRITESET 相依性追蹤會產生空白或部分寫入集 (限制平行處理):
沒有主索引鍵或唯一索引鍵的資料表
DDL 陳述式 (CREATE TABLE、ALTER TABLE 等)
修改外部金鑰關係中父資料表的交易
此外,當二進位日誌輪換或達到
binlog_transaction_dependency_history_size限制時,會清除相依性歷史記錄,暫時減少平行處理。 -
WRITESET_SESSION – 與 WRITESET 相同,具有來自相同工作階段的交易無法平行化的額外限制。
注意
MySQL 8.4 已移除binlog_transaction_dependency_tracking並預設為 WRITESET (無法設定)。舊版預設為 COMMIT_ORDER。
平行類型 (replica_parallel_type)
replica_parallel_type 參數決定如何在工作者執行緒之間分配交易。您有兩個選項:
-
LOGICAL_CLOCK (建議) – 使用邏輯時間戳記來判斷哪些交易可以平行執行,即使在相同的資料庫中也是如此。此方法可為大多數工作負載帶來更高的複寫輸送量和更低的延遲。除非您有特定的多資料庫工作負載無法從中受益,否則請使用它。
-
DATABASE – 根據工作者執行緒受影響的資料庫,將交易指派給工作者執行緒。只有當您的應用程式使用具有明確分隔工作負載和交易的多個資料庫時,才需要考慮。使用 DATABASE 時,不會使用來源上的
binlog_transaction_dependency_tracking設定 – 平行處理僅取決於交易目標的資料庫。
注意
在 MySQL 8.0.26 版和更早版本中, replica_parallel_type預設為 DATABASE。從 MySQL 8.0.27 之後,它預設為 LOGICAL_CLOCK。如果您使用的是較舊的版本,請明確將此參數設定為 LOGICAL_CLOCK,以利用更精細的相依性追蹤。
MTR 組態
| 參數 | 建議值 | 備註 |
|---|---|---|
binlog_transaction_dependency_tracking |
WRITESET | 叢集參數群組。動態。MySQL 8.4 不需要。 |
binlog_transaction_dependency_history_size |
25000 (預設) | 叢集參數群組。動態。控制來源為 WRITESET 相依性追蹤保留多少資料列雜湊;當歷史記錄填滿或二進位日誌輪換時,它會清除並暫時捨棄平行處理。如果複本顯示與二進位日誌輪換相符的「等待時鐘衝突」錯誤日誌統計資料 (請參閱 ) 中的週期性峰值,請考慮將寫入密集來源上的值 (例如,增加到 50000錯誤日誌多執行緒複本統計資料) 加倍。較大的值會在來源上耗用更多記憶體。 |
binlog_format |
ROW | 叢集參數群組。靜態 (需要重新開機)。 |
binlog_group_commit_sync_delay |
0 (預設) | 延遲群組遞交的微秒數。增加此值會將更多交易分組在一起,以來源稍微增加遞交延遲的成本改善複本上的平行處理。只有在使用 COMMIT_ORDER 相依性追蹤時才有用 – WRITESET 已追蹤實際的資料列層級相依性,無論遞交時間為何。動態。 |
binlog_group_commit_sync_no_delay_count |
0 (預設) | 遞交之前要等待的交易數量上限。搭配 使用binlog_group_commit_sync_delay,在批次處理足夠的交易後限制延遲。僅與 COMMIT_ORDER 相依性追蹤相關。動態。 |
| 參數 | 建議值 | 備註 |
|---|---|---|
replica_parallel_workers |
從 vCPU 計數開始,最高為 vCPU 計數的兩倍 | 執行個體參數群組。動態,但需要重新啟動複寫。社群預設為 4,截至 MySQL 8.0.27 (以及基於它的 Aurora MySQL 3 版本);舊版預設為 0,自 MySQL 8.0.30 起已棄用。我們建議從 vCPU 計數開始,然後監控 CPU 使用率和「工作者佔用時的等待 (計數)」錯誤日誌統計資料 (請參閱 錯誤日誌多執行緒複本統計資料)。只有在「工作者佔用時等待 (計數)」持續很高且 CPU 使用率仍低於 80% 時才增加。 |
replica_parallel_type |
LOGICAL_CLOCK | 叢集參數群組。動態,但需要重新啟動複寫。 |
replica_pending_jobs_size_max |
>= 來源max_allowed_packet上的 |
執行個體參數群組。動態。 |
replica_preserve_commit_order |
ON | 叢集參數群組。動態,但需要重新啟動複寫。 |
binlog_format |
OFF | 叢集參數群組。靜態。停用二進位記錄的 Aurora 特定延伸模組。 |
變更平行工作者設定後,重新啟動複寫:
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
Aurora 特定的複寫最佳化
Aurora MySQL 提供下列功能來改善二進位日誌複寫效能。下表摘要說明可用性、預設狀態,以及如何啟用每個功能。
| 功能 | 版本 | 預設 | 如何啟用/驗證 |
|---|---|---|---|
| 記憶體內轉送日誌 | Aurora MySQL 3.10+ | ON (適用於符合條件時的 Aurora 受管複寫) | 當複本使用單執行緒複寫 (replica_parallel_workers=0)、啟用 GTID 模式和自動定位的多執行緒複寫,或啟用 檔案式複寫時,自動啟用 Aurora 受管複寫 (藍色/綠色部署、Aurora-to-Aurora 和跨區域複本)replica_preserve_commit_order=ON。由動態aurora_in_memory_relaylog參數 (資料庫叢集或執行個體層級) 控制:停止複寫、將其設定為 參數群組OFF中的 ON或 ,然後重新啟動複寫 – 不需要重新啟動執行個體。不適用於 Aurora Serverless。使用 驗證目前狀態SHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_status'。如需詳細資訊,請參閱記憶體中轉送日誌。 |
| 平行次要索引變更 | Aurora MySQL 3.06+ | OFF (0) |
aurora_binlog_replication_sec_index_parallel_workers 設定為所需的執行緒計數。停止複寫,設定 參數,然後開始複寫。不需要重新啟動執行個體。如需詳細資訊,請參閱多執行緒二進位日誌複寫。 |
| Binlog I/O 快取 | Aurora MySQL 2.10+ 和 3.x | ON (自動) | 自動啟用。將二進位日誌事件提供給複本時,減少來源上的磁碟 I/O。不需要組態。如需詳細資訊,請參閱最佳化 binlog 複寫。 |
監控平行複寫
使用下列方法來監控複寫效能,並平行識別瓶頸:
效能結構描述
用於監控 MTR 的關鍵資料表:
performance_schema.replication_applier_status_by_worker– 顯示每個工作者執行緒處理的交易詳細資訊,包括套用時間戳記和錯誤。performance_schema.replication_applier_status_by_coordinator– 顯示協調器執行緒緩衝活動的相關資訊。
若要評估跨工作者執行緒平均工作的方式,請使用下列查詢:
SELECT a.channel_name, rw1.thread_id AS replica_worker_thread_id, ts1.count_star AS number_of_trx_executed, ROUND((ts1.count_star / sum_count_star) * 100, 2) AS percent_of_trx_executed_by_worker FROM ( SELECT rw.channel_name, SUM(ts.count_star) AS sum_count_star FROM performance_schema.events_transactions_summary_by_thread_by_event_name AS ts JOIN performance_schema.replication_applier_status_by_worker AS rw ON ts.thread_id = rw.thread_id GROUP BY rw.channel_name ) AS a JOIN performance_schema.replication_applier_status_by_worker AS rw1 ON a.channel_name = rw1.channel_name JOIN performance_schema.events_transactions_summary_by_thread_by_event_name AS ts1 ON rw1.thread_id = ts1.thread_id;
如果一或兩個工作者處理大多數交易,則表示高交易相依性限制平行處理。考慮切換到來源上的 WRITESET 相依性追蹤。
如果 I/O 執行緒和 SQL 執行緒位置彼此靠近,但仍Seconds_Behind_Source在成長中,協調器執行緒本身可能是瓶頸。檢查performance_schema.replication_applier_status_by_coordinator緩衝延遲。協調器瓶頸通常表示繁重的交易相依性或多載的單一協調器執行緒,無法以足夠快的速度分佈事件。
錯誤日誌多執行緒複本統計資料
當 log_error_verbosity=3(預設值) 時,Aurora MySQL 會定期將多執行緒複本統計資料寫入 MySQL 錯誤日誌。您可以透過下列方式檢視這些項目:
在 RDS 主控台的日誌和事件區段中,檢視錯誤日誌。
透過 AWS CLI 下載:
aws rds download-db-log-file-portion --db-instance-identifier <instance-id> --log-file-name error/mysql-error-running.log如果針對錯誤日誌啟用 CloudWatch Logs 匯出,請在匯出的日誌群組中搜尋。
若要在錯誤日誌中找到多執行緒複本統計資料項目,請搜尋下列範例中顯示的字串。MySQL 錯誤日誌在此內部字串中使用舊版術語;本文件在整個字串中使用偏好的術語「複本」。
以下是錯誤日誌項目範例:
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 7215200; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1203644200 waited (count) when Workers occupied = 1022462 waited when Workers occupied = 62349203500
要分析的關鍵欄位:
| 欄位 | 說明 | Action |
|---|---|---|
| 經過的秒數 | 自上次統計資料輸出以來的時間,以秒為單位。Aurora MySQL 不會定期寫入統計資料 – 它會根據執行的事件數加上經過的時間來寫入統計資料。 | 使用 計算輸送量:指派的事件/經過的秒數 = 每個間隔的平均事件數。 |
| 指派的事件 | 自上次輸出後,協調器執行緒指派給工作者執行緒的事件數目。 | 監控複寫輸送量隨時間的變化。 |
| 已填入超支層級的工作者佇列 | 佇列至工作者執行緒的事件數量超過溢位層級 (佇列長度上限的 90% 為 16384 個事件)。如果為零,表示沒有工作者以容量上限操作。 | 表示工作者無法跟上協調器的進度。檢查是否有長時間執行的交易或遺失的索引。 |
| 由於工作者佇列已滿而等待 | 由於工作者執行緒佇列已滿 (達到 100% 容量),協調器必須等待的次數。 | 檢查工作者執行緒上是否有長時間執行的交易、缺少索引或鎖定爭用。 |
| 由於總大小而等待 | 協調器因為達到replica_pending_jobs_size_max限制而等待的次數。如果異常大型事件超過此大小,則會保留交易,直到所有工作者都有空的佇列。 |
增加 replica_pending_jobs_size_max。檢查來源上是否有大型交易。 |
| 在時鐘發生衝突時等待 | 由於交易相依於另一個尚未遞交的交易,協調器等待的奈秒數。這會量化因為相依性而無法指派時間事件。 | 切換至來源上的 WRITESET 相依性追蹤。確保資料表具有主索引鍵。有些時鐘衝突預期會等待 - 專注於降低相對於其他等待的比率。 |
| 工作者佔用時的等待 (計數) | 協調器指派交易的第一個事件所需的次數,但所有工作者佇列都是非空的。協調器會休眠,直到佇列變成空。 | 這表示佈建replica_parallel_workers不足。相依性不是瓶頸 – 您可以平行執行更多事件,但缺少可用的工作者執行緒。增加 replica_parallel_workers。 |
| 工作者佔用時等待 | 等待空的工作者佇列時,協調器休眠的總奈秒數。 | 高值確認工作者容量是瓶頸。增加 replica_parallel_workers。 |
工作範例:診斷平行套用瓶頸
下列範例示範如何使用上述監控來源來診斷常見的平行套用瓶頸。每個範例都從相同的徵狀開始 – Seconds_Behind_Source 正在穩定成長,而且您已經確認 SQL 執行緒是瓶頸 (請參閱識別複寫延遲瓶頸) – 並使用多執行緒複本統計資料和效能結構描述來判斷修正動作。
範例 1:工作者佈建不足
在 CloudWatch ReplicaLag 中,指標會在 30 分鐘內穩定地從接近零爬升到大約 400 秒。複本上的 CPU 使用率維持在 55% 左右,因此複本不受 CPU 限制。
若要確認延遲的位置,請執行SHOW REPLICA STATUS兩次,相隔 60 秒。 會Read_Source_Log_Pos前進大約 1.2 GB,而 只會Exec_Source_Log_Pos前進大約 300 MB。I/O 執行緒與來源保持同步,但 SQL 執行緒落後 – SQL 執行緒是瓶頸。
MTR 已啟用 replica_parallel_workers=4。從錯誤日誌擷取最新的多執行緒複本統計資料 (請參閱 錯誤日誌多執行緒複本統計資料):
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 123; events assigned = 9876544; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 8455000 waited (count) when Workers occupied = 2456789 waited when Workers occupied = 110293847000
解譯關鍵欄位:
當工作者佔用 = 110293847000 奈秒或大約 110 秒時等待。在此間隔的 123 秒中,協調器花費大約 90% 的時間等待工作者執行緒變成免費。
在時鐘衝突時等待 = 8455000 奈秒,或大約 0.008 秒,這可忽略。交易相依性不是限制因素。
診斷:協調器持續準備套用比工作者執行更多的獨立交易。由於時鐘衝突等待可忽略,因此平行處理受限於工作者計數,而非依相依性而定。
動作:增加replica_parallel_workers複本的 vCPU 計數 (例如 上的 16db.r6g.4xlarge) 並重新啟動複寫:
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
驗證:稍後的統計資料行顯示等待幾乎消失,並在 5 秒內ReplicaLag返回 :
2026-05-10 15:02:14.882201 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 31840552; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 9120000 waited (count) when Workers occupied = 41233 waited when Workers occupied = 5980411000
「工作者佔用時等待」從大約 110 秒下降到大約 6 秒,輸送量 (指派的事件) 超過三倍。當 CPU 使用率接近 80% 或等待停止減少時,停止增加工作者。
範例 2:COMMIT_ORDER 相依性追蹤序列化低並行工作負載
來源是執行 OLTP 工作負載並行遞交應用程式執行緒的 Amazon RDS for MySQL 執行個體。複本是db.r6g.4xlarge具有 replica_parallel_workers=16和 的 replica_parallel_type=LOGICAL_CLOCK。儘管有 16 名工作者, ReplicaLag仍維持穩定約 600 秒,而複本 CPU 使用率只有約 20% – 工作者看起來閒置。
首先,使用來自 的工作者分佈查詢,檢查交易在工作者之間分佈的均勻程度效能結構描述:
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 1903556 | 96.41 | | | 46 | 23104 | 1.17 | | | 47 | 18995 | 0.96 | | | 48 | 16720 | 0.85 | . . +--------------+--------------------------+------------------------+-----------------------------------+
上述輸出顯示 16 個工作者執行緒的前 4 個。一名工作者正在套用超過 96% 的交易,而其他 15 人幾乎閒置 (每個剩餘的工作者都執行不到 0.05%)。套用實際上是序列化的。
接著,使用錯誤日誌中的多執行緒複本統計資料進行確認:
2026-05-10 15:22:11.110432 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 2014500; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 98712340000 waited (count) when Workers occupied = 50122 waited when Workers occupied = 1209847000
在時鐘衝突時等待 = 98712340000 奈秒,或大約 120 秒的 99 秒。協調器花費了大約 82% 的間隔,無法分派下一個交易,因為它取決於仍在套用的交易。
當工作者佔用 = 1209847000 奈秒或大約 1.2 秒時等待。工作者幾乎總是免費的,因此更多工作者沒有幫助。
這表示相依性問題,而不是容量問題。檢查來源上的相依性追蹤方法:
SELECT @@global.binlog_transaction_dependency_tracking;
+-------------------------------------------------+ | @@global.binlog_transaction_dependency_tracking | +-------------------------------------------------+ | COMMIT_ORDER | +-------------------------------------------------+
根本原因:透過 COMMIT_ORDER,來源會根據同一二進位日誌群組遞交中一起遞交的交易,決定哪些交易可以平行執行。在此低並行工作負載中,一次只有少數執行緒遞交,因此群組遞交很小。因此,來源會以等於先前交易的 last_committed的值對幾乎每筆交易加上戳記sequence_number,並將它標記為與之前的交易相依。然後,複本必須逐一套用它們,即使它們修改了完全不相關的資料列,這就是 16 名工作者中有 15 名處於閒置狀態的原因。
動作:將來源切換到資料列層級相依性追蹤,這與遞交時間無關。以動態方式設定,並將其保留在叢集 (或資料庫) 參數群組中:
SET GLOBAL binlog_transaction_dependency_tracking = WRITESET;
WRITESET 會計算每個交易修改的資料列雜湊,因此接觸不同資料列的交易會收到獨立的時間戳記,無論交易何時遞交,都可以平行套用。確保所有資料表都有主索引鍵,因為 WRITESET 會為沒有它們的資料表產生空的寫入集 (請參閱 針對 SQL 執行緒延遲進行故障診斷)。在 MySQL 8.4 上,WRITESET 是預設值,此參數不再存在。
驗證:變更後,工作者分佈查詢會顯示平均分散到所有工作者的工作 (顯示前 4/16;每個工作者現在處理大約 6% 的交易):
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 132540 | 6.30 | | | 46 | 125610 | 5.97 | | | 47 | 129774 | 6.17 | | | 48 | 122901 | 5.84 | . . +--------------+--------------------------+------------------------+-----------------------------------+
和 錯誤日誌統計資料顯示當 ReplicaLag降至接近零時,時鐘衝突會摺疊:
2026-05-10 15:41:55.204713 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 19874100; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 412300000 waited (count) when Workers occupied = 88122 waited when Workers occupied = 7019847000
「等待時間衝突」從大約 99 秒下降到大約 0.4 秒,輸送量增加大約十倍,瓶頸從相依性轉移到工作者容量,此時您可以調整工作者計數,如範例 1 所示。
範例 3:缺少的主索引鍵強制在複本上掃描完整資料表
ReplicaLag 在執行大型 UPDATE和 DELETE陳述式的夜間批次任務期間尖峰,之後會復原。在尖峰期間,複本 CPU 是中等的,但有一個工作者似乎卡住。
在複本上,執行SHOW PROCESSLIST並查看複寫工作者執行緒。同一陳述式上的一個工作者一次會保持 Updating 狀態數秒:
+----+-------------+------+---------+----------+------+ | Id | User | db | Command | State | Time | +----+-------------+------+---------+----------+------+ | 12 | system user | app | Connect | Updating | 38 | +----+-------------+------+---------+----------+------+
使用來自 的偵測查詢,檢查哪些複寫資料表缺少主索引鍵針對 SQL 執行緒延遲進行故障診斷:
+--------------+----------------+ | table_schema | table_name | +--------------+----------------+ | app | events_archive | +--------------+----------------+
根本原因:使用以 ROW 為基礎的二進位記錄, UPDATE或 DELETE事件中的每一列都必須位於複本上,才能套用。如果資料表沒有主索引鍵或唯一的 NOT NULL 索引鍵,複本會為每個受影響的資料列執行完整資料表掃描。在multi-million-row的資料表上,批次操作會變成數百萬個完整掃描,而套用它的工作者會停滯 – 封鎖套用進度並增加延遲。
動作:將主索引鍵新增至資料表。如果您無法立即定義明確金鑰,請將 sql_generate_invisible_primary_key 參數設定為 (在基於 MySQL 8.0.30 和更新版本的 Aurora MySQL 3 版本中ON可用) 以啟用產生不可見的主金鑰 (GIPK),讓新資料表接收自動主金鑰 (請參閱 針對 SQL 執行緒延遲進行故障診斷)。
驗證:新增主索引鍵後,工作者不再停留在 中Updating,SQL 執行緒會套用速率復原,並在下一個批次時段ReplicaLag返回基準。
範例 4:單一大型交易無法平行化
ReplicaLag 每天在可預測的時間急劇跳躍,保留幾分鐘,然後降回接近零。WRITESET 相依性追蹤已啟用, replica_parallel_workers=16和所有資料表都有主索引鍵,因此先前的範例不適用。
在尖峰期間,工作者分佈查詢會顯示一個工作者忙碌和閒置,但與範例 2 不同,錯誤日誌不會顯示高時鐘衝突或工作者佔用的等待:
2026-05-10 02:13:40.551922 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 95; events assigned = 4120000; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1530000 waited (count) when Workers occupied = 980 waited when Workers occupied = 210440000
相依性等待和工作者佔用的等待都很低,但只有一個工作者處於作用中狀態。這可排除相依性瓶頸 (範例 2) 和工作者容量瓶頸 (範例 1)。
檢查 中的忙碌工作者performance_schema.replication_applier_status_by_worker,或執行 SHOW PROCESSLIST。單一工作者在整個尖峰期間套用一筆交易。在來源上,應用程式任務會執行一個大型陳述式,例如DELETE FROM orders WHERE created_at < '2025-01-01'影響數百萬個資料列,做為單一交易。
根本原因:MTR 跨獨立交易平行化;無法跨工作者分割單一交易。一個大型交易只由一個工作者套用,因此新增工作者、切換到 WRITESET 或新增主索引鍵沒有幫助。如需詳細資訊,請參閱多執行緒複寫 (MTR)。
動作:將大型操作在來源上分成較小的批次 (例如,每個交易刪除幾千列的區塊,並在批次之間短暫暫停)。較小的交易會獨立遞交,因此複本可以將它們分散到工作者。盡可能在低流量時段期間排程大量任務。
驗證:在批次處理任務後,每日ReplicaLag尖峰會扁平化,而工作者分佈查詢會顯示批次分散到多個工作者,而不是一個。
監控最佳實務
在具有適當閾值的
ReplicaLag指標上設定 CloudWatch 警示。使用活動訊號表進行比 更準確的延遲測量
Seconds_Behind_Source。例如,使用pt-heartbeat,這需要個別安裝 (請參閱 Percona 網站上的 Percona Toolkit)。 在來源上監控
SumBinaryLogSizeCloudWatch 指標,以追蹤二進位日誌產生率。啟用錯誤日誌的 CloudWatch Logs 日誌匯出,以保留多執行緒複本統計資料。
在來源和複本上使用 CPU、記憶體和 I/O 使用率的增強型監控。
使用 Amazon CloudWatch Database Insights 識別造成資源爭用的最大等待事件和查詢。Performance Insights 將於 2026 年 7 月 31 日終止;之後,Performance Insights 主控台會重新導向至 CloudWatch Database Insights。選擇符合您需求的 Database Insights 模式 – 標準模式會保留核心監控體驗和定價,而進階模式則會新增機群層級監控、鎖定診斷和執行計畫擷取。如需詳細資訊,請參閱使用 Amazon RDSAmazon Aurora 上的 Amazon CloudWatch Database Insights 監控資料庫負載 。
將複寫延遲降至最低的最佳實務
下列建議摘要說明將複寫延遲降至最低的關鍵動作。如需每個主題的詳細指引,請遵循交叉參考連結。
-
確保所有資料表都有主索引鍵 – 若沒有主索引鍵,複本會針對 UPDATE 和 DELETE 操作中的每個修改資料列執行完整資料表掃描。如需詳細資訊,請參閱針對 SQL 執行緒延遲進行故障診斷。
-
使用 WRITESET 啟用多執行緒複寫 – 平行 SQL 適用於獨立交易。如需組態詳細資訊,請參閱 多執行緒複寫 (MTR)。
-
至少使用與來源相同的執行個體類別 – 提供足夠的 CPU、記憶體和網路資源進行複寫。如需詳細資訊,請參閱I/O 執行緒延遲的最佳化策略。
-
保持交易大小較小 – 大型交易可減少平行處理並增加歷史記錄清單長度。如需詳細資訊,請參閱針對 SQL 執行緒延遲進行故障診斷。
-
停用複本上的二進位記錄 – 除非需要下游複寫,
binlog_format=OFF否則請設定 。如需參數詳細資訊,請參閱 MTR 組態。 -
避免在複本上長時間執行的交易和查詢 – 長時間執行的讀取交易可防止清除歷史記錄清單,這可能會降低複寫效能。
-
啟用 GTID 型複寫 – 提供自動位置追蹤,並啟用 Aurora 記憶體內轉送日誌 (Aurora MySQL 3.10+)。如需詳細資訊,請參閱Aurora 特定的複寫最佳化。