多租户架构 
==========================



租户是一个逻辑概念，在 OceanBase 数据库里是资源分配的单位，是数据库对象管理和资源管理的基础。对于系统运维，尤其是对于云数据库的运维有着重要的影响。租户在一定程度上相当于传统数据库的"实例"概念。租户之间是完全隔离的。在数据安全方面，不允许跨租户的数据访问，确保用户的数据资产没有泄露的风险。在资源使用方面表现为租户"独占"其资源配额。总体上来说，租户（tenant）既是各类数据库对象的容器，又是资源（CPU、Memory、IO 等）的容器。

OceanBase 系统中包含两大类的租户：系统租户和普通租户。

系统租户是系统内置的，有三个主要的功能：

* 系统表的容器

  所有的系统表都存放在系统租户的空间中。
  




<!-- -->

* 具备集群管理功能的用户的容器

  集群级别的管理功能，比如增加/删除租户，修改系统配置项，每日合并等操作，只允许系统租户下的用户来做。
  




<!-- -->

* 提供执行系统维护和管理行为所需的资源

  像选主、日志同步、每日合并等操作没有按租户分离，这些操作所需的资源由系统租户来统一提供。
  




和系统租户相对应的是普通租户，普通租户可以被看作是一个数据库实例，它由系统租户根据需要（比如说为了某个业务的需要）创建出来。在创建租户的时候，除了指定租户名字以外，最重要的是指定它占用的资源情况。普通租户具备一个实例所应该具有的所有特性：

* 可以创建自己的用户

  

* 可以创建数据库（database）、表（table）等所有客体对象

  

* 有自己独立的 information_schema 等系统数据库

  

* 有自己独立的系统变量

  

* 数据库实例所具备的其他特性

  




多租户隔离有不同的实现方式，这些实现方式的效果是类似的。OceanBase 数据库采用的是在数据库内部实现一个 SQL 虚拟机，这种方案的好处是 DB 内把很多业务统一管理，把整个管理机制做得对用户特别透明。另外隔离的开销比较低，单台服务器可以服务更多的租户，降低云服务的整体成本。租户隔离分为三个部分：CPU、IO 还有内存，网络目前还不是瓶颈，不做隔离。 

![](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/9217076061/p184499.png)



OceanBase 数据库是分布式系统，多租户除了单机层面怎么做隔离，还涉及到在多机层面如何做调度。OceanBase 数据库的负载均衡分为两个层面：第一个层面是租户负载均衡，即把每个租户的资源容器分布到很多台 OBServer 上面去。第二个层面是分区负载均衡，如果租户只在一台服务器，第二个层面是没有必要的。如果租户在多台服务器上，需要把这个租户的分区均匀地分布到它的资源容器中。OceanBase 数据库内部会尽量使得小租户只在一台服务器上，避免分布式事务。当租户需要的资源逐步增加时，OceanBase 数据库也能做到自动扩展，对用户是透明的。
