1. 程式人生 > >DM 原始碼閱讀系列文章(八)Online Schema Change 同步支援

DM 原始碼閱讀系列文章(八)Online Schema Change 同步支援

作者:lan

本文為 DM 原始碼閱讀系列文章的第八篇,上篇文章 對 DM 中的定製化資料同步功能進行詳細的講解,包括庫表路由(Table routing)、黑白名單(Black & white table lists)、列值轉化(Column mapping)、binlog 過濾(Binlog event filter)四個主要功能的實現。

本篇文章將會以 gh-ost 為例,詳細地介紹 DM 是如何支援一些 MySQL 上的第三方 online schema change 方案同步,內容包括 online schema change 方案的簡單介紹,online schema change 同步方案,以及同步實現細節。

MySQL 的 Online Schema Change 方案

目前有一些第三方工具支援在 MySQL 上面進行 Online Schema Change,比較主流的包括 pt-online-schema-changegh-ost

這些工具的實現原理比較類似,本文會以 gh-ost 為例來進行分析講解。

從上圖可以大致瞭解到 gh-ost 的邏輯處理流程:

  1. 在操作目標資料庫上使用 create table ghost table like origin table 來建立 ghost 表;
  2. 按照需求變更表結構,比如 add column/index
  3. gh-ost 自身變為 MySQL replica slave,將原表的全量資料和 binlog 增量變更資料同步到 ghost 表;
  4. 資料同步完成之後執行 rename origin table to table_del, table_gho to origin table 完成 ghost 表和原始表的切換

pt-online-schema-change 通過 trigger 的方式來實現資料同步,剩餘流程類似。

在 DM 的 task 配置中可以通過設定 online-ddl-scheme 來配置的 online schema change 方案,目前僅支援 gh-ost/pt 兩個配置選項。

DM Online Schema Change 同步方案

根據上個章節介紹的流程,pt 和 gh-ost 除了 replicate 資料的方式不一樣之外,其他流程都類似,並且這種 native 的模式可以使得 binlog replication 幾乎不需要修改就可以同步資料。但是 DM 為了減少同步的資料量,簡化一些場景(如 shard tables merge)下的處理流程,並做了額外的優化,即,不同步 ghost 表的資料。

繼續分析 online schema change 的流程,從資料同步的角度看有下面這些需要關注的點:

  • 原始表的增量資料同步模式有沒有變化
  • ghost 表會產生跟原始表幾乎一樣的冗餘 binlog events
  • 通過 rename origin table to table_del, table_gho to origin table 完成 ghost 表和原始表的切換

如果使用 ghost 表的 alter DDL 替換掉 rename origin table to table_del, table_gho to origin table ,那麼就可以實現我們的不同步 ghost 表資料的目的。

DM Online Schema Change 同步實現細節

Online schema change 模組程式碼實現如下:

DM 將 同步的表分為三類

  • real table - 原始表
  • trash table - online schema change 過程中產生的非關鍵資料表,比如以 _ghc, _del 為字尾的表
  • ghost table - 與原始表對應的經過 DDL 變更的資料表,比如以 _gho 為字尾的表

當 DM 遇到 DDL 的時候,都會 呼叫 online schema change 模組的程式碼進行處理,首先判斷表的型別,接著針對不同型別作出不同的處理:

下面是一個執行示例,方便大家對照著來理解上面的程式碼邏輯:

  1. Section 1: 使用 create table like statement 建立 ghost table,DM 會清空記憶體中 online_ddl._t2_gho 對應的 DDL 資訊
  2. Section 2: 執行 alter table statement,DM 會儲存 DDL 到記憶體中
  3. Section 3:trash table 的 DDLs 會被忽略
  4. Section 4:遇到 ghost table 的 rename table statement 會替換成 Section 2 的 DDL, 並且將該 DDL 的 table name 更換成對應 real table name 去執行

注意: rename table statement 模式檢查主要是為了確保在 online schema change 變更過程中除了 rename origin table to table_del, table_gho to origin table 之外沒有其他 rename table statement,避免同步狀態的複雜化。

小結

本篇文章詳細地介紹 DM 對 online schema change 方案的同步支援,內容包含 online schema change 方案的簡單介紹, online schema change 同步方案,以及同步實現細節。下一章會對 DM 的 shard DDL merge 方案進行詳細的講解,敬請期待。

原文閱讀https://www.pingcap.com/blog-cn/dm-source-code-reading-8/

相關推薦

DM 原始碼閱讀系列文章Online Schema Change 同步支援

