OceanBase学习之路13|体验多租户特性

OceanBase 数据库具有多租户的特性,在集群层面实现了实例资源的池化。在 OceanBase 数据库中,每一个租户即一个实例(类比 MySQL Instance)。租户与租户之间数据、权限、资源隔离,每个租户拥有自己独立的访问端口及 CPU、内存访问资源。

背景信息

OceanBase 数据库可以灵活的调整租户资源分配情况(CPU、内存),并且整个过程对上层业务透明。通过多租户机制,OceanBase 集群可以帮助用户高效的利用资源,在保证可用性和性能的前提下,优化成本,并且做到按照需求弹性扩容。

为了帮助您更容易的理解 OceanBase 数据库多租户的概念。下面通过创建一个 OceanBase 数据库租户的例子分步骤进行说明。

创建资源规格 Unit Config

在 OceanBase 数据库中,资源单元 Unit 是一个租户使用 CPU、内存的最小逻辑单元,也是集群扩展和负载均衡的一个基本单位,在集群节点上下线,扩容、缩容时会动态调整资源单元在节点上的分布进而达到资源的使用均衡。而 Unit Config 则规定了一个 Unit 需要使用的计算存储资源(包含内存、CPU 和 IO 等)的规格,是一个配置信息。

因为其分布式的架构,一个 OceanBase 数据库租户可以在资源规格、资源池、副本类型,副本分布几个不同维度灵活定义,所以创建租户时,也需要按照 “unit config -> resource pool -> tenant” 的顺序进行创建和定义。

OceanBase 数据库在创建租户前,需要先确定租户的 Unit Config。您需要使用  sys 租户管理员,通过如下 SQL 语句来创建。

下面创建两个 Unit Config,分别为  unit1 和  unit2 并指定 CPU、内存、使用的最大及最小阈值。

  • 创建  unit1 资源单元的 CPU、内存使用大小为 3 C、6 G。

    obclient [oceanbase]> CREATE RESOURCE UNIT UNIT1 MAX_CPU =3,MIN_CPU =3 ,MEMORY_SIZE ='6G';
  • 创建  unit2 资源单元的 CPU、内存使用大小为 4 C、8 G。

    obclient [oceanbase]> CREATE RESOURCE UNIT UNIT2 MAX_CPU =4,MIN_CPU =4 ,MEMORY_SIZE ='8G';

创建资源池和关联 Unit Config

Unit Config 是一组租户的配置规格信息,而 Resource Pool 则是租户的资源实体,所以在这一步我们需要创建一个 Resource Pool,并且与 Unit Config 关联起来。

创建两个不同的资源池  pool1pool2,并为其分别指定到  unit1unit2 上。实现资源单元与资源池的对应。 UNIT_NUM 表示在一个副本中指定多少个  unit 单元(同一个租户中,一个节点上最多只能有一个  unit), ZONE_LIST 则指定租户在当前集群中在哪几个副本进行部署。

本例中考虑到是单节点集群,我们都指定单个 Unit 和 Zone List。创建 Resource Pool 需要保证有足够的资源剩余,如果资源不足,您可以先尝试删除已有的  test 租户,或者将已有租户的 Unit Config 调整到更小。如何调整请参见  调整租户资源大小

