作者:張學程
本文為 DM 源碼閱讀系列文章的第九篇,在 上篇文章 中我們詳細介紹了 DM 對 online schema change 方案的同步支持,對 online schema change 同步方案以及實現細節等邏輯進行了分析。
在本篇文章中,我們將對 shard DDL 同步機制以及 checkpoint 機制等進行詳細的介紹,內容包括 shard group 的定義、shard DDL 的同步協調處理流程、checkpoint 機制以及與之相關的 safe mode 機制。
shard DDL 機制的實現
DM 中通過 庫表路由與列值轉換 功能,實現了對分庫分表合併場景下 DML 的同步支持。但當需要同步的各分表存在 DDL 變更時,還需要對 DDL 的同步進行更多額外的處理。有關分表合併時 shard DDL 同步需要處理的問題以及 DM 中的同步支持原理,請先閱讀 TiDB Ecosystem Tools 原理解讀系列(三)TiDB-DM 架構設計與實現原理。
shard group
在 這篇文章 中,我們介紹了 DM 在處理 shard DDL 同步時引入了兩級 shard group 的概念,即用於執行分表合併同步任務的各 DM-worker 組成的 shard group、每個 DM-worker 內需要進行合表同步的各上游分表組成的 shard group。
DM-worker 組成的 shard group
由 DM-worker 組成的 shard group 是由集群部署拓撲及同步任務配置決定的,即任務配置文件中定義的需要進行合表同步的所有上游 MySQL 實例對應的所有 DM-worker 實例即組成了一個 shard group。為了表示同步過程中的相關動態信息,DM-master 內部引入了兩個概念:
- Lock:對於每組需要進行合併的表,其中每一條需要進行同步協調的 shard DDL,由一個 Lock 實例進行表示;每個 Lock 實例在有 shard DDL 需要協調同步時被創建、在協調同步完成後被銷毀;在 dmctl 中使用 show-ddl-locks 命令查看到的每一個 Lock 信息即對應一個該實例
- LockKeeper:維護所有的 Lock 實例信息並提供相關的操作介面
Lock 中各主要成員變數的作用如下: