本文为 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 的入口代码在 , 其中主要操作包括:
调用 cfg.Parse 解析命令行参数与参数配置文件
调用 log.SetLevelByString 设置进程的 log 输出级别
调用 signal.Notify 注册系统 signal 通知, 用于接受到指定信号时退出进程等
调用 server.Start 启动 RPC server, 用于响应来自 dmctl 与 DM-worker 的请求
在上面的操作中, 可以看出其中最关键的是步骤 4, 其对应的实现代码在 中, 其核心为 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 信息.
来源: https://juejin.im/post/5c998d0ff265da611459c654