【参天引擎】Cantian 服务端框架全景解析:进程架构、模块组成与交互关系

阅读时间 : 约 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 --- 消息交换服务

形态 : 库模块 ,同时链接到 cantiandCMS 两个独立进程

源码: 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 --- 网络协议层

形态 : 库模块cantiandCMS 各自链接

源码: 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 共享内存页。

相关推荐
Listen·Rain1 小时前
数据库流式查询
java·数据库
雨辰AI1 小时前
生产级实战:人大金仓 V9 标准化运维手册(日常巡检 + 监控告警 + 应急处置)
java·运维·数据库·后端
Sinclair2 小时前
认识安企CMS-核心功能亮点
架构·开源
“码”力全开2 小时前
AI视频分析误报优化完整流程
算法·架构·边缘计算
阿拉斯攀登2 小时前
向量数据库选型:Milvus vs Chroma vs Elasticsearch
数据库·elasticsearch·milvus·知识库·rag·个人知识库
彦为君3 小时前
Redis最新版本特性
java·数据库·redis·算法·bootstrap
vigor5123 小时前
MySQL通过Mango实现分库分表
android·数据库·mysql
JouYY3 小时前
聊一下知识答疑Agent的“层次聚类”流程
架构·llm·agent