2.2 SQL层
SQL层是cockroachDB的架构中最上层,提供SQL API给开发者,将SQL语句转化为KV操作,使其可以被数据库的其他层使用。
本页索引
**概要
--与其他层的交互
**组件
--关系结构
--SQL API
--PostgresSQL线路协议
--SQL解析器,计划器,执行器
--编码
--DistSQL
**与其他层的交互技术
--SQL&事务层
2.2.1 概要
一旦cockroachDB被部署,开发者只需要集群的连接串和SQL语句就可以开始工作。因为cockroachDB节点都是对称的,开发者可以发送请求到任意一个节点(cockroachDB在负载均衡器的作用下工作良好),无论哪个节点接受到请求,都被视为入口节点,其他层继续处理请求。
开发者对集群发送请求,请求使用SQL 语句编写,但是数据最后被写入或者从存储层读取是KV键值对。为了处理这种情况,SQL层将SQL语句转化成一系列KV操作,并把它传送到事务层。
**与其他层进行交互
为了与其他层进行交互,SQL层:发送请求到事务层
2.2.2 组件
** 关系结构
对于开发者,cockroachDB数据存储在关系结构中,比如:行/列,表由行和列组成,数据库是表的集合,集群由多个数据库组成。因为这种结构,cockroachDB具有典型的关系数据库特点,如:约束,外键。应用开发者相信,数据库对于应用数据具有一致性的结构。数据验证不需要与应用逻辑分离。
**SQL API
CockroachDB实现了大部分ANSI SQL标准,即关系结构,你可以查看通过以下链接查看对SQL语句的支持情况
https://www.cockroachlabs.com/docs/stable/sql-feature-support.html
在SQL API中,让开发者使用ACID事务,通过(begin,end,isolation levels) 等
** PostgresSQL线路协议
SQL查询到达你的集群通过PostgresSQL无线协议。应用连接集群支持Postgres-SQL兼容的驱动和很多PostgresSQL ORMs(对象关系映射)和GORM(GO)和Hibernate(Java).
**SQL解析器,计划器,执行器
节点接收来自客户端的SQL语句,cockroachDB解析语句,创建查询计划,执行计划
--解析
查询被解析在yacc文件中,使用我们支持的语法描述,将以字符描述的查询,转化为Abstract syntax tree(AST,抽象语法树)。
--计划
通过AST,cockroachDB开始计划查询的执行,通过生成planNodes,每个planNodes包含使用KV操作的一系列代码,这就是SQL语句如何转化为KV操作。将SQL客户端语句解析成AST描述,其中包括像类型检查之类的操作。查看一个查询生成的planNodes,使用explain
--执行
PlanNodes继续被执行,开始与事务层进行交流。本步骤也包括,将SQL语句编码,或返回更低层译码值。
**编码
SQL语句使用被解析的字符进行重写,cockroachDB更低层处理处理主要的字节。这意味着SQL层,在查询执行中,必须将行数据从SQL字符串描述转化为字节传给更低层。将更低层返回的字节数据转化为SQL数据,返回给客户端。
对于索引列,字节编码保留与数据同样的排序,因为cockroachDB最终存储数据在有序的key-value map中,使用与数据一致的顺序存储字节,使KV数据可以高效的被扫描。
不过,对于没有索引的列(例如:no-primary key),cockroachDB使用valueencoding,消耗更少的空间,但是没有保护排序,查看具体的执行细节。
https://github.com/cockroachdb/cockroach/blob/master/docs/tech-notes/encoding.md
**DistSQL
CockroachDB是一个分布式数据库,开发了分布式SQL优化一些查询组件,可以动态加速涵盖多个ranges的查询。DistSQL的结构有自己的文档,以下初略的解释,它是如何工作的。
1)对于一个非分布式查询,协同节点接受到匹配这个查询的所有行,然后在整个数据集执行计算。
2)对于DistSQL兼容的查询,每个节点计算它涵盖的行,将结果(而不是整个数据集)分发到协同节点,协同节点合并每个节点的结果,最后返回一个单一结果给客户端。这种方式动态减少了协同节点的数据量,很好的应用了并行计算,最终减少了复杂查询的时间。例外,进程数据在节点中已经存储,使cockroachDB可以处理比单个节点存储数据量更大的行集合。
为了在分布式场景中执行sql语句,解释下面概念:
Logical Plan(逻辑计划):与上面描述的AST/planNode相似,它通过计算提供了一个抽象的(非分布式)数据流。
Physical Plan(物理计划):物理计划是逻辑节点与运行cockroach的物理机器的概念的映射,逻辑计划节点复制和specialized依赖于集群的拓扑结构。如上的planNodes,这些物理计划的组件可以被安排,并且执行在集群中。
对于DistSQL更细节的描述,请查看
https://github.com/cockroachdb/cockroach/blob/master/docs/RFCS/20160421_distributed_sql.md
2.2.3 与其他层的交互技术
从执行的planNodes转化出来的KV操作被发送到事务层。