暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【OceanBase 诊断调优】—— 租户分区数上限计算方式

数据库工兵营 2024-10-10
148

适用版本:V2.1.x、V2.2.x、V3.1.x、V3.2.x、V4.0.x、V4.1.x、V4.2.x

从 OceanBase 数据库 V2.1 版本开始,对内存使用做了按租户拆分,目前大部分内存模块已经拆分到各个租户下面,这样便于计算每个分区的内存开销,同时也可实现根据租户内存计算理论分区数上限,避免无限制创建分区导致租户内存爆掉。

如何计算分区数上限

首先,我们需要计算出租户可用内存上限,计算方式如下:

  • 统计每个租户在各个 Server 上的分区数量。

    select svr_ip, svr_port, table_id >> 40 as tenant_id, count(*) as part_num from  (select * from __all_virtual_clog_stat group by table_id, partition_idx) as vt group by svr_ip, table_id >> 40 order by svr_ip, tenant_id;

  • 统计每个租户在每个 Server 上的内存上限。

    select u.svr_ip, u.svr_port, t.tenant_id, uc.max_memory, p.replica_type from __all_unit u, __All_resource_pool p, __all_tenant t, __all_unit_config uc where p.resource_pool_id = u.resource_pool_id and t.tenant_id = p.tenant_id and p.unit_config_id = uc.unit_config_id;

  • 查询每个 Server 的 memstore_limit_percentage

    select svr_ip, svr_port, name, value from __all_virtual_sys_parameter_stat where name = 'memstore_limit_percentage';

  • 对于 F 类型的 unit,需要为 memstore 预留内存。

    • 租户可用内存上限 = 租户总内存上限 * (1-memstore_limit_percentage)。

  • 对于 L 类型的 unit,无需为 memstore 预留内存。

    • 租户可用内存上限 = 租户总内存上限。

接下来,可以利用上面的租户可用内存来计算理论分区数上限值:

没有使用 Partition Group 的版本(V2.2 之前的版本不支持 Partition Group),设租户当前分区总数为 num,根据如下计算公式进行评估:

所需总内存 = 128K * num + max(1000, num/10) * 400K

需要确保算出来的值不能超过租户可用内存上限,否则需调大租户内存规格。 此外,还需要确保:

  • num >= 1 万 时,同时有写入的分区比例不超过 10%。

  • num < 1 万时,同时有写入的分区总数不超过 1000 个。

OceanBase 数据 V2.2 及之后的版本,如果使用了 Partition Group 功能,由于一个 Partition Group 中可能包含很多 partition,其内存开销要比普通的单个分区大,我们按每个 Partition Group 预留 (528KB+1MB)内存来计算,根据系统已有的 Partition Group 数量计算需要为 Partition Group 预留的内存。

OceanBase 数据库 V3.x 和 V4.x 版本的最大限制


类型OceanBase 数据库 V3.x 版本最大限制OceanBase 数据库 V4.x 版本最大限制
OceanBase 数据库 的分区副本数建议值为 5w;说明: OceanBase 数据库 分区总数受隐藏参数 _max_partition_cnt_per_server
,V2.2.77 版本默认值为 10w;V3.2.3 版本默认值为 50w; 但是超过 5w 会存在稳定性问题,后续需要对所有部署的集群做这个配置的修改。SYS 租户大概需要使用 4000 分区,所以用户可用的所有租户最大为46000。
无严格限制,详细内容参见:使用限制 不再有 _max_partition_cnt_per_server
 配置,主要取决于租户的资源,每个 OceanBase 数据库节点的分区副本数可根据租户内存大小来预估,1G 内存约支持约 2 万 tablet。
租户分区数租户的分区总数限制是根据租户的资源来计算的,计算公式如下: partition_num = (max_memory - memstore_limit) partition_mem + max_memory:租户最大内存 + memstore_limit:MEMStore 内存 + partition_mem:每个分区占用的内存(系统按这个大小来估算分区总数并加以限制) partition_mem 的计算公式 - 不使用 PG:partition_mem = 128K(static) +1/10 * 400K(dynamic) =168K,假定 1/10 的分区处于 active 状态 - 使用 PG:partition_mem = 128K(static) + 1/10 * (400+1024) K = 270K,按照 512K 来估算 PG 中的 partition 如果 memstore_limit_percentage 配置的是 50%,假设没有使用 PG; partition_num = (0.5 * 租户内存) / (128K + 400K * 1/n) 假设租户内存 32G,n = 10; 最大分区数为10w个。远大于节点的 5w 个建议。 所以,内存 >16G, 一般可以不用考虑租户的分区限制,瓶颈在集群上。每个 OceanBase 数据库节点的分区副本数可根据租户内存大小来预估,1G 内存约支持约 2 万 tablet (内存的计算需要扣除 meta 租户,2 万 tablet 受变量 _max_tablet_cnt_per_gb
 控制)  租户内存为 4G 时,可以简单计算: 租户最大分区 = (租户内存数 - 1G) * 2w
单表分区个数限制MySQL 模式:8192 个MySQL 模式:8192 个


文章转载自数据库工兵营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论