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

資訊專欄INFORMATION COLUMN

DM 源碼閱讀系列文章(二)整體架構(gòu)介紹

jsyzchen / 2671人閱讀

摘要:作者張學(xué)程本文為源碼閱讀系列文章的第二篇,第一篇文章簡(jiǎn)單介紹了源碼閱讀的目的和規(guī)劃,以及的源碼結(jié)構(gòu)以及工具鏈。通過注冊(cè),并將該作為各的。在本篇文章中,我們暫時(shí)只關(guān)注架構(gòu)相關(guān)的實(shí)現(xiàn),上述各功能的具體實(shí)現(xiàn)將在后續(xù)的相關(guān)文章中展開介紹。

作者:張學(xué)程

本文為 DM 源碼閱讀系列文章的第二篇,第一篇文章 簡(jiǎn)單介紹了 DM 源碼閱讀的目的和規(guī)劃,以及 DM 的源碼結(jié)構(gòu)以及工具鏈。從本篇文章開始,我們會(huì)正式開始閱讀 DM 的源碼。

本篇文章主要介紹 DM 的整體架構(gòu),包括 DM 有哪些組件、各組件分別實(shí)現(xiàn)什么功能、組件之間交互的數(shù)據(jù)模型和 RPC 實(shí)現(xiàn)。

整體架構(gòu)

通過上面的 DM 架構(gòu)圖,我們可以看出,除上下游數(shù)據(jù)庫及 Prometheus 監(jiān)控組件外,DM 自身有 DM-master、DM-worker 及 dmctl 這 3 個(gè)組件。其中,DM-master 負(fù)責(zé)管理和調(diào)度數(shù)據(jù)同步任務(wù)的各項(xiàng)操作,DM-worker 負(fù)責(zé)執(zhí)行具體的數(shù)據(jù)同步任務(wù),dmctl 提供用于管理 DM 集群與數(shù)據(jù)同步任務(wù)的各項(xiàng)命令。

DM-master

DM-master 的入口代碼在 cmd/dm-master/main.go,其中主要操作包括:

調(diào)用 cfg.Parse 解析命令行參數(shù)與參數(shù)配置文件

調(diào)用 log.SetLevelByString 設(shè)置進(jìn)程的 log 輸出級(jí)別

調(diào)用 signal.Notify 注冊(cè)系統(tǒng) signal 通知,用于接受到指定信號(hào)時(shí)退出進(jìn)程等

調(diào)用 server.Start 啟動(dòng) RPC server,用于響應(yīng)來自 dmctl 與 DM-worker 的請(qǐng)求

在上面的操作中,可以看出其中最關(guān)鍵的是步驟 4,其對(duì)應(yīng)的實(shí)現(xiàn)代碼在 dm/master/server.go 中,其核心為 Server 這個(gè) struct,其中的主要 fields 包括:

rootLis, svr:監(jiān)聽網(wǎng)絡(luò)連接,分發(fā) RPC 請(qǐng)求給對(duì)應(yīng)的 handler。

workerClients:維護(hù)集群各 DM-worker ID 到對(duì)應(yīng)的 RPC client 的映射關(guān)系。

taskWorkers:維護(hù)用于執(zhí)行各同步(子)任務(wù)的 DM-worker ID 列表。

lockKeeper:管理在協(xié)調(diào)處理 sharding DDL 時(shí)的 lock 信息。

sqlOperatorHolder:管理手動(dòng) skip/replace 指定 sharding DDL 時(shí)的 SQL operator 信息。

在本篇文章中,我們暫時(shí)不會(huì)關(guān)注 lockKeepersqlOperatorHolder,其具體的功能與代碼實(shí)現(xiàn)會(huì)在后續(xù)相關(guān)文章中進(jìn)行介紹。

在 DM-master Server 的入口方法 Start 中:

