成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

DM 源碼閱讀系列文章(七)定制化數(shù)據(jù)同步功能的實(shí)現(xiàn)

leo108 / 2513人閱讀

摘要:作者王相本文為源碼閱讀系列文章的第七篇,在上篇文章中我們介紹了的實(shí)現(xiàn),主要包括目錄結(jié)構(gòu)定義數(shù)據(jù)的處理流程主從切換支持的讀取等邏輯。本篇文章我們將會(huì)對的定制化數(shù)據(jù)同步功能進(jìn)行詳細(xì)的講解。

作者:王相

本文為 DM 源碼閱讀系列文章的第七篇,在 上篇文章 中我們介紹了 relay log 的實(shí)現(xiàn),主要包括 relay log 目錄結(jié)構(gòu)定義、relay log 數(shù)據(jù)的處理流程、主從切換支持、relay log 的讀取等邏輯。本篇文章我們將會(huì)對 DM 的定制化數(shù)據(jù)同步功能進(jìn)行詳細(xì)的講解。

在一般的數(shù)據(jù)同步中,上下游的數(shù)據(jù)是一一對應(yīng)的,即上下游的庫名、表名、列名以及每一列的值都是相同的,但是很多用戶因?yàn)闃I(yè)務(wù)的原因希望 DM 在同步數(shù)據(jù)到 TiDB 時(shí)進(jìn)行一些定制化的轉(zhuǎn)化。下面我們將主要介紹數(shù)據(jù)同步定制化中的庫表路由(Table routing)、黑白名單(Black & white table lists)、列值轉(zhuǎn)化(Column mapping)、binlog 過濾(Binlog event filter)四個(gè)主要功能的實(shí)現(xiàn)。值得注意的是,由于其他一些工具(例如 TiDB Lightning 和 TiDB Binlog)也需要類似的功能,所以這四個(gè)功能都以 package 的形式維護(hù)在 tidb-tools 項(xiàng)目下,這樣方便使用和維護(hù)。

庫表路由(Table routing)

庫表路由顧名思義就是對庫名和表名根據(jù)一定的路由規(guī)則進(jìn)行轉(zhuǎn)換。比如用戶在上游多個(gè) MySQL 實(shí)例或者 schema 有多個(gè)邏輯上相同的表,需要把這些表的數(shù)據(jù)同步到 TiDB 集群的同一個(gè)表中,這個(gè)時(shí)候就可以使用 table-router 功能,如下圖所示:

該功能實(shí)現(xiàn)在 pkg/table-router 中,庫表路由的規(guī)則定義在結(jié)構(gòu) TableRule 中,其中的屬性 SchemaPatternTablePattern 用于配置原庫名和表名的模式,TargetSchemaTargetTable 用于配置目標(biāo)庫和表名,即符合指定 pattern 的庫和表名都將轉(zhuǎn)化成目標(biāo)庫名和表名。

使用結(jié)構(gòu) Table 對路由規(guī)則進(jìn)行維護(hù),Table 提供了如下方法:

方法 說明
AddRule 增加規(guī)則
UpdateRule 修改規(guī)則
RemoveRule 刪除規(guī)則
Route 獲取路由后的結(jié)果

Table 結(jié)構(gòu)中組合了 Selector,Selector 用于管理指定模式的庫、表的規(guī)則,提供如下方法:

方法 說明
Insert 增加規(guī)則
Match 查找指定的庫、表匹配到的規(guī)則
Remove 刪除規(guī)則
AllRules 返回所有的規(guī)則

Selector 的底層實(shí)現(xiàn)是 trieSelector,使用了單詞查找樹的結(jié)構(gòu)來維護(hù)庫、表與規(guī)則的對應(yīng)關(guān)系,感興趣的同學(xué)可以閱讀代碼深入了解一下。 trieSelector 中使用 cache 緩存了庫、表到規(guī)則的映射關(guān)系,這樣可以減少相同庫、表匹配規(guī)則的資源消耗。除了 table routing,以下的列值轉(zhuǎn)化和 binlog 過濾功能也都使用了 Selector,在下面的介紹中就不再贅述。

黑白名單(black & white table lists)

