OceanBase 源码解读(五):租户的一生 -阿里云开发者社区

开发者社区> 开发者小助手-bz2> 正文

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

简介: 此前,带你读源码第四篇《戳这里回顾:OceanBase 源码解读(四):事务的一生》为大家介绍了事务的外部接口相关知识。本文将介绍社区版中创建、删除租户、资源隔离的相关代码。
+关注继续查看

121.gif

此前,带你读源码第四篇戳这里回顾OceanBase 源码解读(四):事务的一生》为大家介绍了事务的外部接口相关知识。本文将介绍社区版中创建、删除租户、资源隔离的相关代码。

OceanBase 数据库是支持多租户的,这里租户的概念类似于传统数据库的数据库实例。租户下可以建立数据库,在租户的数据库下可以建立表。

多租户特性可以降低资源使用和维护成本。每个租户可以被赋于一定的资源(比如 CPU、内存)。OceanBase集群初始内置了一个系统租户 sys,可以用来管理OceanBase 集群。租户的资源是分配在资源池上的,通过资源配置和设定资源池可以实现对租户资源的控制。 在创建租户之前,需要至少一个空闲的资源池;创建资源池需要先定义每个单元的规格。 我们称一个资源单元为 UNIT,UNIT是最小的资源分割单位。一个资源池中包含若干 UNIT,一台Observer 只能有一个资源池的一个 UNIT。一个资源池只能赋予给一个租户,一个租户可以包含多个资源池。 略过 SQL 的解析和处理,这部分的主体代码都是在 rootserver 目录下,统一的入口请点击阅读原文查看。 大概涉及到以下接口:

image.pngimage.gif


create resource unit
SQL参考:


CREATE RESOURCE UNIT unitname 
MAX_CPU [=] cpunum, 
MAX_MEMORY [=] memsize, 
MAX_IOPS [=] iopsnum, 
MAX_DISK_SIZE [=] disksize, 
MAX_SESSION_NUM [=] sessionnum, 
[MIN_CPU [=] cpunum,]
[MIN_MEMORY [=] memsize,] 
[MIN_IOPS [=] iopsnum] ;

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

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


create resource pool
SQL参考:


CREATE RESOURCE POOL poolname 
UNIT [=] unitname, 
UNIT_NUM [=] unitnum, 
ZONE_LIST [=] (‘zone’ [, ‘zone’ …]);

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

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

 这里涉及到的内部表有:__all_resource_pool、__all_unit。 具体如何分配 UNIT 可以参考这个接口:

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


create tenant SQL参考:


CREATE TENANT [IF NOT EXISTS] tenantname      [tenant_characteristic_list] [opt_set_sys_var]tenant_characteristic_list: tenant_characteristic [, tenant_characteristic...]tenant_characteristic: COMMENT 'string'  |{CHARACTER SET | CHARSET} [=] charsetname |COLLATE [=]  collationname|REPLICA_NUM [=] num |ZONE_LIST [=] (zone [, zone…]) |PRIMARY_ZONE [=] zone  |DEFAULT TABLEGROUP [=] {NULL | tablegroup}|RESOURCE_POOL_LIST [=](poolname [, poolname…])|LOGONLY_REPLICA_NUM [=] num|LOCALITY [=] 'locality description'opt_set_sys_var:{ SET | SET VARIABLES | VARIABLES } system_var_name = expr [,system_var_name = expr] ...

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

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 等。大概包括以下内容:
image.gifimage.png

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

 事务三 

这个事务就是修改了租户的创建,从CREATING到NORMAL。给出一个创建租户结束的标记。 为什么创建租户需要三个事务?因为事务不能跨租户。

 drop tenant

SQL参考:


DROP TENANT [IF EXISTS] tenant_name [FORCE];

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

int ObRootService::drop_tenant(const ObDropTenantArg& arg)

 drop resource pool

 SQL参考:


DROP RESOURCE POOL poolname;

 

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

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


drop resource unit 

SQL参考:


DROP RESOURCE UNIT unitname;

 

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

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


租户隔离 

租户的资源是互相隔离的,CPU 隔离和调度的代码位于 src/observer/omt。

image.png 

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



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26544 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8659 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2849 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10489 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11950 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8805 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21742 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
3745 0
659
文章
0
问答
来源圈子
更多
蚂蚁OceanBase数据库团队,用于OceanBase技术原理、运维经验和案例分享、对外交流。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载