全部產品
Search
文件中心

:並行DDL

更新時間:Jul 06, 2024

本文對PolarDB-X中的DDL的並行特性及參數控制進行詳細說明。

前提條件

  • 物理執行DDL並發控制在5.4.15-16715927版本後支援。

  • 邏輯執行DDL並發控制在5.4.16-16825599版本後支援。

注意事項

採用本文描述的參數增大DDL的資源佔用時,可能影響到同一時間的業務流量,因而需要確認業務的實際需求和叢集資源規格滿足需要方可啟用。

概述

PolarDB-X中的DDL分為物理執行和邏輯執行兩種實現方式,對於上述兩類執行方式的特徵以及不同種類DDL的執行方式請參見Online DDL。對於以上兩類執行方式的DDL,PolarDB-X提供不同的參數控制機制,允許使用者控制DDL佔用資源和處理資料的輸送量。

  • 對於物理執行的DDL,CN進行物理表層級的物理DDL轉寄,主要的資源開銷存在於DN上,PolarDB-X提供物理DDL請求並行度的相關控制參數。

  • 對於邏輯執行的DDL,CN處理DDL全流程中的資料回填、多寫、校正、元資訊管理等全部邏輯,其中資料回填佔據了絕大部分資源及時間,PolarDB-X提供邏輯執行中資料回填並行度的相關控制參數。

物理執行DDL並行控制

對於物理執行的DDL,通過下面的參數可以控制轉寄物理DDL請求的並行度:

參數

類型

層級

說明

預設值

最大配置建議

MERGE_DDL_CONCURRENT

bool

Session/Global

是否並行發送物理DDL

false

設定為true

MERGE_CONCURRENT

bool

Session/Global

是否在分庫上並行建連

false

設定為true

PREFETCH_SHARDS

int

Session/Global

所有物理庫上物理DDL請求的最大並行度

1*dn數量

最大設定為dn核心數*dn數量

預設情況下,單個物理DDL可以在DN單核上達到較高佔用率,因而PREFETCH_SHARDS的值超出所有DN的核心數時,繼續增大該值的效果不顯著。

以一個16C64G規格的2CN 2DN的執行個體為例,對TPCC 10000倉的表bmsql_order_line加本地索引的操作為例,在執行個體資源充裕的情況下可進行下面的參數設定:

/*+TDDL:cmd_extra(MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=32)*/ 
ALTER TABLE `bmsql_order_line` ADD LOCAL INDEX `i_ol_d_id`(`ol_d_id`);

通過show physical processlist where info like "%i_ol_d_id%";,可以查看DN上並發執行的物理DDL情況。

邏輯執行DDL並行控制

對於邏輯執行的DDL,通過下面的參數可以控制資料回填的並發度及資源限制,同時可以通過show ddl status觀察邏輯執行進度。

針對添加GSI,repartition,OMC三類DDL的並行度控制參數:

參數

類型

層級

說明

預設值

最大配置建議

BACKFILL_PARALLELISM

int

Global

全域允許的最大並發回填線程數

max(CPU_cores, 8) * 4

一般無須調整

SLIDE_WINDOW_TIME_INTERVAL

int

Session/Global

啟動大物理表並發回填的延遲時間(秒)

60

資源充足可調整為0

GSI_BACKFILL_PARALLELISM

int

Session/Global

單個DDL Task中允許的最大並發回填線程數

-1

一般無須調整

PHYSICAL_TABLE_BACKFILL_PARALLELISM

int

Session/Global

單個物理表上允許的最大並發回填線程數

4

根據負載決定,最大可設定為CN核心數*2

GSI_BACKFILL_SPEED_LIMITATION

int

Session/Global

允許的最大回填速率(行/s)

150000

根據負載決定,最大設定可設定為-1

針對move partition和擴縮容等DDL的並發度控制參數:

參數

類型

層級

說明

預設值

最大配置建議

BACKFILL_PARALLELISM

int

Global

全域允許的最大並發回填線程數

max(CPU_cores, 8) * 4

一般無須調整

SLIDE_WINDOW_TIME_INTERVAL

int

Session/Global

啟動大物理表並發回填的延遲時間(秒)

60

資源充足可調整為0

SCALEOUT_BACKFILL_PARALLELISM

int

Session/Global

單個DDL Task中允許的最大並發回填線程數