作者:lan 本文為 DM 原始碼閱讀系列文章的第八篇,上篇文章 對 DM 中的定製化資料同步功能進行詳細的講解,包括庫表路由(T

DM 原始碼閱讀系列文章定製化資料同步功能的實現

作者:王相 本文為 DM 原始碼閱讀系列文章的第七篇,在 上篇文章 中我們介紹了 relay log 的實現,主要包括 relay

DM 原始碼閱讀系列文章shard DDL 與 checkpoint 機制的實現

作者:張學程 本文為 DM 原始碼閱讀系列文章的第九篇,在 上篇文章 中我們詳細介紹了 DM 對 online schema ch

DM 原始碼閱讀系列文章測試框架的實現

作者:楊非 本文為 DM 原始碼閱讀系列文章的第十篇,之前的文章已經詳細介紹過 DM 資料同步各元件的實現原理和程式碼解析,相信大

TiDB 原始碼閱讀系列文章初識 TiDB 原始碼

本文為 TiDB 原始碼閱讀系列文章的第二篇,第一篇文章介紹了 TiDB 整體的架構,知道 TiDB 有哪些模組,分別是做什麼的,從哪裡入手比較好,哪些可以忽略,哪些需要仔細閱讀。 這篇文章是一篇入門文件,難度係數比較低,其中部分內容可能大家在其他渠道已經看過

TiDB Binlog 原始碼閱讀系列文章Pump server 介紹

作者: satoru 在 上篇文章 中,我們介紹了 TiDB 如何通過 Pump client 將 binlog 發往 Pump,

TiDB 原始碼閱讀系列文章二十Table Partition

作者:肖亮亮 Table Partition 什麼是 Table Partition Table Partition 是指根據一定規則,將資料庫中的一張表分解成多個更小的容易管理的部分。從邏輯上看只有一張表,但是底層卻是由多個物理分割槽組成。相信對有關係型資料庫使用背景的使用者來

TiDB 原始碼閱讀系列文章十九tikv-client

上篇文章 中,我們介紹了資料讀寫過程中 tikv-client 需要解決的幾個具體問題,本文將繼續介紹 tikv-client 裡的兩個主要的模組——負責處理分散式計算的 copIterator 和執行二階段提交的 twoPhaseCommitter。 copIterator cop

TiDB 原始碼閱讀系列文章二十一基於規則的優化 II

在 TiDB 原始碼閱讀系列文章(七)基於規則的優化 一文中,我們介紹了幾種 TiDB 中的邏輯優化規則,包括列剪裁,最大最小消除,投影消除,謂詞下推和構建節點屬性,本篇將繼續介紹更多的優化規則:聚合消除、外連線消除和子查詢優化。 聚合消除 聚合消除會檢查 SQL 查詢中 Group By 語句所使用的列是否

讀logback原始碼系列文章——記錄日誌的實際工作類Encoder

本系列的部落格從logback怎麼對接slf4j開始,逐步介紹了LoggerContext、Logger、ContextInitializer、Appender、Action等核心元件。跟讀logback的原始碼到這個程度,雖然不能說精通,不過至少日常的配置,和簡單的自定義擴

TiKV 原始碼解析系列文章Prometheus

開發十年,就只剩下這套架構體系了! >>>   

TiKV 原始碼解析系列文章gRPC Server 的初始化和啟動流程

作者:屈鵬 本篇 TiKV 原始碼解析將為大家介紹 TiKV 的另一週邊元件—— grpc-rs。grpc-rs 是 PingCA

讀logback原始碼系列文章——記錄日誌

今天晚上本來想來寫一下Logger怎麼記錄日誌,以及Appender元件。不過9點才從丈母孃家回來,又被幾個兄弟喊去喝酒,結果回來晚了,所以時間就只夠寫一篇Logger類的原始碼分析了。Appender找時間再寫 上篇部落格介紹了LoggerContext怎麼生成Logger

TiKV 原始碼解析系列文章十一Storage

作者:張金鵬 背景知識 TiKV 是一個強一致的支援事務的分散式 KV 儲存。TiKV 通過 raft 來保證多副本之間的強一致,

Java系列文章

java 學習JVMJVM系列:類裝載器的體系結構 JVM系列:Class文件檢驗器JVM系列:安全管理器JVM系列:策略文件Java垃圾回收機制深入剖析Classloader(一)--類的主動使用與被動使用深入剖析Classloader(二)-根類加載器,擴展類加載器與系統類加載器深入理解JVM—JVM內存

openstack系列文章

cnblogs 調度器 5.5 min 代碼位置 虛機 inux latest 階段 學習 openstack 的系列文章 - Nova Nova 基本概念 Nova 架構 openstack Log Nova 組件介紹 Nova 操作介紹 1. Nova 基本概念

[搬運工系列]-JMeterHTTP屬性管理器HTTP Cookie Manager、HTTP Request Defaults

發出 啟動 管理 red 增加 ron cookies ria 新建 Test Plan的配置元件中有一些和HTTP屬性相關的元件:HTTP Cache Manager、HTTP Authorization Manager、HTTP Cookie Manager、HTTP

Git 系列文章——GitHub 介紹

正文之前 相信大部分都人都知道 GitHub,對,就是被微軟收購的全球最大交友網站。目前博主還處於學生階段,所以一直處於這樣的迴圈中: git add git commit git pull git push 但是本著要深入學習的心態,以及目前參加掘金翻譯

Git 系列文章—— Git 基本用法

正文之前 上一篇文章簡單介紹了 Git 和 GitHub,這一篇文章用一個倉庫來作為例子介紹 Git 的基本用法,而不是單純地列出每一條 Git 命令 這篇文章來自我的部落格 正文 1. 倉庫的初始操作 初始化 首先我先在本地存放 GitHub 倉庫的資料夾

redis原始碼分析與思考——物件

    談及物件,我們不免會立即聯想到Java、C++等面向物件的語言,而在C中是沒有物件這一說法的,為了方便管理與程式碼整體的優化,redis基於前面幾篇部落格的資料結構自建了一套物件系統。這個系統包含著字串物件、列表物件、雜湊物件、集合物件以及有序集合物件。