本文對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% |