暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

开源数据库OceanBase源码解读(九):tableAPI和OB多模型

作者简介:竹翁,毕业于北京大学, OceanBase 内核研发总监。
原名杨志丰,花名竹翁。近十年来一直在阿里巴巴/蚂蚁金服自主研发分布式系统和数据库的从事研发工作。
致力于设计出先进的 HTAP 数据库系统,打造技术业内标杆、商业取得成功的核心基础设施。在 OceanBase 系统中,他先后负责 OceanBase 的 SQL 引擎,分布式主控模块,多模数据库方向等,负责过 OceanBase 的数据库平台产品研发,近期在负责内核创新研发工作。且竹翁对 C++ 、分布式系统原理、 SQL 查询处理、事务处理、编译技术、工程效率等方面也有着浓厚的兴趣。

在刚刚发布的 OceanBase 社区版 3.1.1 中,OceanBase 开放了一组新的 API 叫做 Table API 。Table API 以 API而非 SQL 的方式提供了一种新的访问 OceanBase 数据的接口。熟悉 MySQL 的同学,可以把它类比为 MySQL 的 sockethandler 。


不过 Table API 提供的能力更强大,它把 OceanBase 可靠和可扩展的分布式存储层能力直接提供给应用程序,提供了灵活(非关系模型)和轻量的数据访问接口(无连接状态),应用程序可以把 Table API 当做 key-value , Table-store , Hbase(我们提供了兼容 Hbase 的 API 和驱动)等多种数据模型的数据库来使用。在简单读写场景下,Table API 比 SQL 也有一定的性能优势(响应延时)。


这是 OceanBase 开放生态的重要举措,第三方系统可以相对容易的在 OceanBase 的 Table API 服务之上封装增值的数据服务。例如,我们在蚂蚁集团内部广泛部署的时序数据库 CeresDB 就是这么做的。


下面介绍一下 TableAPI 相关代码。

Table API模块通过 obrpc 协议提供数据服务,他的服务端口和 observer 的 rpc 端口一样。服务端的主体代码位于 src/observer/table/。


上面文件中,叫做 xxx_processor 的,主要都是协议层的处理。


execute_processor 是单行操作的处理函数,batch_execute_processor 是批量多行操作的处理函数,query_processor 是扫描操作的处理函数。


主体的逻辑在 ob_table_service.h/cpp中。通过学习 Table API 的代码,可以快速学习 OceanBase 存储层、事务层对 SQL 层提供的接口。

Table API 的 rpc 请求和结果的数据结构,定义在 src/share/table 中。从 ObTableOperation 类的定义中,可以看到 Table API 提供了单行的 insert, delete, insert or update(无索引时即 put ), replace, retrieve(get), increment, append,以及他们任意组合的批量操作。通过 ObTableQuery 接口,提供了范围扫描操作。


Table API 当前有 Java 和 Rust 两种语言的驱动,对某个分区的查询由客户端发送到 leader 副本所在的 observer上。如果发生了主备切换,需要驱动实现重试逻辑。


欢迎大家在 Table API 之上扩展更多应用。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论