租户与资源管理
=======

OceanBase 数据库是多租户的分布式数据库，用户可以在一个集群内部创建多个相互独立的租户，每个租户是一个独立的数据库服务，用户可以指定需要的硬件资源，创建数据库服务的账号、表格、存储过程等对象。租户的硬件资源以资源池（Resource Pool）的形式进行描述，资源池是由资源单元（Resource Unit）组成，资源单元是数据库服务内部分配的 CPU、内存、硬盘等硬件资源。

建立租户前，必须规定租户使用的资源范围，资源池和资源单元可以解决租户资源隔离和负载均衡的需求。

资源单元（Resource Unit） 
----------------------------

资源单元对应 CPU、内存、存储空间、IOPS 这几个物理资源，是 OceanBase 数据库服务内部的资源容器。资源单元会在集群内自动负载均衡，任何一个资源单元一定会放置在一个资源足够容纳它的服务器上。当集群内的服务器下线前，其上的资源单元必须迁移到其他服务器上，如果集群内其他服务器的资源不足以容纳将要下线的服务器上的资源单元，会导致服务器下线无法成功。

资源单元配置（Resource Unit Config） 
-------------------------------------

资源单元配置是描述资源单元的配置信息，每一个资源单元配置会描述一种规格的 CPU、内存、存储空间、IOPS。修改资源配置可以动态调整资源单元的计算资源，进而调整对应租户的资源。

**示例：创建** **资源单元配置**

```javascript
CREATE RESOURCE UNIT uc1 MAX_CPU 4, MIN_CPU 4, MAX_MEMORY '32G', MIN_MEMORY '32G', MAX_IOPS 128, MIN_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64;
```

目前只有 CPU、内存实际产生作用，存储空间和 IOPS 的值需要填写，但是系统不会限制。

MAX_CPU 可以与 MIN_CPU 相等，也可以比 MIN_CPU 大。资源单元首先按照 MIN_CPU 配置项分配初始资源，当租户使用量较大时，系统会自动调整租户的资源使用量，最大调整到 MAX_CPU。

MAX_MEMORY 可以与 MIN_MEMORY 相等，也可以比 MIN_MEMORY 大，系统按照 MAX_MEMORY 进行资源分配，建议将 MAX_MEMORY 与 MIN_MEMORY 设置成相等的。

资源池 （Resource Pool） 
----------------------------

资源池由具有相同资源单元配置的若干个资源单元组成。一个资源池只能属于一个租户。一个租户可以拥有一个或多个资源池，这些资源池的集合描述了这个租户所能使用的所有物理机器资源。一个租户在同一个服务器 上最多有一个资源单元。

**示例：创建资源池**

```javascript
CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('zone1');
```

资源单元的均衡 
----------------

OceanBase 数据库会将一个租户的资源单元在集群的服务器间均衡。一个租户拥有一个或多个资源池描述的多个资源单元，在每个 Zone 内资源单元的基本均衡策略如下：

* 同一个租户的若干个资源单元，会均匀分散在不同的服务器上。
* 当服务器存储使用率超过一定阈值时，通过交换或迁移资源单元，降低存储使用率水位线。
* 根据资源单元的 CPU 和内存规格，通过交换或迁移资源单元，降低 CPU 和内存的平均水位线

