OceanBase 源码解读(五):租户的一生
厌离,毕业于西北工业大学,现主要负责 OceanBase-RS 有关工作。
源码是 OceanBase 的“方向盘”,本系列主要围绕“源码解读”,通过文章阐述,帮助大家理清数据库的内在本质。本文为 OceanBase 数据库源码解读系列文章的第五篇,将介绍社区版中创建、删除租户、资源隔离的相关代码。
前四篇源码解读可参考:
OceanBase 源码解读(一)模块结构:https://xie.infoq.cn/article/596be7c2d704b0954e88a9341
OceanBase 源码解读(二)SQL 的一生:https://xie.infoq.cn/article/199361b644402da1fb7ae0a56
OceanBase 源码解读(三)分区的一生:https://xie.infoq.cn/article/750d934604810c781a2d82fb8
OceanBase 源码解读(四)事务的一生:https://xie.infoq.cn/article/33b99c53e0f65b90858393e09
OceanBase 数据库是支持多租户的,这里租户的概念类似于传统数据库的数据库实例。租户下可以建立数据库,在租户的数据库下可以建立表。
多租户特性可以降低资源使用和维护成本。每个租户可以被赋于一定的资源(比如 CPU、内存)。
OceanBase 集群初始内置了一个系统租户 sys,可以用来管理 OceanBase 集群。租户的资源是分配在资源池上的,通过资源配置和设定资源池可以实现对租户资源的控制。
在创建租户之前,需要至少一个空闲的资源池;创建资源池需要先定义每个单元的规格。
我们称一个资源单元为 UNIT,UNIT 是最小的资源分割单位。一个资源池中包含若干 UNIT,一台 Observer 只能有一个资源池的一个 UNIT。一个资源池只能赋予给一个租户,一个租户可以包含多个资源池。
略过 SQL 的解析和处理,这部分的主体代码都是在 rootserver 目录下,统一的入口请点击阅读原文查看。大概涉及到以下接口:
create resource unit
SQL 参考:
这部分代码比较简单,创建一个 UNIT 规格,就是把这个规格记录在内部表(__all_unit_config)。在没有任何资源池引用这个规格时,它并没有什么用,可以随意的修改或者删除。
代码上可以从这个接口去阅读:
create resource pool
SQL 参考:
创建资源池需要定义这个资源池引用的规格,这个资源处分布在哪几个 zone,每个 zone 存在几个 UNIT,这里的重点是要在哪些 server 上把这部分 UNIT 分配出来。
可以从这个接口去阅读:
这里涉及到的内部表有:__all_resource_pool、__all_unit。
具体如何分配 UNIT 可以参考这个接口:
create tenant
SQL 参考:
资源池创建成功后,就可以引用这个资源池创建租户。创建租户分为三个事务,为什么要分为三个事务呢?
我们可以带着这个问题从这个接口开始阅读代码
三个事务可以从这个接口阅读:
事务一
确定租户使用的资源池,并把这些资源池都赋予给这个租户。构建了 ObTenanSchema,包括租户的 locality,primary_zone 等信息。创建这个租户的系统表的 Partition;
事务二
这个事务是构建了租户内部的数据,例如系统表的元信息,内部用户,database 等。大概包括以下内容:
这个事务结束后,实际上租户已经创建完成,可以正常使用。
事务三这个事务就是修改了租户的创建,从 CREATING 到 NORMAL。给出一个创建租户结束的标记。
为什么创建租户需要三个事务?因为事务不能跨租户。
drop tenant
SQL 参考:
删除租户实际上只删除了租户的 ObTenanSchema。租户删除了,租户引用的资源池还是存在的.
drop resource pool
SQL 参考:
只有没有租户引用的资源池才可以被删除
drop resource unit
SQL 参考:
只有没有资源池引用的规格才可以被删除,只涉及到内部表的修改,接口如下
租户隔离租户的资源是互相隔离的,CPU 隔离和调度的代码位于 src/observer/omt。
所有 OceanBase 的一级数据库对象,如表,索引,database/schema,用户等,在系统表和内存中都是用一个 uint64 作为 ID 标识的。为了实现方便,很多时候,在内存中这些 ID 里编码了租户 ID,前 24bit 是租户 ID。
如果大家有任何疑问,可以通过以下方式与我们进行交流:
微信群:扫码添加小助手,将拉你进群哟~👇👇👇
钉钉群:33254054👇👇👇
github:https://github.com/oceanbase/oceanbase
版权声明: 本文为 InfoQ 作者【OceanBase 开源社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/2c7647d3b37345de5dc6ca0e2】。未经作者许可,禁止转载。
评论