襄阳门户网

搜索
襄阳门户网 襄阳门户 企业宣传 查看内容

说说:开源数据库OceanBase代码导读(3)2023/7/13 8:16:35

2023-7-13 08:16| 发布者: 天若有情| 查看: 143| 评论: 0

摘要:   (2)一条SQL的一生  下面以一条select语句从接收到处理到返回结果给客户端的过程,来穿一下代码主路径。分布式关系型数据库https://www.oceanbase.com/oceanbase,完全自主研发的原生分布式数据库,连续年稳 ...
网站出售

  (2)一条SQL的一生

  下面以一条select语句从接收到处理到返回结果给客户端的过程,来穿一下代码主路径。分布式关系型数据库https://www.oceanbase.com/oceanbase,完全自主研发的原生分布式数据库,连续年稳定支撑双,创新推出“三地五中心”城市级容灾新标准,一套引擎同时支持tp和ap的混合负载,具备数据强一致,高扩展,高可用,高性价比,高度兼容oracle/mysql等特性,已助力+行业客户实现关键业务系统升级。

  src/observer目录下,有三个子目录。其中,omt的mt表示multi-tenant,里面实现了observer线程模型的抽象worker,每个租户在其有租户的节点上会创建一个线程池用于处理SQL请求。virtual_table目录下是sys租户各个__all_virtual虚拟表的实现,“虚拟表”是OB土话(其实是view),它把一些内存数据结构抽象成表接口暴露出来,用于诊断调试等。mysql目录就是mysql协议层,实现了mysql 5.6兼容的消息处理协议。

  除了建立和断开连接,mysql协议大多是简单的请求响应模型。每种请求类型一个COM_XXX命令,每种命令的处理函数对应在本目录有一个文件(类)。比如最常用的COM _QUERY表示一条sql请求,处理类就在obmp_query.h/cpp。一般典型的交互过程是connect, query, query, ..., query, quit。注意,所有的SQL语句类型,包括DML、DDL,以及multi-statement都是用query命令处理的。

  建立连接的过程在obmp_connect,它执行用户认证鉴权,如果成功,会创建一个ObSQLSession对象(位于src/sql/session)唯一表示一个数据库连接。所有其他命令处理都会访问这个session对象。

  上图是query的处理类ObMPQuery,它是一条SQL一生的开始。process方法是入口。

  这里有个工具类TraceId,在mpquery入口的地方会初始化它,在后续处理过程中它是一个线程局部变量,可以全局访问。它是一条sql一次处理过程的一个唯一标识,如果执行过程中切换了线程,或者执行了RPC,都会带上这个ID。在oblog打印的所有调试日志中,都包含一个以Y开头的十六进制串(猜猜为什么以Y开头:),就是TraceId,它可以把不同位置打印的日志串起来。OB研发查问题是都习惯grep到traceid相关的所有日志。

  如果一条sql串的格式是stmt;stmt;,叫做multi-statement,是mysql协议的一种特殊优化,可以一次发送多条语句执行,并返回多个结果集(如果有)。这里的处理对于是否多语句有不同的处理。如果是一个单语句autocommit=1的单语句DML语句,因为要执行事务提交写日志,语句执行过后要等待写日志成功才能响应客户端。为了尽快让出线程资源,会挂起相关上下文,在日志提交成功之后执行回调。这里一些特殊的代码逻辑就是在处理这个优化。

  (未完待续)

  导读(4):https://zhuanlan.zhihu.com/p/381020426

路过

雷人

握手

鲜花

鸡蛋

文热点