通過 net.Listen 初始化 rootLis 并用于監(jiān)聽 TCP 連接(借助 soheilhy/cmux,我們?cè)谕粋€(gè) port 同時(shí)提供 gRPC 與 HTTP 服務(wù))。

根據(jù)讀取的配置信息(DeployMap),初始化用于連接到各 DM-worker 的 RPC client 并保存在 workerClients 中。

通過 pb.RegisterMasterServer 注冊(cè) gRPC server(svr),并將該 Server 作為各 services 的 implementation。

調(diào)用 m.Serve 開始提供服務(wù)。

DM-master 提供的 RPC 服務(wù)包括 DM 集群管理、同步任務(wù)管理等,對(duì)應(yīng)的 service 以 Protocol Buffers 格式定義在 dm/proto/dmmaster.proto 中,對(duì)應(yīng)的 generated 代碼在 dm/pb/dmmaster.pb.go 中。各 service 的具體實(shí)現(xiàn)在 dm/master/server.go 中(*Server)。

DM-worker

DM-worker 的結(jié)構(gòu)與 DM-master 類似,其入口代碼在 cmd/dm-worker/main.go 中。各 RPC services 的 Protocol Buffers 格式定義在 dm/proto/dmworker.proto 中,對(duì)應(yīng)的 generated 代碼在 dm/pb/dmworker.pb.go 中,對(duì)應(yīng)的實(shí)現(xiàn)代碼在 dm/worker/server.go 中(*Server)。DM-worker 的啟動(dòng)流程與 DM-master 類似,在此不再額外說明。

Server 這個(gè) struct 的主要 fields 除用于處理 RPC 的 rootLissvr 外,另一個(gè)是用于管理同步任務(wù)與 relay log 的 worker(相關(guān)代碼在 dm/worker/worker.go 中)。

Worker 這個(gè) struct 中,主要 fields 包括:

subTasks:維護(hù)該 DM-worker 上的所有同步子任務(wù)信息。

relayHolder:對(duì) relay 處理單元相關(guān)操作進(jìn)行簡(jiǎn)單封裝,轉(zhuǎn)發(fā)相關(guān)操作請(qǐng)求給 relay 處理單元,獲取 relay 處理單元的狀態(tài)信息。

relayPurger:根據(jù)用戶配置及相關(guān)策略,嘗試定期對(duì) relay log 進(jìn)行 purge 操作。

數(shù)據(jù)同步子任務(wù)管理的代碼實(shí)現(xiàn)主要在 dm/worker/subtask.go 中, relay 處理單元管理的代碼實(shí)現(xiàn)主要在 dm/worker/relay.go 中,對(duì) relay log 進(jìn)行 purge 操作的代碼實(shí)現(xiàn)主要在 relay/purger pkg 中。在本篇文章中,我們暫時(shí)只關(guān)注 DM 架構(gòu)相關(guān)的實(shí)現(xiàn),上述各功能的具體實(shí)現(xiàn)將在后續(xù)的相關(guān)文章中展開介紹。

Worker 的入口方法為 Start,其中的主要操作包括:

通過 w.relayHolder.Start 啟動(dòng) relay 處理單元,開始從上游拉取 binlog。

通過 w.relayPurger.Start 啟動(dòng)后臺(tái) purge 線程,嘗試對(duì) relay log 進(jìn)行定期 purge。

其他的操作主要還包括處理 Server 轉(zhuǎn)發(fā)而來的同步任務(wù)管理、relay 處理單元管理、狀態(tài)信息查詢等。

dmctl

dmctl 的入口代碼在 cmd/dm-ctl/main.go,其操作除參數(shù)解析與 signal 處理外,主要為調(diào)用 loop 進(jìn)入命令處理循環(huán)、等待用戶輸入操作命令。

loop 中,我們借助 chzyer/readline 提供命令行交互環(huán)境,讀取用戶輸入的命令并輸出命令執(zhí)行結(jié)果。一個(gè)命令的處理流程為:

