全部產品
Search
文件中心

ApsaraDB RDS:DDL複寫延遲最佳化

更新時間:May 13, 2026

MySQL使用的是邏輯複製,一個事務在主庫執行結束後,會發送事務產生的Binlog event到備庫應用,進而保證主備的一致性。在這種架構下,對於耗時間長度的DDL,會導致備庫有顯著的複寫延遲。為解決此問題,RDS MySQL推出了DDL 即時應用功能。該功能可以在主庫執行DDL時即通知備庫執行DDL,達到主備同時執行DDL的效果,從而基本消除DDL導致的複寫延遲,保障執行個體的高可用。

功能簡介

背景介紹

邏輯複製的延遲主要由兩部分構成:Binlog event傳輸時間 + 備庫事務回放時間。對於DDL,僅產生一個Gtid_log_event和一個Query_log_event,傳輸量少,Binlog event傳輸時間可以忽略不計,所以DDL複寫延遲的主因就是執行DDL的長耗時。

image

RDS MySQL DDL即時應用

通過上文的分析,可以看到DDL導致複寫延遲的根因是MySQL現有架構要求必須在主庫提交DDL後,備庫才能應用。因此解決這個問題的直觀想法就是讓備庫不用等待主庫,而是和主庫並存執行DDL。

DDL即時應用功能的核心,也正是如此。在主庫開始執行DDL時,即通知備庫開始執行DDL;備庫在完成DDL的主要工作後,等待主庫的執行結果;主庫如果執行成功,則通知備庫提交DDL,主庫如果執行失敗,則通知備庫復原DDL。最終如下圖所示,DDL導致的複寫延遲被減少為通知備庫的所需一次網路傳輸耗時+DDL提交的耗時,此兩步耗時極低,一般最高為十毫秒級。

image

下文用BRR(binlog realtime replication)來指代該功能。

技術原理

  1. 主庫建立了Brr binlog event(新類型的Binlog event),通過即時傳輸功能傳到備庫,通知備庫執行DDL,達到主備同時執行DDL的效果。Brr binlog event不會記錄Binlog和Relay Log,對消費binlog的下遊生態不會有影響。

  2. 備庫建立一定數量的Brr Worker線程來即時應用DDL,此Brr Worker線程獨立於MySQL原有的Worker線程

支援版本

執行個體版本要求如下,當版本不符合要求時,可以升級升級核心小版本升級資料庫版本

  • MySQL 8.4

  • MySQL 8.0:核心小版本 ≥ 20250731。

使用限制

使用方法

您可以同時在主庫和備庫分別設定執行個體參數來開啟該功能。參數修改立即生效,無需重啟執行個體。

主庫參數:

  • loose_binlog_realtime_apply_ddl_source_enabled = ON

  • loose_binlog_realtime_ddl_time_limit = N (N為大於等於0的正整數,執行時間長度超過該值的DDL,才會使用BRR功能,該參數以毫秒為單位,預設值為1000)

備庫參數:

  • loose_binlog_realtime_apply_workers = N (N為大於等於1的正整數,此參數代表Brr Worker線程數)

最佳化效果

本測試構造包含80000000行記錄,大小23G的單表,然後對該表做重建表操作(alter table sbtest1 engine=innodb)。

最佳化效果如下圖所示,主庫在16:21:35和16:32:50 執行上述DDL。未開啟BRR時,備庫有持續277s的複寫延遲,開啟BRR時,無複寫延遲。

該測試執行個體小版本為20251031。

image.png