JDDL 核心实现原理与架构解析1. 简介JDDL(JingDong Data Layer)是京东开源的一款客户端分库分表中间件。目前主要以 Client 模式运行,作为 JDBC 驱动的增强版直接嵌入在业务应用中。其核心目标是解决海量数据下的单机关系型数据库性能瓶颈,对业务提供透明的分库分表、读写分离、分布式主键生成等能力。
- 核心架构(三层模型)JDDL 的核心架构采用了经典的 Matrix -> Group -> Atom 三层模型:
Matrix 层(分库分表层):最上层的入口,负责实现 JDBC 规范(如TConnection、TStatement、TResultSet)。它拦截用户的 SQL,调用 Parser 和 Rule 引擎进行路由计算,最终将请求分发给底层的 Group 节点。
Group 层(高可用与读写分离层):主要负责物理集群中的主从复制、读写分离、负载均衡和主备切换(如DBSelector,TGroupStatement等)。对上屏蔽了数据库主从节点的变化。
Atom 层(物理数据源层):最底层,负责管理单一物理数据库的连接池(如TAtomDataSource)。它处理具体的连接创建、状态监控、物理配置解析等。
- 核心执行流程与模块解析一次完整的 SQL 执行流程通常会经过:JDBC 拦截 -> SQL 解析 -> 路由计算/优化 -> 抽象执行计划生成 -> 物理 SQL 执行 -> 结果集合并。
3.1 接入与 JDBC 封装 (jddl-matrix)实现机制:通过实现 Java JDBC API 标准(包装了TDataSource,TConnection,TPreparedStatement,TResultSet等),让业务像使用普通单机数据库一样使用 JDDL。
分布式事务:Matrix 层还包含了txc相关的类(如ITxcClient,TxcClientHelper),说明 JDDL 具备或预留了对接分布式事务(如 TXC/GTS)的能力。
3.2 SQL 解析 (jddl-parser)实现机制:JDDL 的 Parser 模块主要基于Cobar的开源代码进行了深度定制和优化。
工作原理:利用手写或类似 JavaCC 的词法/语法解析器,将原始 SQL 转换为抽象语法树(AST,如ASTNode)。支持 MySQL 各种语法树对象的解析,包括 DDL、DML 等(MySQLDMLParser、MySQLDDLParser)。解析出的 AST 是后续路由和改写的基础。
3.3 路由与优化器 (jddl-rule&jddl-optimizer)规则引擎 (Rule):包含分库分表规则的定义(如TableRule,EnumerativeRule)。根据 SQL 中的分片键和预设的规则算法(如哈希、取模、范围等),计算出目标数据节点(DB)和目标表(Table)。
优化器 (Optimizer):包含CostBasedOptimizer(基于代价的优化)。它结合 AST 和RuleSchemaManager,决定最优的执行计划。
3.4 执行器与底层存储抽象 (jddl-executor&jddl-repo-*)执行器抽象 (Executor):定义了IExecutor接口。执行器负责将优化器产生的逻辑执行计划转化为物理执行过程。
Repository 抽象:IRepository定义了对底层存储的抽象操作,使得 JDDL 不仅可以对接 MySQL(jddl-repo-mysql),还可以扩展对接其他存储介质(如jddl-repo-bdb等)。
Cursor 机制 (游标):结果集的处理大量使用了 Cursor 模式。为了支持分布式结果集的合并、排序、分组,实现了诸如MergeCursor(合并游标)、TempTableSortCursor(临时表排序)、JoinSchematicCursor等。通过流式游标操作,极大地降低了客户端合并大量数据时的内存开销。
- 总结JDDL 作为一个成熟的 JDBC 客户端中间件,其核心在于高度模块化和抽象。通过 Parser 生成 AST,通过 Optimizer 和 Rule 计算路由,再交由 Executor 构建以 Cursor 为核心的执行计划,最后通过三层数据源架构(Matrix -> Group -> Atom)实现透明化的读写分离和分库分表操作。
graph TD
Client[业务应用] --> Matrix[Matrix 层 JDBC 接口]
subgraph 核心路由与执行逻辑
Matrix --> Parser[Parser: SQL 解析]
Parser --> AST[生成抽象语法树 AST]
AST --> Rule[Rule & Optimizer: 路由规则与代价优化]
Rule --> Plan[生成分布式执行计划]
Plan --> Executor[Executor: 执行器与结果集游标 Cursor 合并]
end
subgraph 数据源三层模型
Executor --> Group1[Group 层: 负载均衡与读写分离]
Executor --> Group2[Group 层: 负载均衡与读写分离]
Group1 --> AtomMaster[Atom 层: 主库连接池与状态监控]
Group1 --> AtomSlave[Atom 层: 从库连接池与状态监控]
end
AtomMaster --> DB_Master[(物理库: MySQL Master)]
AtomSlave --> DB_Slave[(物理库: MySQL Slave)]
架构图说明:Client / 业务应用:通过标准 JDBC 接口无缝接入 JDDL,对应用透明。
核心路由与执行逻辑:当应用发起 SQL 请求时,请求首先在Matrix 层被拦截,接着交由Parser进行语法解析并生成 AST。随后,结合Rule(分片规则)和Optimizer(优化器)计算出目标节点,并生成执行计划,最后由Executor(执行器)发起实际的并发查询并利用 Cursor 机制进行结果集合并(如 Order By, Group By 等)。
数据源三层模型:
Group 层:对上层暴露,隐藏了底层的物理主从结构,负责将请求路由到对应的主库或从库(实现读写分离)。
Atom 层:真实的物理连接层,封装了具体的数据库连接池(如 Druid/HikariCP),负责连接的保活、心跳检测和物理执行。
物理数据库:最终的数据存储介质(主要是 MySQL 实例)。