obclient [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='UNIT1',UNIT_NUM=1,ZONE_LIST=('zone1');
obclient [oceanbase]> CREATE RESOURCE POOL pool2 UNIT='UNIT2',UNIT_NUM=1,ZONE_LIST=('zone1');

注意

上面的例子针对的是单节点的集群环境,如果您的集群有 3 个节点,那么  ZONE_LIST 的值应该为  ('zone1','zone2','zone3'),其中 Zone 的名称需要根据您创建的情况具体填写。

根据创建的 Resource Pool 创建租户

在完成 Unit Config、Resource Pool 的创建,完成资源单元和资源池的对应后,就可以正常开始租户创建了。

本例中由于是单节点集群,所以我们只能创建单副本的租户。如果希望创建 3 副本的租户,OceanBase 集群至少需要 3 个节点。

定义一个名为  tenant1 的单副本租户,并规定字符集为  utf8mb4,使用  pool1 的资源池, ob_tcp_invited_nodes 是租户白名单定义,初始可以设置为 '%',表示任意 IP 地址均可以访问,后期可以修改。

obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant1 CHARSET='utf8mb4', ZONE_LIST=('zone1'), PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%';

注意

上面的例子针对的是单节点的集群环境,只能创建单副本的租户。如果您的集群有 3 个节点,那么  ZONE_LIST 的值应该为('zone1','zone2','zone3'), PRIMARY_ZONE 则填写  'zone1;zone2;zone3',表示租户的 Leader 优先分布在  zone1,其次为  zone2

类似的,定义一个名为  tenant2 的一个 单副本的租户,并规定字符集为  utf8mb4,使用  pool2 的资源池。

obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant2 CHARSET='utf8mb4', ZONE_LIST=('zone1'), PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool2') SET ob_tcp_invited_nodes='%';

在完成  tenant1tenant2 租户创建后,您可以通过查询  oceanbase.DBA_OB_TENANTS 视图来确认租户是否创建成功。

obclient [oceanbase]> SELECT * FROM DBA_OB_TENANTS;

在完成 tenant1、tenant2 租户创建后,您可以通过查询  oceanbase.DBA_OB_TENANTS 视图来确认租户是否创建成功。

obclient [oceanbase]> SELECT * FROM DBA_OB_TENANTS;

上述操作确认完成后,您已完成在同一个集群下实现两个租户的创建过程。接下来便可以在租户里正常的进行数据库操作了。

使用新创建的  tenant1 进行登录,并创建一张测试表。

obclient -hXXX.XX.XXX.106 -P2883 -uroot@tenant1#ob_test -p
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> CREATE TABLE t_f1(id DECIMAL(10,0),id2 DECIMAL(10,0),id3 DATE,id4 DATE,id5 FLOAT,id6 FLOAT,id7 VARCHAR(30),id8 VARCHAR(300));
Query OK, 0 rows affected
obclient [test]> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| t_f1           |
+----------------+
1 row in set

使用  tenant2 租户进行登录,查看  test 库情况。

obclient -h***.**.***.106 -P2883 -uroot@tenant2#ob_test -p
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> SHOW TABLES;
Empty set

可以看到集群下两个租户的资源、数据、权限都是隔离的,您可以进行更多测试,体验 OceanBase 数据库的租户隔离特性。

修改租户配置和调整实例资源规格

OceanBase 数据库可以灵活的对租户资源的 CPU,内存资源进行调整,并且在线生效,对业务透明。修改租户所占用的 CPU、内存大小,您仅需要调整租户所对应的 Unit Config,不需要对资源池或者租户进行调整。

租户资源单元可通过系统表  __all__unit_config 进行查看。

obclient [oceanbase]> SELECT * FROM oceanbase.__all_unit_config;
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+
| gmt_create                 | gmt_modified               | unit_config_id | name                                 | max_cpu | min_cpu | max_memory   | min_memory   | max_iops | min_iops | max_disk_size | max_session_num     |
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+
| 2022-07-05 17:32:17.519436 | 2022-07-05 17:32:17.519436 |              1 | sys_unit_config                      |       5 |     2.5 |  17179869184 |  12884901888 |    10000 |     5000 | 2608854990848 | 9223372036854775807 |
| 2022-07-10 12:58:33.279509 | 2022-07-10 12:58:33.279509 |           1026 | unit1                                |       3 |       3 |   6442450944 |   6442450944 |      128 |      128 |   10737418240 |                  64 |
| 2022-07-10 12:58:39.276495 | 2022-07-10 12:58:39.276495 |           1027 | unit2                                |       4 |       4 |   8589934592 |   8589934592 |      128 |      128 |   21474836480 |                  64 |
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+

查询结果显示, unit1 资源单元 CPU、内存使用的分别是 3 C,6 G。

通过以下命令调整  unit1 资源单元 CPU、内存的使用大小为 5 c,10 G。

obclient [oceanbase]>  ALTER resource unit unit1 max_cpu =5,min_cpu =5 ,memory_size ='10G';
Query OK, 0 rows affected
obclient [oceanbase]> SELECT * FROM oceanbase.__all_unit_config;
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+
| gmt_create                 | gmt_modified               | unit_config_id | name            | max_cpu | min_cpu | memory_size | log_disk_size | max_iops | min_iops | iops_weight |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+
| 2022-09-29 17:07:14.647714 | 2022-09-29 17:07:14.647714 |              1 | sys_unit_config |     2.5 |     2.5 |  8589934592 |    8589934592 |    25000 |    25000 |           2 |
| 2022-09-29 18:27:21.231880 | 2022-09-30 10:53:49.522260 |           1004 | unit1         |       5   |       5 | 10737418240 |   51539607552 |    80000 |    80000 |           8 |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+

如上所示,租户配置的调整是在线立即生效的,调整成功后, unit1 的 CPU、内存为 5 c,10 G。OceanBase 数据库通过内核的虚拟化技术,在变更配置后租户的 CPU 和内存资源可以立即生效,无需数据迁移或者切换,对业务无感知。

通过查看  DBA_OB_UNITS 信息,您可以获取到资源单元、资源池、租户在集群里的对应信息及 CPU、内存信息。

obclient [oceanbase]> SELECT * FROM DBA_OB_UNITS;


请使用浏览器的分享功能分享到微信等