用户租户有自己的resource pool和unit 资源,请问用户租户的meta租户有没有单独的资源?还是和用户租户公用资源?如何公用资源呢?
metadb 租户和对应的用户租户共享资源
Meta 租户的资源配置
Meta 租户没有独立的 Unit,租户资源管理过程中不管理 Meta 租户。系统在创建租户时默认为 Meta 租户预留资源,各项资源从用户租户的资源中扣除。目前 Meta 租户的各项资源采用默认配置,不支持用户指定,包括:CPU、MEMORY、IOPS 以及 LOG_DISK_SIZE。
其中:
- CPU 资源:Meta 租户和用户租户共享 CPU 资源,不做隔离。考虑到公有云最小 1c2G 的售卖模式,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 资源。
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001429672
这里表述不太严谨,应该表述为占租户(1G)的50%
我的意思是 meta租户占租户内存资源50%, memstore也占50%,那就没有其他的内存可用了
比如给1008租户分了2G,则meta租户(1007)占1G,1008占1G, memstore占的50% 是这个1G的50%,不是2G的50%
这样解释肯定是有问题的,基本上都是认为:租户的memstore 是租户unit规格的50%。
这个问题好解决,你可以建个租户查询下这两个视图看下
GV$OB_MEMSTORE
GV$OB_TENANT_MEMORY
租户1002资源内存规格:
mysql> select TENANT_ID,MEMORY_SIZE/1024/1024/1024 from dba_ob_units where tenant_id=1002;
+-----------+----------------------------+
| TENANT_ID | MEMORY_SIZE/1024/1024/1024 |
+-----------+----------------------------+
| 1002 | 48.000000000000 |
| 1002 | 48.000000000000 |
| 1002 | 48.000000000000 |
+-----------+----------------------------+
MEMORY_SIZE=48G
分配给用户租户的:
mysql> select tenant_id,hold/1024/1024/1024 as "hold in GB" from GV$OB_TENANT_MEMORY where tenant_id=1002;
+-----------+-----------------+
| tenant_id | hold in GB |
+-----------+-----------------+
| 1002 | 39.449661254883 |
| 1002 | 39.457771301270 |
| 1002 | 39.457756042480 |
+-----------+-----------------+
当前租户的有效内存是39.5G,也不是上面所说的memory_size(48G)--meta内存(48G*10%)=43.2GB
用户租户的memstore分配的:
mysql> select TENANT_ID,MEMSTORE_LIMIT/1024/1024/1024 from GV$OB_MEMSTORE where tenant_id=1002;
+-----------+-------------------------------+
| TENANT_ID | MEMSTORE_LIMIT/1024/1024/1024 |
+-----------+-------------------------------+
| 1002 | 17.279999963938 |
| 1002 | 17.279999963938 |
| 1002 | 17.279999963938 |
+-----------+-------------------------------+
3 rows in set (0.01 sec)
租户的MEMSTORE_LIMIT约是17GB
- MEMORY 资源:内存资源不支持共享,Meta 租户和用户租户的内存资源需要隔离。默认 Meta 租户占整体租户规格的 10%。为了保证 Meta 租户正常运行,Meta 租户内存资源规格最小为 512M,不设最大值。整体租户内存规格减去 Meta 租户内存规格即为用户租户的内存规格。整体租户规格最小值调整为 1G。下面举例说明:
- 租户规格大于等于 10G 时,Meta 租户和用户租户内存规格比例为 1:9
- 租户规格大于等于 2G 时,Meta 租户的内存规格固定为 1G,剩余资源给用户租户
- 租户规格小于 2G 时,Meta 租户固定分配 512M,剩余资源给用户租户
- 租户规格最小 1G,Meta 租户占用 512M,用户租户占用 512M
有点疑惑,实际内存跟这个算法不一致。
另外一些文档的算法也是错误的,如下:
这个查出来是多少?
mysql> select tenant_id,hold/1024/1024/1024 as "hold in GB" from GV$OB_TENANT_MEMORY where tenant_id=1001;
+-----------+----------------+
| tenant_id | hold in GB |
+-----------+----------------+
| 1001 | 4.451454162598 |
| 1001 | 4.303016662598 |
| 1001 | 4.371376037598 |
+-----------+----------------+
3 rows in set (0.00 sec)
memory_size=48G
用户租户 39.5G
meta租户 4.5GB
感觉有4G内存被吃掉了一样。
GV$OB_TENANT_MEMORY 这个视图里面的hold+free 是租户分配的总内存
我的版本是 4.3.0.1
资源规格内存 =meta租户内存 + 用户租户内存
用户租户内存= memstore + 可变区域内存
现在的情况是 sum(meta租户内存 + 用户租户内存) != memory_size
你在计算meta租户内存或者用户租户内存时只算了hold部分,你需要将free也算上
select sum(hold+free) from GV$OB_TENANT_MEMORY where tenant_id=xxx
一直以为 hold就是分配的 ,还有个free