关于shardingsphere:如何在-ShardingSphere-中开发自己的-DistSQL

29次阅读

共计 3390 个字符,预计需要花费 9 分钟才能阅读完成。

在《DistSQL:像数据库一样应用 Apache ShardingSphere》和《SCTL 涅槃新生:投入 RAL 的怀抱》中,曾经为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展现了 DistSQL 创立分布式数据库表的弱小能力,展示了 Apache ShardingSphere 在新形态下的交互体验。

为了让大家对 DistSQL 有更深刻的理解,同时能依据须要定制本人的 DistSQL 语法,本篇将为大家解析 DistSQL 的设计开发流程,同时通过理论的场景案例,率领大家实现一个全新的 DistSQL 语法,实现从需要到设计、开发和测试的残缺过程。

兰城翔

SphereEx 中间件研发工程师,Apache ShardingSphere contributor,目前专一于 DistSQL 的设计和研发。

何为 DistSQL

DistSQL(Distributed SQL)是 Apache ShardingSphere 特有的操作语言,它与规范 SQL 的应用形式完全一致,用于提供增量性能的 SQL 级别操作能力,以此达到对资源和规定的治理的目标。对于 DistSQL 更多信息参考《DistSQL:像数据库一样应用 Apache ShardingSphere》。

DistSQL 的意义

DistSQL 设计的目标是 突破中间件和数据库之间的界线,让开发者像应用数据库一样应用 Apache ShardingSphere。 因而 DistSQL 的设计会尽可能符合已有的数据库语法,进而升高学习老本;此外DistSQL 的作用是对资源和规定进行 SQL 级别的治理,齐全代替配置文件也是其长处之一。

开发 DistSQL

筹备

  • 在开发之前须要对以下工具有所理解 1. ANTRL4 作为解析工具是开发 DistSQL 的根底,对于 ANTLR 4 的应用能够参考【ANTRL4 扼要教程】:https://wizardforcel.gitbooks…
  1. 在 IntelliJ IDEA 开发时还须要应用到插件 ANTLR v4,(https://plugins.jetbrains.com…)作用是对 ANTRL4 定义的语法规定进行测试,应用形式如下:

a. 在对应的规定上抉择 Test Rule

b. 在 ANTLR preview 中输出须要校验的语句

在理解语法和插件的根底之上,还须要对 DistSQL 执行流程有肯定意识。但 DistSQL 残缺的执行流程较为繁琐,而 ShardingSphere 的良好的架构使得开发者不必关注整个流程也能实现 DistSQL 性能的开发。

开发 DistSQL 须要关注的外围流程如下,此处以分片性能为例,不同的性能对应的 Visitor 不同:

实战

在理解 DistSQL 执行流程之后,接下来将实战演示如何开发一条本人的 DistSQL。

在《DistSQL:像数据库一样应用 Apache ShardingSphere》一文中实战演示了应用 DistSQL 创立分片规定,同时应用 show sharding table rules 对分片规定进行了展现。

当初,让咱们提出一个新的需要:通过 DistSQL 疾速查问各个分片表的分片数量。设计语法如下:

show sharding tables count [from schema] ;
  • 环境筹备
  • MySQL 服务,蕴含用于分片的数据库和表
  • Zookeeper 服务,作为注册核心
  • ShardingSphere-Proxy 5.0.0
  • 实战演示

1. 创立语法定义

src/main/antlr4/imports/sharding/RQLStatement.g4 文件中增加如下的语法定义,增加实现后能够应用 ANTLR v4 对语法定义进行测试。

在增加语法定义时须要思考该语法中的关键字是否曾经定义,此处的 COUNT 为未定义的关键字,须要在 src/main/antlr4/imports/sharding/Keyword.g4 中定义。在语法定义之后还需将其增加到 ShardingDistSQLStatement.g4 文件中,该文件能够了解为解析的路由。

在实现以上步骤之后,对 shardingsphere-sharding-distsql-parser 进行编译生成语法对应的上下文对象。

2. 实现对语法定义的解析

在解决语法之前还须要在 shardingsphere-distsql-statement 增加一个与该语法定义对应的 DistSQLStatement 对象用于保留语句中的变量属性,例如以后语法定义中的 schemaName 须要保留至 DistSQLStatement 对象中。

在 ShardingSphere 中应用的是 ANTLR 的 Visitor 模式,因而对语法定义的解决须要在 ShardingDistSQLStatementVisitor 中重写 visitShowShardingTableCount 办法,该办法的目标为创立 ShowShardingTablesCountStatement 对象,并将语法中的变量属性保留到 DistSQLStatement 对象中。

shardingsphere-distsql-statement 存在 shardingsphere-sharding-distsql-parser 依赖关系,因而须要对 shardingsphere-distsql-statement 进行编译。

3. 数据处理以及后果返回

数据的解决次要由 Handler 或者 Executor 中的 execute 办法解决,后果次要由 getRowData 办法返回,然而对应不同类型的语法定义在侧重点上可能有所差别。其中后果返回的语法定义应用 DistSQLResultSet 作为后果存储的对象,会在 execute 办法中对后果数据进行组装。

本示例便是这种解决形式,以下为该示例对应的 DistSQLResultSet

ShardingTablesCountResultSetinit 办法负责数据的获取与组装,getRowData 办法负责对行数据的返回。此外不难发现该类中还有 getType 办法,该办法属于 TypedSPI 接口,所以 ShardingTablesCountResultSet 还须要在以后模块的 src/main/resources/META-INF/services 目录下减少 org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet 文件来实现 SPI 的注入能力应用,门路与内容如下:

至此该语法定义的性能开发已根本实现。

4. 单元测试以及解析测试

在实现根本的性能开发之后为了保障其继续的可用性须要对新增的类或者办法增加测试用例,对新增的语法增加解析测试,以下为 ShardingTablesCountResultSet 的单元测试。

除了单元测试以外还须要在 shardingsphere-parser-test 中增加对语法定义的解析测试,将输出的 DistSQL 解析成 DistSQLStatement 而后与预期的 TestCase 对象进行比拟,步骤如下。

a. 在 src/main/resources/sql/supported/rql/show.xml 中增加测试的 SQL;

b. 在 src/main/resources/case/rql/show.xml 增加测试的 case;

c. 增加 TestCase 对象用于保留 case 中定义的预期后果;

d. 应用 SQLParserTestCases 类将 TestCase 进行加载;

e. 增加对应的 Assert 对象,并将其退出到 ShowRulesStatementAssert 判断中;

f. 执行 DistSQLParserParameterizedTest 中的测试方法,至此测试告一段落。最初能够在命令行工具中去执行开发实现的 DistSQL 测验性能。

结语

DistSQL 作为 5.0.0 版本公布的新个性之一,将会在此版本根底上继续发力,也心愿更多的社区搭档退出,结构更加欠缺的语法体系,提供更弱小的性能,真正突破中间件与数据库之间的界线。

最初,DistSQL SIG 近日已成立,致力于 DistSQL 个性继续优化,拓展新的应用场景以及宣传答疑,欢送大家点击这里链接关注,理解 DistSQL 以及 ShardingSphere 我的项目最新进展。

欢送增加社区经理微信(ss_assistant_1)进入交换群,与泛滥 ShardingSphere 爱好者一起交换提高

正文完
 0