阅读时间 : 约 20 分钟
难度等级: ⭐⭐⭐⭐(中高级)
目录
-
- 背景
- 一、模块全景概览
- [二、所有模块清单 --- 进程归属与定位](#二、所有模块清单 — 进程归属与定位)
-
- [2.1 进程归属总表](#2.1 进程归属总表)
- [2.2 进程与模块组成全景图](#2.2 进程与模块组成全景图)
- 三、各模块详细介绍
-
- [3.1 cantiand --- 数据库主进程](#3.1 cantiand — 数据库主进程)
- [3.2 CMS --- 集群管理服务](#3.2 CMS — 集群管理服务)
- [3.3 DTC --- 分布式透明集群](#3.3 DTC — 分布式透明集群)
- [3.4 DRC --- 分布式资源目录](#3.4 DRC — 分布式资源目录)
- [3.5 DCS --- 分布式缓存服务](#3.5 DCS — 分布式缓存服务)
- [3.6 DLS --- 分布式锁服务](#3.6 DLS — 分布式锁服务)
- [3.7 Reform --- 集群重构](#3.7 Reform — 集群重构)
- [3.8 MES --- 消息交换服务](#3.8 MES — 消息交换服务)
- [3.9 protocol --- 网络协议层](#3.9 protocol — 网络协议层)
- [3.10 common --- 公共基础设施](#3.10 common — 公共基础设施)
- [3.11 TSE + CTC --- MySQL 适配层](#3.11 TSE + CTC — MySQL 适配层)
- [3.12 GSC + GSQL --- 客户端工具](#3.12 GSC + GSQL — 客户端工具)
- [3.13 version / upgrade_check --- 版本与升级](#3.13 version / upgrade_check — 版本与升级)
- 四、模块间交互关系总图
- 五、进程间通信方式汇总
- [六、共享内存 / 共享磁盘分布](#六、共享内存 / 共享磁盘分布)
背景
Cantian 是一个多进程、多插件的分布式数据库系统,其服务端框架由数据库主进程 cantiand、集群管理进程 CMS 以及 MySQL 适配插件 TSE/CTC 共同构成。各模块通过 MES 网络消息、UDS 本地通信和共享内存三种机制实现跨进程协作,形成完整的分布式计算与存储能力。
文章亮点:
- ✅ 全面梳理 Cantian 的 2 进程 + 1 插件 + 多工具架构,明确每个模块的进程归属
- ✅ 深度解析 DTC / DRC / DCS / DLS / Reform 五大集群模块的职责与交互关系
- ✅ 详解跨进程通信方式:MES 消息服务、UDS 本地通信、共享内存 IPC
- ✅ 包含 Mermaid 全景架构图与汇总速查表,便于快速索引
一、模块全景概览
Cantian 由 2 个独立进程 + 1 个插件库 + 多个客户端工具 组成。各模块以库形式链接到不同进程中,共享 common 基础设施和 protocol 协议层。
#mermaid-svg-fOSmb4NzzXRjmi4D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fOSmb4NzzXRjmi4D .error-icon{fill:#552222;}#mermaid-svg-fOSmb4NzzXRjmi4D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fOSmb4NzzXRjmi4D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fOSmb4NzzXRjmi4D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fOSmb4NzzXRjmi4D .marker.cross{stroke:#333333;}#mermaid-svg-fOSmb4NzzXRjmi4D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fOSmb4NzzXRjmi4D p{margin:0;}#mermaid-svg-fOSmb4NzzXRjmi4D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster-label text{fill:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster-label span{color:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster-label span p{background-color:transparent;}#mermaid-svg-fOSmb4NzzXRjmi4D .label text,#mermaid-svg-fOSmb4NzzXRjmi4D span{fill:#333;color:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D .node rect,#mermaid-svg-fOSmb4NzzXRjmi4D .node circle,#mermaid-svg-fOSmb4NzzXRjmi4D .node ellipse,#mermaid-svg-fOSmb4NzzXRjmi4D .node polygon,#mermaid-svg-fOSmb4NzzXRjmi4D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fOSmb4NzzXRjmi4D .rough-node .label text,#mermaid-svg-fOSmb4NzzXRjmi4D .node .label text,#mermaid-svg-fOSmb4NzzXRjmi4D .image-shape .label,#mermaid-svg-fOSmb4NzzXRjmi4D .icon-shape .label{text-anchor:middle;}#mermaid-svg-fOSmb4NzzXRjmi4D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fOSmb4NzzXRjmi4D .rough-node .label,#mermaid-svg-fOSmb4NzzXRjmi4D .node .label,#mermaid-svg-fOSmb4NzzXRjmi4D .image-shape .label,#mermaid-svg-fOSmb4NzzXRjmi4D .icon-shape .label{text-align:center;}#mermaid-svg-fOSmb4NzzXRjmi4D .node.clickable{cursor:pointer;}#mermaid-svg-fOSmb4NzzXRjmi4D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fOSmb4NzzXRjmi4D .arrowheadPath{fill:#333333;}#mermaid-svg-fOSmb4NzzXRjmi4D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fOSmb4NzzXRjmi4D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fOSmb4NzzXRjmi4D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fOSmb4NzzXRjmi4D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fOSmb4NzzXRjmi4D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fOSmb4NzzXRjmi4D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster text{fill:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D .cluster span{color:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fOSmb4NzzXRjmi4D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fOSmb4NzzXRjmi4D rect.text{fill:none;stroke-width:0;}#mermaid-svg-fOSmb4NzzXRjmi4D .icon-shape,#mermaid-svg-fOSmb4NzzXRjmi4D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fOSmb4NzzXRjmi4D .icon-shape p,#mermaid-svg-fOSmb4NzzXRjmi4D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fOSmb4NzzXRjmi4D .icon-shape .label rect,#mermaid-svg-fOSmb4NzzXRjmi4D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fOSmb4NzzXRjmi4D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fOSmb4NzzXRjmi4D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fOSmb4NzzXRjmi4D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MES 网络
UDS 本地
共享内存/IPC
TCP/UDS
客户端
GSC 驱动
C客户端库
GSQL 工具
命令行客户端
MySQL 进程
TSE
Tianchi存储引擎
MySQL适配层
CTC 插件
Cantian连接器
CMS 独立进程
cms
集群管理核心
MES (CMS侧)
消息交换服务
protocol
common
cantiand 主进程
server
服务框架
Listener/Reactor/Agent
kernel 内核
存储/事务/索引/恢复
cmd
SQL 引擎
DTC
分布式透明集群
DRC
分布式资源目录
DCS
分布式缓存服务
DLS
分布式锁服务
Reform
集群重构
MES (cantiand侧)
消息交换服务
protocol
common
二、所有模块清单 --- 进程归属与定位
2.1 进程归属总表
| 模块 | 全称 | 形态 | 所属进程 | 源码目录 |
|---|---|---|---|---|
| cantiand | Cantian Database Daemon | 独立进程 | --- (主程序) | pkg/src/server/ |
| server | Server Framework | 库 | cantiand 内部 | pkg/src/server/ |
| kernel | Kernel Engine | 库 | cantiand 内部 | pkg/src/kernel/ |
| cmd | SQL Command Interface | 库 | cantiand 内部 | pkg/src/cmd/ |
| DTC | Distributed Transparent Cluster | 库 | cantiand 内部 | pkg/src/cluster/ |
| DRC | Distributed Resource Catalog | 库 | cantiand 内部 | pkg/src/cluster/ |
| DCS | Distributed Cache Service | 库 | cantiand 内部 | pkg/src/cluster/ |
| DLS | Distributed Lock Service | 库 | cantiand 内部 | pkg/src/cluster/ |
| Reform | Cluster Reformation | 库 | cantiand 内部 | pkg/src/cluster/ + pkg/src/rc/ |
| MES | Message Exchange Service | 库 | cantiand 内部 + CMS 内部 | pkg/src/mec/ |
| protocol | Network Protocol Layer | 库 | cantiand + CMS 内部 | pkg/src/protocol/ |
| common | Common Infrastructure | 库 | 所有进程 | pkg/src/common/ |
| CMS | Cluster Management Service | 独立进程 | --- (cms 可执行文件) | pkg/src/cms/ |
| TSE | Tianchi Storage Engine | MySQL插件库 | MySQL 进程内 | pkg/src/tse/ |
| CTC | Cantian Transactional Connector | MySQL插件库 | MySQL 进程内 | pkg/src/ctc/ |
| GSC | C Client Driver | 客户端库 | 用户应用程序内 | pkg/src/driver/gsc/ |
| GSQL | SQL Command Line Tool | 独立可执行文件 | --- (gsql 可执行文件) | pkg/src/utils/gsql/ |
| version | Version Management | 库 | 所有程序(编译时) | pkg/src/version/ |
| upgrade_check | Upgrade Compatibility | 编译时检查 | --- (编译时静态断言) | pkg/src/upgrade_check/ |
2.2 进程与模块组成全景图
#mermaid-svg-BZBwe41ApLRY0u5e{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BZBwe41ApLRY0u5e .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BZBwe41ApLRY0u5e .error-icon{fill:#552222;}#mermaid-svg-BZBwe41ApLRY0u5e .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BZBwe41ApLRY0u5e .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BZBwe41ApLRY0u5e .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BZBwe41ApLRY0u5e .marker.cross{stroke:#333333;}#mermaid-svg-BZBwe41ApLRY0u5e svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BZBwe41ApLRY0u5e p{margin:0;}#mermaid-svg-BZBwe41ApLRY0u5e .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BZBwe41ApLRY0u5e .cluster-label text{fill:#333;}#mermaid-svg-BZBwe41ApLRY0u5e .cluster-label span{color:#333;}#mermaid-svg-BZBwe41ApLRY0u5e .cluster-label span p{background-color:transparent;}#mermaid-svg-BZBwe41ApLRY0u5e .label text,#mermaid-svg-BZBwe41ApLRY0u5e span{fill:#333;color:#333;}#mermaid-svg-BZBwe41ApLRY0u5e .node rect,#mermaid-svg-BZBwe41ApLRY0u5e .node circle,#mermaid-svg-BZBwe41ApLRY0u5e .node ellipse,#mermaid-svg-BZBwe41ApLRY0u5e .node polygon,#mermaid-svg-BZBwe41ApLRY0u5e .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BZBwe41ApLRY0u5e .rough-node .label text,#mermaid-svg-BZBwe41ApLRY0u5e .node .label text,#mermaid-svg-BZBwe41ApLRY0u5e .image-shape .label,#mermaid-svg-BZBwe41ApLRY0u5e .icon-shape .label{text-anchor:middle;}#mermaid-svg-BZBwe41ApLRY0u5e .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BZBwe41ApLRY0u5e .rough-node .label,#mermaid-svg-BZBwe41ApLRY0u5e .node .label,#mermaid-svg-BZBwe41ApLRY0u5e .image-shape .label,#mermaid-svg-BZBwe41ApLRY0u5e .icon-shape .label{text-align:center;}#mermaid-svg-BZBwe41ApLRY0u5e .node.clickable{cursor:pointer;}#mermaid-svg-BZBwe41ApLRY0u5e .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BZBwe41ApLRY0u5e .arrowheadPath{fill:#333333;}#mermaid-svg-BZBwe41ApLRY0u5e .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BZBwe41ApLRY0u5e .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BZBwe41ApLRY0u5e .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZBwe41ApLRY0u5e .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BZBwe41ApLRY0u5e .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZBwe41ApLRY0u5e .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BZBwe41ApLRY0u5e .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BZBwe41ApLRY0u5e .cluster text{fill:#333;}#mermaid-svg-BZBwe41ApLRY0u5e .cluster span{color:#333;}#mermaid-svg-BZBwe41ApLRY0u5e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BZBwe41ApLRY0u5e .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BZBwe41ApLRY0u5e rect.text{fill:none;stroke-width:0;}#mermaid-svg-BZBwe41ApLRY0u5e .icon-shape,#mermaid-svg-BZBwe41ApLRY0u5e .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZBwe41ApLRY0u5e .icon-shape p,#mermaid-svg-BZBwe41ApLRY0u5e .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BZBwe41ApLRY0u5e .icon-shape .label rect,#mermaid-svg-BZBwe41ApLRY0u5e .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZBwe41ApLRY0u5e .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BZBwe41ApLRY0u5e .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BZBwe41ApLRY0u5e :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MES 网络消息
CMS_MSG_REQ_*/RES_*
心跳/投票/IOFENCE
UDS 本地消息
cms_res_inst_register
状态通知
共享内存 / IPC
SQL代理 / DDL广播
TCP / UDS
SQL请求
GSQL --- 客户端工具
GSQL: SQL执行/EXPORT/IMPORT/WSR
GSC 客户端驱动
MySQL --- 第三方数据库进程
TSE + CTC: Cantian存储引擎插件
MySQL Server
CMS --- 集群管理独立进程
CMS 核心: GCC/心跳/投票/IOFENCE/资源脚本
MES (CMS侧)
protocol + common
cantiand --- 数据库主进程
server: Listener/Reactor/Agent/Session/SGA
kernel: 存储/事务/索引/持久化/catalog
cmd: SQL引擎/CBO/表达式
DTC + DRC + DCS + DLS + Reform
MES (cantiand侧)
protocol + common
三、各模块详细介绍
3.1 cantiand --- 数据库主进程
形态 : 独立进程(可执行文件 cantiand)
源码 : pkg/src/server/
启动入口 : main() 位于 srv_main.c
cantiand 是 Cantian 的核心数据库进程,内部链接了大量库模块。其全局实例为 instance_t(定义于 srv_instance.h),聚合以下子系统:
instance_t
├── knl_instance_t kernel --- 内核实例(存储/事务/索引/恢复)
├── sql_instance_t sql --- SQL 引擎
├── sga_t sga --- 共享全局区(Buffer Pool/Log Buffer/Shared Pool)
├── lsnr_t lsnr --- 网络监听器(TCP/UDS/IPC)
├── reactor_pool_t reactor_pool --- Reactor 网络模型(epoll 事件循环)
├── session_pool_t session_pool --- 会话池
├── rm_pool_t rm_pool --- 资源管理器池
├── config_t config --- 参数管理
├── shutdown_ctx_t shutdown_ctx --- 关闭上下文
├── DTC/DRC/DCS/DLS/Reform --- 集群分布式模块(库链接)
└── MES/protocol/common --- 基础设施
3.2 CMS --- 集群管理服务
形态 : 独立进程 (可执行文件 cms),与 cantiand 分属不同进程
源码 : pkg/src/cms/
启动入口 : main() 位于 cms/cms_main.c
| 属性 | 说明 |
|---|---|
| 进程模型 | 独立进程,26+ 个工作线程 |
| 共享存储 | 使用 GCC 共享磁盘(非 System V shm),5 区段布局(gcc_storage + cluster_stat + res_data + res_lock + vote_data) |
| 与cantiand通信 | UDS(Unix Domain Socket):cantiand 通过 cms_cli_init / cms_res_inst_register 注册到 CMS |
| 节点间通信 | MES 网络消息:CMS_MSG_REQ_HB(心跳)、CMS_MSG_REQ_STAT_CHG(状态变更)、CMS_MSG_REQ_IOF_KICK(IO FENCE) |
| 启动方式 | cms server -start 命令行 |
| 退出方式 | cms server -stop 命令行 或 脑裂仲裁自杀 |
核心功能:
- 集群成员管理:通过 GCC(Global Cluster Configuration)共享磁盘维护节点/资源/资源组
- 心跳双通道:MES 网络心跳(100ms 周期)+ 共享磁盘心跳双重检测
- 脑裂仲裁:最大团算法(Bron-Kerbosch),多级选举策略(节点最多 > 在线最多 > joined 最多 > ID 最小)
- IO FENCE 隔离:对不在获胜团的节点执行踢出
- 资源生命周期:通过执行脚本管理资源启动/停止/检查/重启
- 状态通知:通过 UDS 向 cantiand 实时推送集群状态变更
3.3 DTC --- 分布式透明集群
形态 : 库模块 ,链接到 cantiand 进程内部
源码 : pkg/src/cluster/目录下 47 个文件(以 dtc_ 为前缀)
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部(非独立进程) |
| 全局变量 | g_dtc_instance (static) + g_dtc 全局指针 |
| 专用线程 | 4 个:dmon(SCN 广播)、drc_buf_res_recycle(资源回收)、recovery(集群恢复)、remaster(资源重分布) |
| 消息处理 | 5 个 MES 消息处理组(Group 0-4),Group 4 为 DDL 序列化单线程 |
| 交互方向 | 交互方式 | 说明 |
|---|---|---|
| DTC → DRC | 直接函数调用 | drc_init()、drc_request_page_owner() |
| DTC → DCS | MES 消息注册 | dcs_process_ask_master_for_page 注册为 MES 处理器 |
| DTC → DLS | MES 消息注册 | dls_process_lock_msg 注册为 MES 处理器 |
| DTC → MES | 直接函数调用 | mes_startup()、mes_broadcast() |
| DTC → CMS | 回调函数 | 通过 reform_ctx_t 集成,init_cms_rc() 注册 CMS 回调 |
| DTC → Kernel | 指针直接访问 | 通过 g_dtc->kernel 访问内核实例 |
3.4 DRC --- 分布式资源目录
形态 : 库模块 ,链接到 cantiand 进程内部
源码: pkg/src/cluster/dtc_drc.h/c+ dtc_drc_util.h/c
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部 |
| 全局变量 | g_drc_res_ctx |
| 管理的资源 | 6 种:Page Buffer / Lock / LocalLock / Txn / LocalTxn / LockItem |
| 分片机制 | 1024 个 Part,page_id → ext_no → BKDR hash → partition |
与 DCS/DLS 的交互:
- DCS 通过
drc_request_page_owner()/drc_claim_page_owner()管理页面所有权 - DLS 通过
drc_request_lock_owner()/drc_claim_lock_owner()管理分布式锁
Remaster 资源重分布:6 阶段状态机(PREPARE → ASSIGN_TASK → MIGRATE → RECOVERY → PUBLISH → DONE),支持 8 线程并发迁移。
3.5 DCS --- 分布式缓存服务
形态 : 库模块 ,链接到 cantiand 进程内部
源码: pkg/src/cluster/dtc_dcs.h/c
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部 |
| 核心协议 | 三级消息缓存一致性:Requester ↔ Master ↔ Owner |
| 页面所有权 | Master 仲裁、Owner 持有、Requester 请求 |
| EDP 管理 | 6 种脏页标志位,CKPT 时触发 EDP 清理 |
与 Buffer 交互:通过 buf_ctrl_t 结构的分布式扩展字段(lock_mode / is_edp / is_remote_dirty / transfer_status)管理页面分布式状态。
3.6 DLS --- 分布式锁服务
形态 : 库模块 ,链接到 cantiand 进程内部
源码: pkg/src/cluster/dtc_dls.h/c
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部 |
| 锁类型 | 4 种:Spinlock / Latch(S/X) / TableLock / TXN 事务锁 |
| 消息类型 | 9 种 MES 锁命令(REQUEST_LOCK、RELEASE_LOCK、CLAIM_LOCK 等) |
| 死锁检测 | 7 种 MES 命令,集群级等待图构建与环检测 |
分布式化:当 clustered=true 时,内核的 cm_spin_lock / cm_latch_s/x 替换为 dls_spin_lock / dls_latch_s/x,自动走 DRC 分布式路径。
3.7 Reform --- 集群重构
形态 : 库模块 ,集成在 DTC 内部(reform_ctx_t 字段)
源码: pkg/src/cluster/dtc_reform.h/c+ pkg/src/rc/
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部 |
| 状态机 | REFORM_PREPARE → FROZEN → REMOUNTING → RECOVERING → OPEN → DONE |
| Master 选举 | CMS 框架下,最小 node_id 成为 Master |
| 集群冻结 | 暂停页面请求、锁请求、新事务 |
| 触发条件 | 节点加入/退出/故障/全量重启 |
与 CMS 交互:通过 reform_ctx_t 中 CMS 注册的回调函数,接收 CMS 的状态变更通知。
3.8 MES --- 消息交换服务
形态 : 库模块 ,同时链接到 cantiand 和 CMS 两个独立进程
源码: pkg/src/mec/
| 属性 | 说明 |
|---|---|
| 进程归属 | cantiand 内部 + CMS 内部(两个进程各自链接 MES 库) |
| 跨越进程 | cantiand 的 MES 与 CMS 的 MES 通过 TCP/SSL/RDMA 网络互相通信 |
| 线程模型 | Reactor + Worker Thread Pool(消息池 8 级 chunk × 255 队列) |
| 传输协议 | VIO 调度表支持 TCP / SSL / UC(RDMA) 三种传输 |
| 消息类型 | 200+ 个 MES 命令:页面请求、锁请求、事务、DDL、CKPT、死锁检测、GDV 等 |
MES 是连接 cantiand 与 CMS 两个独立进程的桥梁------两个进程各自运行 MES 实例,通过网络层交换消息。
3.9 protocol --- 网络协议层
形态 : 库模块 ,cantiand 和 CMS 各自链接
源码: pkg/src/protocol/
提供 VIO 调度表、TCP/RDMA/SSL/UDS/IPC 多传输协议、包序列化(cs_packet_t)等统一网络抽象。
3.10 common --- 公共基础设施
形态 : 库模块 ,所有进程和工具 共享
源码: pkg/src/common/91 个头文件
提供类型系统(cm_*)、内存管理、同步原语(互斥锁/条件变量/信号量/原子操作)、数据结构(链表/哈希表/红黑树/位图)、日志系统、文件 I/O、加密算法等基础能力。
3.11 TSE + CTC --- MySQL 适配层
形态 : MySQL 存储引擎插件库 ,运行在 MySQL 进程内
源码: pkg/src/tse/+ pkg/src/ctc/
| 属性 | 说明 |
|---|---|
| 进程归属 | MySQL 进程内部 |
| 与 cantiand 通信 | 共享内存 / IPC 管道(SHM_CTC 协议),非 TCP 网络 |
| 功能 | MySQL Handler API 实现、SQL 代理转发、DDL 广播通知 |
TSE/CTC 作为 MySQL 的存储引擎插件加载,MySQL 的 SQL 层处理语法解析和优化,存储引擎层通过共享内存将请求转发到 cantiand。
3.12 GSC + GSQL --- 客户端工具
| 模块 | 形态 | 说明 |
|---|---|---|
| GSC | C 客户端库 | 链接到用户程序,提供连接/语句/LOB/XA/HA API |
| GSQL | 独立可执行文件 | 命令行 SQL 工具,支持交互执行/EXPORT/IMPORT/DUMP/LOAD/WSR |
通过 TCP 或 UDS 连接到 cantiand 的 Listener 端口。
3.13 version / upgrade_check --- 版本与升级
| 模块 | 形态 | 说明 |
|---|---|---|
| version | 库(编译时注入) | 通过 CMake 构建管道将版本字符串注入所有可执行文件 |
| upgrade_check | 编译时静态断言 | CM_STATIC_ASSERT 验证 34+ 个关键结构体大小,确保升级兼容 |
四、模块间交互关系总图
#mermaid-svg-xOuabZZDlEB02G8z{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xOuabZZDlEB02G8z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xOuabZZDlEB02G8z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xOuabZZDlEB02G8z .error-icon{fill:#552222;}#mermaid-svg-xOuabZZDlEB02G8z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xOuabZZDlEB02G8z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xOuabZZDlEB02G8z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xOuabZZDlEB02G8z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xOuabZZDlEB02G8z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xOuabZZDlEB02G8z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xOuabZZDlEB02G8z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xOuabZZDlEB02G8z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xOuabZZDlEB02G8z .marker.cross{stroke:#333333;}#mermaid-svg-xOuabZZDlEB02G8z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xOuabZZDlEB02G8z p{margin:0;}#mermaid-svg-xOuabZZDlEB02G8z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xOuabZZDlEB02G8z .cluster-label text{fill:#333;}#mermaid-svg-xOuabZZDlEB02G8z .cluster-label span{color:#333;}#mermaid-svg-xOuabZZDlEB02G8z .cluster-label span p{background-color:transparent;}#mermaid-svg-xOuabZZDlEB02G8z .label text,#mermaid-svg-xOuabZZDlEB02G8z span{fill:#333;color:#333;}#mermaid-svg-xOuabZZDlEB02G8z .node rect,#mermaid-svg-xOuabZZDlEB02G8z .node circle,#mermaid-svg-xOuabZZDlEB02G8z .node ellipse,#mermaid-svg-xOuabZZDlEB02G8z .node polygon,#mermaid-svg-xOuabZZDlEB02G8z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xOuabZZDlEB02G8z .rough-node .label text,#mermaid-svg-xOuabZZDlEB02G8z .node .label text,#mermaid-svg-xOuabZZDlEB02G8z .image-shape .label,#mermaid-svg-xOuabZZDlEB02G8z .icon-shape .label{text-anchor:middle;}#mermaid-svg-xOuabZZDlEB02G8z .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xOuabZZDlEB02G8z .rough-node .label,#mermaid-svg-xOuabZZDlEB02G8z .node .label,#mermaid-svg-xOuabZZDlEB02G8z .image-shape .label,#mermaid-svg-xOuabZZDlEB02G8z .icon-shape .label{text-align:center;}#mermaid-svg-xOuabZZDlEB02G8z .node.clickable{cursor:pointer;}#mermaid-svg-xOuabZZDlEB02G8z .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xOuabZZDlEB02G8z .arrowheadPath{fill:#333333;}#mermaid-svg-xOuabZZDlEB02G8z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xOuabZZDlEB02G8z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xOuabZZDlEB02G8z .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xOuabZZDlEB02G8z .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xOuabZZDlEB02G8z .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xOuabZZDlEB02G8z .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xOuabZZDlEB02G8z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xOuabZZDlEB02G8z .cluster text{fill:#333;}#mermaid-svg-xOuabZZDlEB02G8z .cluster span{color:#333;}#mermaid-svg-xOuabZZDlEB02G8z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xOuabZZDlEB02G8z .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xOuabZZDlEB02G8z rect.text{fill:none;stroke-width:0;}#mermaid-svg-xOuabZZDlEB02G8z .icon-shape,#mermaid-svg-xOuabZZDlEB02G8z .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xOuabZZDlEB02G8z .icon-shape p,#mermaid-svg-xOuabZZDlEB02G8z .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xOuabZZDlEB02G8z .icon-shape .label rect,#mermaid-svg-xOuabZZDlEB02G8z .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xOuabZZDlEB02G8z .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xOuabZZDlEB02G8z .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xOuabZZDlEB02G8z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端
MySQL 进程
CMS 进程
cantiand 进程
TCP/SSL/RDMA
UDS
共享内存/IPC
TCP/UDS
TCP/UDS
server
服务框架
kernel
存储/事务/索引
cmd
SQL引擎
DTC
DRC
DCS
DLS
Reform
MES
CMS 核心
MES
TSE + CTC
GSC
GSQL
common
common
五、进程间通信方式汇总
| 通信方向 | 方式 | 协议 | 数据流向 |
|---|---|---|---|
| cantiand → cantiand | 直接函数调用 / MES 网络 | 内存 / TCP/RDMA | 同进程内 / 跨节点 |
| cantiand ↔ CMS | UDS + MES 网络 | CMS_CLI_MSG_* / CMS_MSG_* |
本机 UDS + 跨节点 TCP |
| MySQL ↔ cantiand | 共享内存 + IPC | SHM_CTC 协议 | 本机共享内存 |
| 客户端 → cantiand | TCP / UDS | Cantian 自有协议 | 本机或远程 |
| CMS ↔ CMS | MES 网络 | CMS_MSG_REQ_*/RES_* |
跨节点 TCP |
| cantiand 跨节点 | MES 网络 | 200+ MES 命令 | 跨节点 TCP/RDMA |
六、共享内存 / 共享磁盘分布
| 资源 | 所有者 | 访问方式 | 说明 |
|---|---|---|---|
| SGA (Buffer Pool) | cantiand 进程 | 多线程共享(同进程内) | data_buf / log_buf / shared_pool |
| GCC 共享磁盘 | CMS 进程 | 多 CMS 进程共享磁盘 | 5 区段:gcc + stat + res_data + res_lock + vote |
| CTC 共享内存 | cantiand + MySQL | 本机 System V shm | MySQL ↔ cantiand 通信 |
| DRC 资源池 | cantiand 进程 | 同进程内多线程访问 | global_buf_res / global_lock_res |
| MES 消息池 | cantiand / CMS 各自 | 各自进程内部 | 消息缓冲区预分配 |
关键区别:cantiand 使用 SGA(Shared Global Area)作为同进程多线程共享内存;CMS 使用 GCC 共享磁盘作为跨进程的数据交换媒介。cantiand 的 DRC 资源池是内部的多线程共享结构,不与 CMS 共享内存页。