OceanBase 源码解读(六)租户的一生

2024年 5月 7日 50.6k 0

作者:厌离,毕业于西北工业大学,现主要负责 OceanBase-RS 有关工作。

     竹翁,毕业于北京大学,OceanBase 内核研发总监。

多租户是 OceanBase 重要特性,本文将介绍如何创建,删除租户。

租户的概念:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/tenant-management-overview-1

在创建租户之前,需要一个空闲的资源池;创建资源池需要先定义每个单元的规格。

我们称一个资源单元为 UNIT,UNIT 是最小的资源分割单位。一个资源池中包含若干 UNIT,一台 Observer 只能有一个资源池的一个 UNIT。一个资源池只能赋予给一个租户,一个租户可以包含多个资源池。

略过 SQL 的解析和处理,这部分的主体代码都是在 rootserver 目录下,统一的入口都是在这个文件下:

大概涉及到以下接口:

OceanBase 源码解读(六)租户的一生-1

create resource unit

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/create-resource-unit

这部分代码比较简单,创建一个 UNIT 规格,就是把这个规格记录在内部表(__all_unit_config)。在没有任何资源池引用这个规格时,它并没有什么用,可以随意的修改或者删除。

代码上可以从这个接口去阅读,很简单。

int ObRootService::create_resource_unit(const obrpc::ObCreateResourceUnitArg& arg)

create resource pool

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/create-resource-pool

创建资源池需要定义这个资源池引用的规格,这个资源处分布在哪几个 zone,每个 zone 存在几个 UNIT,这里的重点是要在哪些 server 上把这部分 UNIT 分配出来。

可以从这个接口去阅读:

int ObRootService::create_resource_pool(const obrpc::ObCreateResourcePoolArg& arg)
create tenant

这里涉及到的内部表有:__all_resource_pool、__all_unit。

具体如何分配 UNIT 可以参考这个接口:

int ObUnitManager::allocate_pool_units(ObISQLClient& client, const share::ObResourcePool& pool)

create tenant

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/create-tenant

资源池创建成功后,就可以引用这个资源池创建租户。创建租户分为三个事务,为什么要分为三个事务呢?我们可以带着这个问题从这个接口开始阅读代码:

int ObRootService::create_tenant(const ObCreateTenantArg& arg, UInt64& tenant_id)

三个事务可以从这个接口阅读:

  int ObDDLService::create_tenant_env(share::schema::ObSchemaGetterGuard& schema_guard, const obrpc::ObCreateTenantArg& arg,
      const common::ObRegion& region, share::schema::ObTenantSchema& tenant_schema, const int64_t frozen_version,
      const common::ObString* ddl_stmt_str = NULL);

事务一

  • 确定租户使用的资源池,并把这些资源池都赋予给这个租户。构建了 ObTenanSchema,包括租户的 locality,primary_zone 等信息。创建这个租户的系统表的 Partition;

事务二

这个事务是构建了租户内部的数据,例如系统表的元信息,内部用户,database 等。大概包括以下内容:

OceanBase 源码解读(六)租户的一生-2

这个事务结束后,实际上租户已经创建完成,可以正常使用。

事务三

这个事务就是修改了租户的创建,从CREATING到NORMAL。给出一个创建租户结束的标记。

为什么创建租户需要三个事务?因为事务不能跨租户。

drop tenant

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/drop-tenant

删除租户实际上只删除了租户的ObTenanSchema。租户删除了,租户引用的资源池还是存在的。

int ObRootService::drop_tenant(const ObDropTenantArg& arg)

drop resource pool

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/drop-resource-pool

只有没有租户引用的资源池才可以被删除。

int ObRootService::drop_resource_pool(const obrpc::ObDropResourcePoolArg& arg)

drop resource unit

SQL参考:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/drop-resource-unit

只有没有资源池引用的规格才可以被删除,只涉及到内部表的修改,接口如下:

int ObRootService::drop_resource_unit(const obrpc::ObDropResourceUnitArg& arg)

相信通过前文的讲解,大家已经对租户有了一定的了解。

多租户(multi-tenant,不是租客 )是 OceanBase 最重要的特性之一,租户的管理和资源调度是 RS 的功能。租户的资源是互相隔离的,CPU 隔离和调度的代码位于 src/observer/omt。

OceanBase 源码解读(六)租户的一生-3

所有 OceanBase 的一级数据库对象,如表,索引,database/schema,用户等,在系统表和内存中都是用一个 uint64 作为 ID 标识的。为了实现方便,很多时候,在内存中这些 ID 里编码了租户 ID,前 24bi t是租户 ID。

如果您有任何疑问,可以通过以下方式与我们进行交流:

钉钉群:33254054

OceanBase 源码解读(六)租户的一生-4

github:https://github.com/oceanbase/oceanbase

gitee:https://gitee.com/oceanbase

博客问答:https://open.oceanbase.com/answer

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论