-1

一般無須調整

PHYSICAL_TABLE_BACKFILL_PARALLELISM

int

Session/Global

單個物理表上允許的最大並發回填線程數

4

根據負載決定,最大可設定為CN核心數*2

SCALEOUT_BACKFILL_SPEED_LIMITATION

int

Session/Global

允許的最大回填速率(行/s)

300000

根據負載決定,最大設定可設定為-1

以在一個16C64G規格的2CN2DN的執行個體上,對TPCC 10000倉的表bmsql_order_line加全域索引的操作為例,預設參數設定情況下執行下面的語句:

/*+TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true)*/
ALTER TABLE `bmsql_order_line` ADD GLOBAL INDEX `g_i_ol_d_id`(`ol_d_id`) partition by hash(`ol_d_id`) partitions 32;

可通過show ddl status觀測實際的DDL執行狀態:

show ddl status;
+----------------------------------+-----------+
| METRIC                           | VALUE     |
+----------------------------------+-----------+
| BACKFILL_PARALLELISM             |        32 |
| BACKFILL_ROWS_FINISHED           | 288679866 |
| BACKFILL_ROWS_SPEED              |    150186 |
| BACKFILL_TASK_FAILED             |         0 |
| BACKFILL_TASK_FINISHED           |         1 |
| BACKFILL_TASK_TOTAL              |         0 |
| BACKFILL_TIME_MILLIS             |      3450 |
| CHANGESET_APPLY_PARALLELISM      |         0 |
| CHANGESET_APPLY_ROWS_SPEED       |         0 |
| CHECKER_ROWS_FINISHED            |         0 |
| CHECKER_TIME_MILLIS              |         0 |
| DDL_EXECUTION_TIME_MILLIS        |    696412 |
| DDL_JOBS_FINISHED                |         5 |
| DDL_JOBS_TOTAL                   |         6 |
| DDL_TASK_FAILED                  |         4 |
| DDL_TASK_FINISHED                |       107 |
| DDL_TASK_TOTAL                   |        63 |
| FASTCHECKER_TASK_RUNNING         |         0 |
| FASTCHECKER_TASK_WAITING         |         0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE |         1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE |         0 |
| FASTCHECKER_THREAD_POOL_NUM      |         2 |
| THROTTLE_RATE                    |    150000 |
+----------------------------------+-----------+

其中值得關注的參數:

  • BACKFILL_PARALLESIM表示當前活躍的回填匯流排程數;

  • BACKFILL_ROWS_SPEED表示當前的回填按行統計的速度;

  • THROTTLE_RATE並表示限速。

此時的DDL回填速度受THROTTLE_RATE影響,限制在15萬行/秒左右。如要達到最大並發度且取消限速,可採用下面的方式發送邏輯DDL。

/*+TDDL:cmd_extra(SLIDE_WINDOW_TIME_INTERVAL=0,PURE_ASYNC_DDL_MODE=true,PHYSICAL_TABLE_BACKFILL_PARALLELISM=8,GSI_BACKFILL_PARALLELISM=32,GSI_BACKFILL_SPEED_LIMITATION=-1)*/ 
ALTER TABLE bmsql_order_line ADD GLOBAL INDEX g_i_ol_d_id(`ol_d_id`) partition by hash(`ol_d_id`) partitions 32;

可通過show ddl status可以觀測實際的DDL執行狀態:

show ddl status;
+----------------------------------+----------+
| METRIC                           | VALUE    |
+----------------------------------+----------+
| BACKFILL_PARALLELISM             |       32 |
| BACKFILL_ROWS_FINISHED           | 37272038 |
| BACKFILL_ROWS_SPEED              |   867669 |
| BACKFILL_TASK_FAILED             |        0 |
| BACKFILL_TASK_FINISHED           |        1 |
| BACKFILL_TASK_TOTAL              |        0 |
| BACKFILL_TIME_MILLIS             |     3450 |
| CHANGESET_APPLY_PARALLELISM      |        0 |
| CHANGESET_APPLY_ROWS_SPEED       |        0 |
| CHECKER_ROWS_FINISHED            |        0 |
| CHECKER_TIME_MILLIS              |        0 |
| DDL_EXECUTION_TIME_MILLIS        |   112397 |
| DDL_JOBS_FINISHED                |        3 |
| DDL_JOBS_TOTAL                   |        4 |
| DDL_TASK_FAILED                  |        2 |
| DDL_TASK_FINISHED                |       75 |
| DDL_TASK_TOTAL                   |       42 |
| FASTCHECKER_TASK_RUNNING         |        0 |
| FASTCHECKER_TASK_WAITING         |        0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE |        1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE |        0 |
| FASTCHECKER_THREAD_POOL_NUM      |        2 |
| THROTTLE_RATE                    |       -1 |
+----------------------------------+----------+
23 rows in set (0.02 sec)