調(diào)用 l.Readline 讀取用戶輸入的命令

判斷是否需要退出命令行交互環(huán)境(exit 命令)或需要進(jìn)行處理

調(diào)用 ctl.Start 進(jìn)行命令分發(fā)與處理

dmctl 的具體命令處理實(shí)現(xiàn)在 dm/ctl pkg 中,入口為 dm/ctl/ctl.go 中的 Start 方法,命令的分發(fā)與參數(shù)解析借助于 spf13/cobra。命令的具體功能實(shí)現(xiàn)在相應(yīng)的子 pkg 中:

master:dmctl 與 DM-master 交互的命令,是當(dāng)前 DM 推薦的命令交互方式。

worker:dmctl 與 DM-worker 交互的命令,主要用于開發(fā)過程中進(jìn)行 debug,當(dāng)前并沒有實(shí)現(xiàn)所有 DM-worker 支持的命令,未來可能廢棄。

common:多個(gè)命令依賴的通用操作及 dmctl 依賴的配置信息等。

每個(gè) dmctl 命令,其主要對(duì)應(yīng)的實(shí)現(xiàn)包括 3 個(gè)部分:

在各命令對(duì)應(yīng)的實(shí)現(xiàn)源文件中,通過 New***Cmd 形式的方法創(chuàng)建 cobra.Command 對(duì)象。

dm/ctl/ctl.go 中通過調(diào)用 rootCmd.AddCommand 添加該命令。

在各命令對(duì)應(yīng)的實(shí)現(xiàn)源文件中,通過 ***Func 形式的方法實(shí)現(xiàn)參數(shù)驗(yàn)證、RPC 調(diào)用等具體功能。

任務(wù)管理調(diào)用鏈?zhǔn)纠?/b>

讓我們用一個(gè)啟動(dòng)數(shù)據(jù)同步任務(wù)的操作示例來說明 DM 中的組件交互與 RPC 調(diào)用流程。

用戶在 dmctl 命令行交互環(huán)境中輸入 start-task 命令及相應(yīng)參數(shù)。

dmctl 在 dm/ctl/ctl.goStart 方法中進(jìn)行命令分發(fā),請(qǐng)求 dm/ctl/master/start_task.go 中的 startTaskFunc 處理命令。

startTaskFunc 通過 cli.StartTask 調(diào)用 DM-master 上的 RPC 方法。

DM-master 中的 Server.StartTask 方法(dm/master/server.go)響應(yīng)來自 dmctl 的 RPC 請(qǐng)求。

Server.StartworkerClients 中獲取任務(wù)對(duì)應(yīng) DM-worker 的 RPC client,并通過 cli.StartSubTask 調(diào)用 DM-worker 上的 RPC 方法。

DM-worker 中的 Server.StartSubTask 方法(dm/worker/server.go)響應(yīng)來自 DM-master 的 RPC 請(qǐng)求。

Server.StartSubTask 中將任務(wù)管理請(qǐng)求轉(zhuǎn)發(fā)給 Worker.StartSubTaskdm/worker/worker.go),并將處理結(jié)果通過 RPC 返回給 DM-master。

DM-master 將 DM-worker 返回的 RPC 響應(yīng)重新封裝后通過 RPC 返回給 dmctl。

dmctl 通過 common.PrettyPrintResponse 輸出命令操作的 RPC 響應(yīng)。

小結(jié)

在本篇文章中,我們主要介紹了 DM 的各個(gè)組件的入口函數(shù),最后以 dmctl 的 start-task 為例介紹了交互的調(diào)用流程細(xì)節(jié)。下一篇文章我們會(huì)開始介紹 DM-worker 組件內(nèi)各數(shù)據(jù)同步處理單元(relay-unit, dump-unit, load-unit, sync-unit)的設(shè)計(jì)原理與具體實(shí)現(xiàn)。

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

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

相關(guān)文章

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

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

    Mr_houzi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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