租户是一个逻辑概念,在 OceanBase 数据库里是资源分配的单位,是数据库对象管理和资源管理的基础。对于系统运维,尤其是对于云数据库的运维有着重要的影响。租户在一定程度上相当于传统数据库的“实例”概念。租户之间是完全隔离的。在数据安全方面,不允许跨租户的数据访问,确保用户的数据资产没有泄露的风险。在资源使用方面表现为租户“独占”其资源配额。总体上来说,租户(tenant)既是各类数据库对象的容器,又是资源(CPU、Memory、IO 等)的容器。
OceanBase 系统中包含两大类的租户:系统租户和普通租户。
系统租户是系统内置的,有三个主要的功能:
系统表的容器
所有的系统表都存放在系统租户的空间中。
具备集群管理功能的用户的容器
集群级别的管理功能,比如增加/删除租户,修改系统配置项,每日合并等操作,只允许系统租户下的用户来做。
提供执行系统维护和管理行为所需的资源
像选主、日志同步、每日合并等操作没有按租户分离,这些操作所需的资源由系统租户来统一提供。
和系统租户相对应的是普通租户,普通租户可以被看作是一个数据库实例,它由系统租户根据需要(比如说为了某个业务的需要)创建出来。在创建租户的时候,除了指定租户名字以外,最重要的是指定它占用的资源情况。普通租户具备一个实例所应该具有的所有特性:
可以创建自己的用户
可以创建数据库(database)、表(table)等所有客体对象
有自己独立的 information_schema 等系统数据库
有自己独立的系统变量
数据库实例所具备的其他特性
多租户隔离有不同的实现方式,这些实现方式的效果是类似的。OceanBase 数据库采用的是在数据库内部实现一个 SQL 虚拟机,这种方案的好处是 DB 内把很多业务统一管理,把整个管理机制做得对用户特别透明。另外隔离的开销比较低,单台服务器可以服务更多的租户,降低云服务的整体成本。租户隔离分为三个部分:CPU、IO 还有内存,网络目前还不是瓶颈,不做隔离。
OceanBase 数据库是分布式系统,多租户除了单机层面怎么做隔离,还涉及到在多机层面如何做调度。OceanBase 数据库的负载均衡分为两个层面:第一个层面是租户负载均衡,即把每个租户的资源容器分布到很多台 OBServer 上面去。第二个层面是分区负载均衡,如果租户只在一台服务器,第二个层面是没有必要的。如果租户在多台服务器上,需要把这个租户的分区均匀地分布到它的资源容器中。OceanBase 数据库内部会尽量使得小租户只在一台服务器上,避免分布式事务。当租户需要的资源逐步增加时,OceanBase 数据库也能做到自动扩展,对用户是透明的。