黑白名單功能用來選擇同步哪些庫和表,以及不同步哪些庫和表,這部分代碼維護(hù)在 pkg/filter 中。

黑白名單規(guī)則配置在 Rules 結(jié)構(gòu)中,該結(jié)構(gòu)包括 DoTables、DoDBsIgnoreTablesIgnoreDBs 四個(gè)屬性,下面以判斷表 test.t 是否應(yīng)該被過濾的例子說明配置的作用:

首先 schema 過濾判斷。

如果 do-dbs 不為空,則判斷 do-dbs 中是否存在一個(gè)匹配的 schema。

如果存在,則進(jìn)入 table 過濾判斷。

如果不存在,則過濾 test.t。

如果 do-dbs 為空并且 ignore-dbs 不為空,則判斷 ignore-dbs 中是否存在一個(gè)匹配的 schema。

如果存在,則過濾 test.t

如果不存在,則進(jìn)入 table 過濾判斷。

如果 do-dbsignore-dbs 都為空,則進(jìn)入 table 過濾判斷。

進(jìn)行 table 過濾判斷。

如果 do-tables 不為空,則判斷 do-tables 中是否存在一個(gè)匹配的 table。

- 如果存在,則同步 `test.t`。
- 如果不存在,則過濾 `test.t`。

如果 ignore-tables 不為空,則判斷 ignore-tables 中是否存在一個(gè)匹配的 table。

- 如果存在,則過濾 `test.t`。
- 如果不存在,則同步 `test.t`。

如果 do-tablesignore-tables 都為空,則同步 test.t。

使用 Filter 對黑白名單進(jìn)行管理,F(xiàn)ilter 提供了 ApplyOn 方法來判斷一組 table 中哪些表可以同步。

列值轉(zhuǎn)化(Column mapping)

列值轉(zhuǎn)化功能用于對指定列的值做一些轉(zhuǎn)化,主要用于分庫分表的同步場景。比較典型的場景是:在上游分表中使用自增列作為主鍵,這樣數(shù)據(jù)在同步到 TiDB 的一個(gè)表時(shí)會(huì)出現(xiàn)主鍵沖突,因此我們需要根據(jù)一定規(guī)則對主鍵做轉(zhuǎn)化,保證每個(gè)主鍵在全局仍然是唯一的。

該功能實(shí)現(xiàn)在 pkg/column-mapping 中的 PartitionID:修改列的值的最高幾位為 PartitionID 的值(只能作用于 Int64 類型的列)。

代碼中使用 Rule 來設(shè)置 column mapping 的規(guī)則,Rule 的屬性及說明如下表所示:

屬性 說明
PatternSchema 匹配規(guī)則的庫的模式 可以設(shè)置為指定的庫名,也可以使用通配符 “*” 和 “?”
PatternTable 匹配規(guī)則的表的模式 可以設(shè)置為指定的表名,也可以使用通配符 “*” 和 “?”
SourceColumn 需要轉(zhuǎn)化的列 列名
TargetColumn 轉(zhuǎn)化后的值保存到哪個(gè)列 列名
Expression 轉(zhuǎn)化表達(dá)式 目前只支持 PartitionID
Arguments 轉(zhuǎn)化所需要的參數(shù) Expression 為 PartitionID,參數(shù)為 InstanceID、schema 名稱前綴、table 名稱前綴以及前綴與 ID 的分割符號

Expression 為 PartitionID 的配置和轉(zhuǎn)化的計(jì)算方式都較為復(fù)雜,下面舉個(gè)例子說明。

例如 Arguments 為 [1, “test”, “t”, “_”],1 表示數(shù)據(jù)庫實(shí)例的 InstanceID“test” 為庫名稱的前綴,“t” 為表名稱的前綴,“_” 為前綴與 ID 的分隔符,則表 test_1.t_2SchemaID1TableID2。轉(zhuǎn)化列值時(shí)需要對 InstanceID、SchemaID、TableID 進(jìn)行一定的位移計(jì)算,然后與原始的值進(jìn)行或運(yùn)算得出一個(gè)新的值。對于具體的計(jì)算方式,可以查看代碼 partitionIDcomputePartitionID。下面是一個(gè) PartitionID 邏輯簡化后的示意圖:

