欢迎光临散文网 会员登陆 & 注册

Databend 源码阅读系列(二):Query server 启动,Session 管理及请求处理

2022-08-30 16:02 作者:Databend  | 我要投稿

query 启动入口

Databend-query server 的启动入口在 databend/src/binaries/query/main.rs 下,在初始化配置之后,它会创建一个 GlobalServices 和 server 关闭时负责处理 shutdown 逻辑的 shutdown_handle


GlobalServices

GlobalServices 负责启动 databend-query 的所有全局服务,这些服务都遵循单一责任原则。

GlobalServices 中的全局服务都实现了单例 trait,这些全局管理器后续会有对应的源码分析文章介绍,本文介绍与 Session 处理相关的逻辑。


ShutdownHandle

接下来会根据网络协议初始化 handlers,并把它们注册到 shutdown_handler 的 services 中,任何实现 Server trait 的类型都可以被添加到 services 中。

目前 Databend 支持三种协议提交查询请求(mysql, clickhouse http, raw http)。

之后会创建一些其它服务

  • Metric service: 指标服务

  • Admin service: 负责处理管理信息

  • RPC service: query 节点的 rpc 服务,负责 query 节点之间的通信,使用 arrow flight 协议

最后会将这个 query 节点注册到 meta server 中。

Session 相关

session 主要分为 4 个部分

  1. session_manager: 全局唯一,负责管理 client session

  2. session: 每当有新的 client 连接到 server 之后会创建一个新的 session 并且注册到 session_manager

  3. query_ctx: 每一条查询语句会有一个 query_ctx,用来存储当前查询的一些上下文信息

  4. query_ctx_shared: 查询语句中的子查询共享的上下文信息

下面逐一来分析

SessionManager (query/src/sessions/session_mgr.rs)

SessionManager 主要用来创建和销毁 session,对应方法如下

Session (query/src/sessions/session.rs)

session 主要存储 client-server 的上下文信息,代码命名已经很清晰了,这里就不再过多赘述。

Session 的另一个大的功能是负责创建和获取 QueryContext,每次接收到新的 query 请求都会创建一个 QueryContext 并绑定在对应的 query 语句上。

QueryContext (query/src/sessions/query_ctx.rs)

QueryContext 主要是维护查询的上下文信息,它通过 QueryContext::create_from_shared(query_ctx_shared)创建。

其中 partition_queue 主要存储查询对应的 PartInfo,包括 part 的地址、版本信息、涉及数据的行数,part 使用的压缩算法、以及涉及到 column 的 meta 信息。在 pipeline build 时候会去设置 partition。pipeline 后续会有专门的文章介绍。 

precommit_blocks 负责暂存插入操作的时已经写入到存储, 但是尚未提交的元数据,DataBlock 主要包含 Column 的元信息引用和 arrow schema 的信息。

QueryContextShared (query/src/sessions/query_ctx_shared.rs)

对于包含子查询的查询,需要共享很多上下文信息,这就是 QueryContextShared存在的理由。

它提供了 query 上下文所需要的一切基本信息。

Handler

之前提到了 Databend 支持多种 handler,下面就以 mysql 为例,看一下 handler 的处理流程以及如何与 session 产生交互。 首

先 MySQLHandler 会包含一个 SessionManager 的引用

MySQLHandler 在启动后,会 spawn 一个 tokio task 来持续监听 tcp stream,并且创建一个 session 再启动一个 task 去执行之后的查询请求。

在 MySQLConnection::run_on_stream中,session 会先 attach 到对应的 client host 并且注册一个 shutdown 闭包来处理关闭连接关闭时需要执行的清理,关键代码如下:

之后会启动一个 MySQL InteractiveWorker 来处理后续的查询。

该 InteractiveWorker会实现 AsyncMysqlShim trait 的方法,比如:on_executeon_query 等。查询到来时会回调这些方法来执行查询。

这里以 on_query 为例,关键代码如下:

在 do_query 中会创建 QueryContext 并开始解析 sql 流程来完成后续的整个 sql 查询。关键代码如下:

尾声

以上就是从 Databend 启动服务到接受 sql 请求并开始处理的流程。最近我们因为一些原因(Clickhouse tcp 协议偏向 clickhouse 的底层,协议没有公开的文档说明,同时里面历史包袱比较重,排查问题浪费大量精力)去掉了 ClickHouse native tcp client,具体请参见: https://github.com/datafuselabs/databend/pull/7012

如果你阅读完代码有好的提议,欢迎来这里讨论,另外如果发现相关的问题,可以提交到 issue 来帮助我们提高 Databend 的稳定性。Databend 社区欢迎一切善意的意见和建议 :)

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend 文档:https://databend.rs/

  • Twitter:https://twitter.com/Datafuse_Labs

  • Slack:https://datafusecloud.slack.com/

  • Wechat:Databend

  • GitHub :https://github.com/datafuselabs/databend

文章首发于公众号:Databend



Databend 源码阅读系列(二):Query server 启动,Session 管理及请求处理的评论 (共 条)

分享到微博请遵守国家法律