摘要:作者本文為源碼閱讀系列文章的第八篇,上篇文章對(duì)中的定制化數(shù)據(jù)同步功能進(jìn)行詳細(xì)的講解,包括庫(kù)表路由黑白名單列值轉(zhuǎn)化過(guò)濾四個(gè)主要功能的實(shí)現(xiàn)。小結(jié)本篇文章詳細(xì)地介紹對(duì)方案的同步支持,內(nèi)容包含方案的簡(jiǎn)單介紹,同步方案,以及同步實(shí)現(xiàn)細(xì)節(jié)。
作者:lan
本文為 DM 源碼閱讀系列文章的第八篇,上篇文章 對(duì) DM 中的定制化數(shù)據(jù)同步功能進(jìn)行詳細(xì)的講解,包括庫(kù)表路由(Table routing)、黑白名單(Black & white table lists)、列值轉(zhuǎn)化(Column mapping)、binlog 過(guò)濾(Binlog event filter)四個(gè)主要功能的實(shí)現(xiàn)。
本篇文章將會(huì)以 gh-ost 為例,詳細(xì)地介紹 DM 是如何支持一些 MySQL 上的第三方 online schema change 方案同步,內(nèi)容包括 online schema change 方案的簡(jiǎn)單介紹,online schema change 同步方案,以及同步實(shí)現(xiàn)細(xì)節(jié)。
MySQL 的 Online Schema Change 方案目前有一些第三方工具支持在 MySQL 上面進(jìn)行 Online Schema Change,比較主流的包括 pt-online-schema-change 和 gh-ost。
這些工具的實(shí)現(xiàn)原理比較類似,本文會(huì)以 gh-ost 為例來(lái)進(jìn)行分析講解。
從上圖可以大致了解到 gh-ost 的邏輯處理流程:
在操作目標(biāo)數(shù)據(jù)庫(kù)上使用 create table ghost table like origin table 來(lái)創(chuàng)建 ghost 表;
按照需求變更表結(jié)構(gòu),比如 add column/index;
gh-ost 自身變?yōu)?MySQL replica slave,將原表的全量數(shù)據(jù)和 binlog 增量變更數(shù)據(jù)同步到 ghost 表;
數(shù)據(jù)同步完成之后執(zhí)行 rename origin table to table_del, table_gho to origin table 完成 ghost 表和原始表的切換
pt-online-schema-change 通過(guò) trigger 的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)同步,剩余流程類似。
在 DM 的 task 配置中可以通過(guò)設(shè)置 online-ddl-scheme 來(lái)配置的 online schema change 方案,目前僅支持 gh-ost/pt 兩個(gè)配置選項(xiàng)。
DM Online Schema Change 同步方案根據(jù)上個(gè)章節(jié)介紹的流程,pt 和 gh-ost 除了 replicate 數(shù)據(jù)的方式不一樣之外,其他流程都類似,并且這種 native 的模式可以使得 binlog replication 幾乎不需要修改就可以同步數(shù)據(jù)。但是 DM 為了減少同步的數(shù)據(jù)量,簡(jiǎn)化一些場(chǎng)景(如 shard tables merge)下的處理流程,并做了額外的優(yōu)化,即,不同步 ghost 表的數(shù)據(jù)。
繼續(xù)分析 online schema change 的流程,從數(shù)據(jù)同步的角度看有下面這些需要關(guān)注的點(diǎn):
原始表的增量數(shù)據(jù)同步模式有沒(méi)有變化
ghost 表會(huì)產(chǎn)生跟原始表幾乎一樣的冗余 binlog events
通過(guò) 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 ,那么就可以實(shí)現(xiàn)我們的不同步 ghost 表數(shù)據(jù)的目的。
DM Online Schema Change 同步實(shí)現(xiàn)細(xì)節(jié)Online schema change 模塊代碼實(shí)現(xiàn)如下:
gh-ost 同步代碼實(shí)現(xiàn)
pt-online-schema-change 同步代碼實(shí)現(xiàn)
DM 將 同步的表分為三類:
real table - 原始表
trash table - online schema change 過(guò)程中產(chǎn)生的非關(guān)鍵數(shù)據(jù)表,比如以 _ghc, _del 為后綴的表
ghost table - 與原始表對(duì)應(yīng)的經(jīng)過(guò) DDL 變更的數(shù)據(jù)表,比如以 _gho 為后綴的表
當(dāng) DM 遇到 DDL 的時(shí)候,都會(huì) 調(diào)用 online schema change 模塊的代碼進(jìn)行處理,首先判斷表的類型,接著針對(duì)不同類型作出不同的處理:
real table - 對(duì) rename table statement 進(jìn)行模式檢查,直接返回執(zhí)行
trash table - 對(duì) rename table statement 做一些模式檢查,直接忽略同步
ghost table
如果 DDL 是 create/drop table statement ,則 清空內(nèi)存中的殘余信息后忽略這個(gè) DDL 繼續(xù)同步
如果 DDL 是 rename table statement ,則 返回內(nèi)存中保存的 ghost table 的 DDLs
如果是其他類型 DDL,則把這些 DDL 保存在內(nèi)存中
下面是一個(gè)執(zhí)行示例,方便大家對(duì)照著來(lái)理解上面的代碼邏輯:
Section 1: 使用 create table like statement 創(chuàng)建 ghost table,DM 會(huì)清空內(nèi)存中 online_ddl._t2_gho 對(duì)應(yīng)的 DDL 信息
Section 2: 執(zhí)行 alter table statement,DM 會(huì)保存 DDL 到內(nèi)存中
Section 3:trash table 的 DDLs 會(huì)被忽略
Section 4:遇到 ghost table 的 rename table statement 會(huì)替換成 Section 2 的 DDL, 并且將該 DDL 的 table name 更換成對(duì)應(yīng) real table name 去執(zhí)行
注意: rename table statement 模式檢查主要是為了確保在 online schema change 變更過(guò)程中除了 rename origin table to table_del, table_gho to origin table 之外沒(méi)有其他 rename table statement,避免同步狀態(tài)的復(fù)雜化。
小結(jié)本篇文章詳細(xì)地介紹 DM 對(duì) online schema change 方案的同步支持,內(nèi)容包含 online schema change 方案的簡(jiǎn)單介紹, online schema change 同步方案,以及同步實(shí)現(xiàn)細(xì)節(jié)。下一章會(huì)對(duì) DM 的 shard DDL merge 方案進(jìn)行詳細(xì)的講解,敬請(qǐng)期待。
原文閱讀:
https://www.pingcap.com/blog-cn/dm-source-code-reading-8/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/18054.html
摘要:作者王相本文為源碼閱讀系列文章的第七篇,在上篇文章中我們介紹了的實(shí)現(xiàn),主要包括目錄結(jié)構(gòu)定義數(shù)據(jù)的處理流程主從切換支持的讀取等邏輯。本篇文章我們將會(huì)對(duì)的定制化數(shù)據(jù)同步功能進(jìn)行詳細(xì)的講解。 作者:王相 本文為 DM 源碼閱讀系列文章的第七篇,在 上篇文章 中我們介紹了 relay log 的實(shí)現(xiàn),主要包括 relay log 目錄結(jié)構(gòu)定義、relay log 數(shù)據(jù)的處理流程、主從切換支持、...
閱讀 850·2021-11-24 10:44
閱讀 2789·2021-11-11 16:54
閱讀 3185·2021-10-08 10:21
閱讀 2091·2021-08-25 09:39
閱讀 2911·2019-08-30 15:56
閱讀 3462·2019-08-30 13:46
閱讀 3500·2019-08-23 18:09
閱讀 2085·2019-08-23 17:05