日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DM 源码阅读系列文章(二)整体架构介绍

發布時間:2025/3/18 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DM 源码阅读系列文章(二)整体架构介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

作者:張學程

本文為 DM 源碼閱讀系列文章的第二篇,第一篇文章 簡單介紹了 DM 源碼閱讀的目的和規劃,以及 DM 的源碼結構以及工具鏈。從本篇文章開始,我們會正式開始閱讀 DM 的源碼。

本篇文章主要介紹 DM 的整體架構,包括 DM 有哪些組件、各組件分別實現什么功能、組件之間交互的數據模型和 RPC 實現。

整體架構

通過上面的 DM 架構圖,我們可以看出,除上下游數據庫及 Prometheus 監控組件外,DM 自身有 DM-master、DM-worker 及 dmctl 這 3 個組件。其中,DM-master 負責管理和調度數據同步任務的各項操作,DM-worker 負責執行具體的數據同步任務,dmctl 提供用于管理 DM 集群與數據同步任務的各項命令。

DM-master

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

  • 調用 cfg.Parse 解析命令行參數與參數配置文件

  • 調用 log.SetLevelByString 設置進程的 log 輸出級別

  • 調用 signal.Notify 注冊系統 signal 通知,用于接受到指定信號時退出進程等

  • 調用 server.Start 啟動 RPC server,用于響應來自 dmctl 與 DM-worker 的請求

  • 在上面的操作中,可以看出其中最關鍵的是步驟 4,其對應的實現代碼在 dm/master/server.go 中,其核心為 Server 這個 struct,其中的主要 fields 包括:

    • rootLis, svr:監聽網絡連接,分發 RPC 請求給對應的 handler。

    • workerClients:維護集群各 DM-worker ID 到對應的 RPC client 的映射關系。

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

    • lockKeeper:管理在協調處理 sharding DDL 時的 lock 信息。

    • sqlOperatorHolder:管理手動 skip/replace 指定 sharding DDL 時的 SQL operator 信息。

    在本篇文章中,我們暫時不會關注 lockKeeper 與 sqlOperatorHolder,其具體的功能與代碼實現會在后續相關文章中進行介紹。

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

  • 通過 net.Listen 初始化 rootLis 并用于監聽 TCP 連接(借助 soheilhy/cmux,我們在同一個 port 同時提供 gRPC 與 HTTP 服務)。

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

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

  • 調用 m.Serve 開始提供服務。

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

    DM-worker

    DM-worker 的結構與 DM-master 類似,其入口代碼在 cmd/dm-worker/main.go 中。各 RPC services 的 Protocol Buffers 格式定義在 dm/proto/dmworker.proto 中,對應的 generated 代碼在 dm/pb/dmworker.pb.go 中,對應的實現代碼在 dm/worker/server.go 中(*Server)。DM-worker 的啟動流程與 DM-master 類似,在此不再額外說明。

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

    在 Worker 這個 struct 中,主要 fields 包括:

    • subTasks:維護該 DM-worker 上的所有同步子任務信息。

    • relayHolder:對 relay 處理單元相關操作進行簡單封裝,轉發相關操作請求給 relay 處理單元,獲取 relay 處理單元的狀態信息。

    • relayPurger:根據用戶配置及相關策略,嘗試定期對 relay log 進行 purge 操作。

    數據同步子任務管理的代碼實現主要在 dm/worker/subtask.go 中, relay 處理單元管理的代碼實現主要在 dm/worker/relay.go 中,對 relay log 進行 purge 操作的代碼實現主要在 relay/purger pkg 中。在本篇文章中,我們暫時只關注 DM 架構相關的實現,上述各功能的具體實現將在后續的相關文章中展開介紹。

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

  • 通過 w.relayHolder.Start 啟動 relay 處理單元,開始從上游拉取 binlog。

  • 通過 w.relayPurger.Start 啟動后臺 purge 線程,嘗試對 relay log 進行定期 purge。

  • 其他的操作主要還包括處理 Server 轉發而來的同步任務管理、relay 處理單元管理、狀態信息查詢等。

    dmctl

    dmctl 的入口代碼在 cmd/dm-ctl/main.go,其操作除參數解析與 signal 處理外,主要為調用 loop 進入命令處理循環、等待用戶輸入操作命令。

    在 loop 中,我們借助 chzyer/readline 提供命令行交互環境,讀取用戶輸入的命令并輸出命令執行結果。一個命令的處理流程為:

  • 調用 l.Readline 讀取用戶輸入的命令

  • 判斷是否需要退出命令行交互環境(exit 命令)或需要進行處理

  • 調用 ctl.Start 進行命令分發與處理

  • dmctl 的具體命令處理實現在 dm/ctl pkg 中,入口為 dm/ctl/ctl.go 中的 Start 方法,命令的分發與參數解析借助于 spf13/cobra。命令的具體功能實現在相應的子 pkg 中:

    • master:dmctl 與 DM-master 交互的命令,是當前 DM 推薦的命令交互方式。

    • worker:dmctl 與 DM-worker 交互的命令,主要用于開發過程中進行 debug,當前并沒有實現所有 DM-worker 支持的命令,未來可能廢棄。

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

    每個 dmctl 命令,其主要對應的實現包括 3 個部分:

  • 在各命令對應的實現源文件中,通過 New***Cmd 形式的方法創建 cobra.Command 對象。

  • 在 dm/ctl/ctl.go 中通過調用 rootCmd.AddCommand 添加該命令。

  • 在各命令對應的實現源文件中,通過 ***Func 形式的方法實現參數驗證、RPC 調用等具體功能。

  • 任務管理調用鏈示例

    讓我們用一個啟動數據同步任務的操作示例來說明 DM 中的組件交互與 RPC 調用流程。

  • 用戶在 dmctl 命令行交互環境中輸入 start-task 命令及相應參數。

  • dmctl 在 dm/ctl/ctl.go 的 Start 方法中進行命令分發,請求 dm/ctl/master/start_task.go 中的 startTaskFunc 處理命令。

  • startTaskFunc 通過 cli.StartTask 調用 DM-master 上的 RPC 方法。

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

  • Server.Start 從 workerClients 中獲取任務對應 DM-worker 的 RPC client,并通過 cli.StartSubTask 調用 DM-worker 上的 RPC 方法。

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

  • Server.StartSubTask 中將任務管理請求轉發給 Worker.StartSubTask(dm/worker/worker.go),并將處理結果通過 RPC 返回給 DM-master。

  • DM-master 將 DM-worker 返回的 RPC 響應重新封裝后通過 RPC 返回給 dmctl。

  • dmctl 通過 common.PrettyPrintResponse 輸出命令操作的 RPC 響應。

  • 小結

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

    轉載于:https://my.oschina.net/zhaiyuan/blog/3027804

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的DM 源码阅读系列文章(二)整体架构介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线天堂中文在线资源网 | 软萌小仙自慰喷白浆 | 国产亚洲精品美女久久久久 | 国内视频一区 | 欧美一级片一区二区 | 六月婷婷七月丁香 | 中文幕无线码中文字夫妻 | 成人区精品一区二区婷婷 | 丝袜 亚洲 另类 国产 制服 | 久久青青草原 | 成年人免费视频网站 | 美女av免费看| 日本一区二区视频免费 | 日韩亚洲在线 | 一区二区三区在线观看av | 一区二区三区四区精品视频 | 欧美美女性高潮 | 一级黄色片毛片 | 亚洲成人中文字幕 | 久久精品无码人妻 | 国产免费看| 青娱乐在线视频观看 | 中文字幕在线免费看 | 少妇太紧太爽又黄又硬又爽 | 日本成人一区二区三区 | 无码人妻丰满熟妇奶水区码 | 午夜av导航| 4hu在线观看| 成人av无码一区二区三区 | 国产精品久久久久久av | 亚洲视频黄色 | 精品一区二区三区在线播放 | 日韩男女视频 | 桃色视频网站 | jizz黄色片| 97香蕉视频 | 草草在线免费视频 | 国产一卡二卡三卡 | 婷婷开心激情 | 国产一卡二卡在线 | 好吊妞操 | 亚洲午夜无码久久久久 | 制服下的诱惑暮生 | 一区免费视频 | 中文字幕亚洲高清 | 成人爱爱网站 | 欧美日韩精品中文字幕 | 亚洲成人免费在线 | www.色黄| 欧美一区二区三区久久妖精 | 在线观看欧美日韩视频 | 日韩熟女精品一区二区三区 | 亚洲av毛片一区二二区三三区 | 成年人视频在线观看免费 | 成年人毛片视频 | 日本一道本 | 欧美xxxx性 | 和漂亮岳做爰3中文字幕 | 亚洲逼图| 特黄特色特刺激免费播放 | 日韩精品av一区二区三区 | 国产精品国产一区二区三区四区 | 日韩成人一区 | 一出一进一爽一粗一大视频 | 蜜桃视频中文字幕 | 中文字幕一区二区人妻视频 | 女王脚交玉足榨精调教 | wwwxxx日本| 精品在线看| 欧美伦理一区二区 | 欧美aaa一级片 | 一级片免费网站 | 激情视频免费在线观看 | 激情午夜av | 亚洲大尺度在线 | 日韩精品成人无码专区免费 | 污色视频 | 完全免费av| 看全色黄大色黄女片18 | 午夜伦理剧场 | 亚洲系列在线 | 超碰不卡| 亚洲精品69 | 国产情侣自拍一区 | 丰满人妻综合一区二区三区 | 亚洲青涩| 丰满人妻一区二区三区大胸 | 91精品国产一区二区三区蜜臀 | 欧美日韩免费高清 | 午夜极品视频 | 物业福利视频 | 国产真实伦对白全集 | 免费毛片视频网站 | 吊视频一区二区三区 | 在线观看成人一区 | 九九九免费 | 精品视频在线免费观看 | 国产欧美日韩激情 | 免费三片在线播放 |