此時的DDL回填速度不受限制,在32個線程均處於運行狀態的前提下,回填速度達到86萬行/秒。

效能測試

  • PolarDB-X執行個體規格:16C64G,2個計算節點,2個儲存節點。

  • 表結構:TPCC,AUTO模式資料庫,bmsql_order_line表。

    CREATE TABLE `bmsql_order_line` (
            `ol_w_id` int(11) NOT NULL,
            `ol_d_id` tinyint(4) NOT NULL,
            `ol_o_id` int(11) NOT NULL,
            `ol_number` tinyint(4) NOT NULL,
            `ol_i_id` int(11) NOT NULL,
            `ol_delivery_d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            `ol_amount` decimal(6, 2) DEFAULT NULL,
            `ol_supply_w_id` int(11) DEFAULT NULL,
            `ol_quantity` int(11) DEFAULT NULL,
            `ol_dist_info` char(24) COLLATE latin1_bin DEFAULT NULL,
            PRIMARY KEY (`ol_w_id`, `ol_d_id`, `ol_o_id`, `ol_number`)
    ) ENGINE = InnoDB DEFAULT CHARSET = latin1 DEFAULT COLLATE = latin1_bin
    PARTITION BY KEY(`ol_w_id`)
    PARTITIONS 32
  • 測試資料:可參照benchmark boot壓測工具說明匯入TPCC 10000倉資料,共計約30億行資料,230 GB。

測試一:增加Local Index

設定參數執行下面的語句,通過show ddl觀察DDL執行狀態:

/*+TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true,ENABLE_TWO_PHASE_DDL=false,ENBALE_DRDS_MULTI_PHASE_DDL=false,MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=xxx)*/ 

ALTER TABLE `bmsql_order_line` ADD LOCAL INDEX i_ol_o_id(ol_o_id);

在不同參數下執行時間與資源佔用情況如下:

參數設定

執行時間(秒)

並發加速比

DN CPU平均使用率(<=核心數)

DN IOPS平均使用率(<=1)

PREFETCH_SHARDS=2(預設設定,單DN並發度為1)

6880

1

135%

55%

PREFETCH_SHARDS=4(單DN並發度為2)

3503

1.96

240%

95%

PREFETCH_SHARDS=8(單DN並發度為4)

2514

2.69

470%

100%

PREFETCH_SHARDS=16(單DN並發度為8)

2152

3.19

896%

100%

PREFETCH_SHARDS=32(單DN並發度為16)

1954

3.52

1590%

100%

測試二:增加Global Index

設定參數執行下面的語句,通過show ddl status觀察DDL執行狀態:

/*+TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true,SLIDE_WINDOW_TIME_INTERVAL=0,PHYSICAL_TABLE_BACKFILL_PARALLELISM=xxx,GSI_BACKFILL_SPEED_LIMITATION=xxx)*/ ALTER TABLE `bmsql_order_line` ADD GLOBAL INDEX `g_i_ol_o_id`(`ol_o_id`) PARTITION BY HASH(`ol_o_id`) PARTITIONS 32;

參數設定

執行時間(秒)

並發加速比

DN CPU平均使用率(<=核心數)

DN IOPS平均使用率(<=1)

CN CPU平均使用率(<=核心數)

PHYSICAL_TABLE_BACKFILL_PARALLELISM=1, GSI_BACKFILL_SPEED_LIMITATION=150000(單物理表無並發,自動限速)

17441

1

190%

8%

357%

SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=4, GSI_BACKFILL_SPEED_LIMITATION=-1(預設設定但不限速)

7124

2.45

594%

23%

723%

SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=8, GSI_BACKFILL_SPEED_LIMITATION=-1(單物理表8個並發,無限速)

4020

4.34

1175%

54%

1476%