使用 Mapping 結(jié)構(gòu)對 column mapping 的規(guī)則進(jìn)行管理,Mapping 提供列如下方法:

方法 說明
AddRole 增加規(guī)則
UpdateRule 修改規(guī)則
RemoveRule 刪除規(guī)則
HandleRowValue 獲取轉(zhuǎn)化結(jié)果
binlog 過濾(binlog event filter)

binlog 過濾功能支持過濾指定類型的 binlog,或者指定模式的 query,該功能維護(hù)在 pkg/binlog-filter 中。某些用戶不希望同步一些指定類型的 binlog,例如 drop table 和 truncate table,這樣就可以在下游仍然保存這些表的數(shù)據(jù)作為備份,或者某些 SQL 語句在 TiDB 中不兼容,希望可以在同步中過濾掉,都可以通過配置 binlog event filter 功能來實(shí)現(xiàn)。

首先需要對 binlog 進(jìn)行分類,可以查看代碼 Event Type List。然后再定義過濾規(guī)則 BinlogEventRule,包括以下屬性:

屬性 說明
SchemaPattern 匹配規(guī)則的庫的模式 可以設(shè)置為指定的庫名,也可以使用通配符 “*” 和 “?”
TablePattern 匹配規(guī)則的表的模式 可以設(shè)置為指定的表名,也可以使用通配符 “*” 和 “?”
Events 規(guī)則適用于哪些類型的 binlog binlog event 的類型
SQLPattern 匹配的 SQL 的模式 SQL 語句的模式,支持適用正則表達(dá)式
Action 是否對符合上面要求的 binlog 進(jìn)行過濾 Ignore 或者 Do

例如,TiDB 對 ADD PARTITIONDROP PARTITION 語句不兼容,在同步時(shí)需要過濾掉相關(guān)的 SQL 語句,就可以在 DM 中使用如下配置:

filter-partition-rule:
    schema-pattern: "*"
    sql-pattern: ["ALTERs+TABLE[sS]*ADDs+PARTITION", "ALTERs+TABLE[sS]*DROPs+PARTITION"]
    action: Ignore

如果需要過濾掉所有的 DROP DATABASE 語句,則可以在 DM 中使用如下配置:

 filter-schema-rule:
    schema-pattern: "*"
    events: ["drop database"]
    action: Ignore

代碼中通過 BinlogEvent 結(jié)構(gòu)對 binlog event 過濾規(guī)則做統(tǒng)一的管理,BinlogEvent 提供了如下的方法:

方法 說明
AddRule 增加規(guī)則
UpdateRule 修改規(guī)則
RemoveRule 刪除規(guī)則
Filter 判斷指定的 binlog 是否應(yīng)該過濾
小結(jié)

以上就是定制化數(shù)據(jù)同步功能中庫表路由(Table routing)、黑白名單(Black & white table lists)、列值轉(zhuǎn)化(Column mapping)、binlog 過濾(Binlog event filter)的實(shí)現(xiàn)介紹。歡迎大家閱讀相關(guān)代碼深入了解,也歡迎給我們提 pr 優(yōu)化代碼。下一篇我們將介紹 DM 是如何支持上游 online DDL 工具(pt-osc,gh-ost)的 DDL 同步場景的。

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18045.html

相關(guān)文章

  • DM 源碼閱讀系列文章(一)序

    摘要:內(nèi)容概要源碼閱讀系列將會(huì)從兩條線進(jìn)行展開,一條是圍繞的系統(tǒng)架構(gòu)和重要模塊進(jìn)行分析,另一條線圍繞內(nèi)部的同步機(jī)制展開分析。更多的代碼閱讀內(nèi)容會(huì)在后面的章節(jié)中逐步展開,敬請期待。 作者:楊非 前言 TiDB-DM 是由 PingCAP 開發(fā)的一體化數(shù)據(jù)同步任務(wù)管理平臺(tái),支持從 MySQL 或 MariaDB 到 TiDB 的全量數(shù)據(jù)遷移和增量數(shù)據(jù)同步,在 TiDB DevCon 2019 正...

    Mr_houzi 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<