【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】4.0
【问题描述】我看从4.0开始增加了meta租户,而且每个用户租户都有一个对应的。那会不会导致资源分配比较多啊?为啥考虑增加一个这么个租户出来哪?系统视图起不很难维护?
Meta是自管理的租户,不能直接登录,用于存储和管理用户租户的集群私有数据。
Meta租户的资源是按一定规则和比例从用户租户资源分配出来的,不会为其单独分配资源
Meta 租户概念
4.0开始,引入了Meta租户概念,每创建一个用户租户,系统都会自动创建一个Meta租户。Meta租户的生命期与用户租户一致,系统会自动管理Meta租户,用户在运维过程中不需要关心Meta租户。
Meta租户本质上也是一个租户,有自己独立的schema名字空间,从SQL引擎、事务引擎、存储引擎到日志引擎都不特殊处理和感知Meta租户,与其他租户一样相互隔离。
从数据层面,Meta租户与普通租户一样实现了schema元信息自解释,可以实现服务自举。
从功能层面,Meta租户管理了一组内部表,存储了租户级别的私有数据,包括:配置项、用户租户日志流位置信息、日志流状态信息、日志流副本信息、合并调度和进度信息、备份恢复管理信息、主备租户管理信息等。可以看出,Meta租户下存储的数据都是和集群相关的数据,我们称之为私有数据,这些数据不参与物理备份恢复,不会通过REDO日志方式物理同步和恢复到物理备集群上。
本质上,我们将用户的数据分为两部分进行管理:
- 私有数据:和集群、Server、副本等相关的数据,不参与跨集群物理同步和物理备份恢复,存放在Meta租户中
- 非私有数据:用户创建和管理的数据,包括:数据库对象schema、用户表数据、事务数据、日志流管理数据等,有更强的数据保护和可用性要求,支持跨集群物理同步和物理备份恢复,存放在用户租户下
关于Meta租户与其他类型租户的区别,详见文档:https://www.oceanbase.com/docs/community-observer-cn-10000000000901102
如何查看Meta租户
登录系统租户,查询 DBA_OB_TENANTS
视图即可查看所有的租户。TENANT_TYPE
为META
的租户即为Meta租户。
Meta租户命名规则:META${user_tenant_id}
例如:用户租户的租户 ID 为 1002
,对应 Meta 租户的租户名为META$1002
3.x之前的版本,用户创建的租户ID是连续的,1001、1002、1003…。
从4.0版本开始,有如下约定:tenant_id为偶数的是用户租户,tenant_id为奇数的是Meta租户;并且Meta租户与用户租户关系为:meta_tenant_id + 1 = user_tenant_id
Meta租户不可登录,普通用户只能通过系统租户的视图查询Meta租户下的数据。
4.0 为什么引入Meta租户
OceanBase从2.x版本开始支持物理备份恢复和物理备库。但是从系统架构上并没有很好的支持,私有数据和非私有数据混杂存放在同一个租户下,系统各个模块都要感知和特殊处理,数据一致性上也很难定义清楚,让系统越来越复杂,很难维护。
在物理备集群上,租户的非私有数据通过REDO日志进行同步和实时恢复,不可修改,仅支持只读访问。但是对于租户私有数据,备集群上需要支持写入,例如:为了实现主备集群各自独立运维,备租户需要支持独立配置配置项,配置项表需要支持写入;备租户的副本信息、位置信息需要单独汇报,meta表需要支持写入;备租户也要单独调度合并,推进合并状态,合并相关的表需要支持写入等等。为了支持私有表数据的写入,SQL引擎、事务引擎、存储引擎、PAXOS日志同步都要特殊感知私有表属性,对私有表特殊处理。特别地,备租户上私有表和非私有表数据的事务版本号不再取自同一个GTS时钟源,不同表之间的Join有一致性问题。
综上所述,租户的私有数据和非私有数据的属性不同,他们之间需要进行隔离,需要从实现机制上彻底拆分开。为此,4.0引入了Meta租户概念,专门管理租户私有数据,他们有自己独立的名字空间,独立的SQL、事务、存储和日志引擎,实现上各个模块不再特殊处理Meta租户,让代码更容易维护。机制上,彻底杜绝了私有数据和非私有数据访问的一致性问题,跨租户不支持访问。
Meta租户资源管理
Meta租户是系统自动创建和管理的租户,用户在创建租户、管理租户资源过程中不需要关心Meta租户。Meta租户和用户租户共享Unit,各项资源自动与用户租户共享或者从用户租户资源中扣除。
GV$OB_UNITS
视图会展示每台server的租户和Unit信息,可以看到每台server上不仅包括用户租户信息,还有Meta租户信息,并且用户租户和Meta租户共享同一个Unit。
下面给出了Meta租户分配各种资源的方式。
CPU资源 :Meta租户和用户租户共享CPU资源,不做隔离。CPU规格最小为1c。对外产品表现上,GV$OB_UNITS
视图中展示的Meta租户的CPU资源规格会为NULL
,表示与用户租户共享CPU资源。
MEMORY资源 :内存资源不支持共享,Meta租户和用户租户的内存资源需要隔离。默认Meta租户占整体租户规格的10%。为了保证Meta租户正常运行,Meta租户内存资源规格最小为512M,不设最大值。整体租户内存规格减去Meta租户内存规格即为用户租户的内存规格。整体租户规格最小值为1G。下面举例说明:
- 租户规格大于等于10G时,Meta租户和用户租户内存规格比例为1:9
- 租户规格大于等于2G时,Meta租户的内存规格固定为1G,剩余资源给用户租户
- 租户规格小于2G时,Meta租户固定分配512M,剩余资源给用户租户
- 租户规格最小1G,Meta租户占用512M,用户租户占用512M
日志盘资源 :日志盘资源规格用户可以不指定,默认值为内存资源的3倍大小,最小值为2G。日志盘资源和内存资源一样,不支持共享,Meta租户和用户租户的日志盘资源需要隔离。默认,Meta租户占整体租户规格的10%。为了保证Meta租户正常运行,Meta租户的日志盘资源规格最小为512M。
IOPS资源 :Meta租户和用户租户共享IOPS资源,不做隔离。对外产品表现上,GV$OB_UNITS
视图中展示的Meta租户的IOPS资源规格会为NULL
,表示与用户租户共享IOPS资源。
Meta租户对系统视图的影响
4.0版本提供了新的视图体系,规范了视图命名,新引入了若干视图,旨在统一对外用户接口,保证接口兼容性,提升用户使用体验。视图分为两大类:动态性能视图和数据字典视图。视图的访问只能在用户租户和系统租户下。Meta租户不能登录,不支持直接访问Meta租户信息。Meta租户的信息只能通过系统租户下视图展示。
动态性能视图展示了server上动态变化的信息。租户级别的动态性能视图仅展示租户所在的所有server上的本租户的信息;系统租户下,动态性能视图默认展示所有租户的信息,包括系统租户、用户租户和Meta租户。例如:GV$OB_PARAMETERS
在用户租户下仅展示本租户的配置项信息;在系统租户下,展示所有租户的配置项信息,包括系统租户、用户租户和Meta租户。
数据字典视图是实体表的封装,不同类型的数据字典访问的数据不同。DBA_xxx
/ ALL_xxx
/ USER_xxx
视图仅展示本租户的数据字典信息;系统租户下的CDB_xxx
类视图展示所有租户的数据字典信息,包括系统租户、用户租户以及Meta租户。例如:DBA_OB_LS
,在用户租户和系统租户下仅展示本租户的日志流信息。CDB_OB_LS
,在系统租户下展示所有租户的日志流信息,包括系统租户、用户租户以及Meta租户。