CockroachDB的SQL层架构向开发人员公开其SQL API,并将SQL语句转换为数据库的KV操作。

如果你还没阅读过架构概览,建议你先阅读该篇。

概览

一旦部署了CockroachDB,开发人员只需要一个连接到集群的语句和SQL语句即可开始工作。

由于CockroachDB的节点都是对称的(symmetrically),因此开发人员可以向任何节点发送请求(这意味着CockroachDB可以很好地与负载均衡器配合使用)。 无论哪个节点接收请求都将充当“网关节点”来处理请求。

当开发人员向集群发送请求时,它们作为SQL语句到达,但是,数据最终是以键值(KV)对的形式写入存储层和从存储层读取。 所以,为了解决这个问题,SQL层将SQL语句转换为KV操作计划,并将其传递给事务层。

与其他层的交互

SQL层与CockroachDB中的其他层的关系:

Components(组成)

Relational Structure(关系结构)

开发人员以关系结构(即行和列)查看和使用存储在CockroachDB中的数据。 行和列的组合被组织到表中。 表的集合被组织到数据库中。 你的集群可以包含多个数据库。

由于这种结构,CockroachDB提供了典型的关系型数据库的特征,如约束(例如外键约束),这使应用程序开发人员可以相信数据库将确保应用程序数据的一致性结构,不需要单独在应用程序逻辑中进行数据验证。

SQL API

CockroachDB实现了ANSI SQL标准的很大一部分来显示其关系结构。你可以查看CockroachDB支持的所有SQL特性.

重要的是,通过SQL API,我们还允许开发人员使用ACID语义事务,和使用任何SQL数据库一样 (BEGIN, END, ISOLATION LEVELS等)

PostgreSQL Wire 协议

SQL查询通过PostgreSQL wire协发送到你的集群,通过支持PostgreSQL兼容性驱动以及PostgreSQL ORM(例如GORM (Go)和Hibernate (Java),可以使你的应用程序非常容易的连接到集群。

SQL Parser, Planner, Executor

在节点最终从客户端收到SQL请求后,CockroachDB会解析该语句,创建查询计划,然后执行该计划。

解析

接收到的查询将根据我们的yacc文件进行解析(该文件描述了我们支持的语法),并将每个查询的字符串转换为Abstract Syntax Trees (AST).

创建查询计划

关于AST,CockroachDB使用语义分析,包括检查查询是否有效,解析名称,消除不需要的中间计算,以及最终确定用于中间结果的数据类型。

同时,CockroachDB通过生成planNodes树开始查询计划的执行。 每个planNodes都包含一组使用KV操作的代码,来最终将SQL语句转换为KV操作。

你可以使用EXPLAIN查看生成的planNodes

执行

然后执行planNodes,它首先与事务层通信。

此步骤还包括对语句中的值进行编码,以及对从底层返回的值进行解码。

编码

尽管SQL查询是用可解析的字符串编写的,但CockroachDB的底层主要以字节为单位进行处理。 这意味着在SQL层,在查询执行中,CockroachDB必须将将原始数据从表示SQL数据的string转为bytes,并将从底层返回的bytes转换为可以传递回客户端的SQL数据。

对于索引列而言,此字节编码保留与其表示的数据类型相同的排序顺序也很重要。 这是因为CockroachDB最终将数据存储在已排序的键值映射中; 以与其表示的数据相同的顺序来存储字节,使我们能够有效地扫描KV数据。

但是,对于非索引列(例如,非PRIMARY KEY列),CockroachDB使用编码(称为“值编码”),它消耗较少的空间但不保留排序。

你可以在编码技术说明中找到更详尽的详细信息。

DistSQL

由于CockroachDB是一个分布式数据库,我们为一些查询开发了一个分布式SQL(DistSQL)优化工具,可以大大加快涉及多个range的查询。 虽然DistSQL的架构有专门的说明文档,但这里粗略说明它是如何工作。

在非分布式查询中,协调节点接收与其查询匹配的所有行,然后对整个数据集执行所有计算。

但是,对于与DistSQL兼容的查询,每个节点对其包含的行进行计算,然后将结果(而不是整行)发送到协调节点。 然后,协调节点聚合来自每个节点的结果,最后向客户端返回单个响应。

这大大减少了带到协调节点的数据量,并利用了已广泛实践的并行计算概念,最终减少了复杂查询完成所需的时间。 此外,它处理已经存储它的节点上的数据,这使得CockroachDB可以处理大于单个节点存储的行集。

要以分布式方式运行SQL语句,我们引入了几个概念:

你可以在DistSQL RFC中找到更多详细信息。

与其他层的交互

SQL & 事务 层

来自正在执行的planNodes的KV操作被发送到事务层。

What's Next?

了解CockroachDB如何处理并发请求:事务层