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-change 和 gh-ost。
這些工具的實現原理比較類似,本文會以 gh-ost 為例來進行分析講解。
從上圖可以大致瞭解到 gh-ost 的邏輯處理流程:
- 在操作目標資料庫上使用
create table ghost table like origin table
來建立 ghost 表; - 按照需求變更表結構,比如
add column/index
; - gh-ost 自身變為 MySQL replica slave,將原表的全量資料和 binlog 增量變更資料同步到 ghost 表;
- 資料同步完成之後執行
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 模組的程式碼進行處理,首先判斷表的型別,接著針對不同型別作出不同的處理:
- real table - 對 rename table statement 進行模式檢查,直接返回執行
- trash table - 對 rename table statement 做一些模式檢查,直接忽略同步
- ghost table
- 如果 DDL 是 create/drop table statement ,則 清空記憶體中的殘餘資訊後忽略這個 DDL 繼續同步
- 如果 DDL 是 rename table statement ,則 返回記憶體中儲存的 ghost table 的 DDLs
- 如果是其他型別 DDL,則把這些 DDL 儲存在記憶體中
下面是一個執行示例,方便大家對照著來理解上面的程式碼邏輯:
- Section 1: 使用 create table like statement 建立 ghost table,DM 會清空記憶體中
online_ddl
._t2_gho
對應的 DDL 資訊 - Section 2: 執行 alter table statement,DM 會儲存 DDL 到記憶體中
- Section 3:trash table 的 DDLs 會被忽略
- 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 基本概念
[搬運工系列]-JMeter(八)HTTP屬性管理器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基於前面幾篇部落格的資料結構自建了一套物件系統。這個系統包含著字串物件、列表物件、雜湊物件、集合物件以及有序集合物件。