OceanBase 数据库 V4.0 架构之前采用分区日志流,每一个分区是一个单独的 Paxos 组。当一台 OBServer 节点包含很多分区时,Clog 主备 Keep Alive 的 RPC 开销增大,后台遍历分区的定时任务的开销增大,每个分区占用的内存增加,整个 OBServer 节点的 CPU 开销会比较高,OBServer 节点的服务能力下降;容灾场景下,系统恢复时间也会过长,影响 RPO。 目前 3.x 版本的 OceanBase 数据库的单机 partition 上限已经增加到 50w。然而当单机 partition 分区数达到 5w 以后,由于 RS 内部事务调度线程压力和内部 Schema 刷新机制,节点重启恢复时间和 DDL 执行时间已经会比正常执行 RT 高很多,所以生产中仍建议以 OCP 默认单机 partition 上限告警阈值 3w 为推荐值。
查询各台主机上的单机的 partition 数
可在 SYS 租户中,通过下述语句查询各台主机上的单机的 partition 数。
obclient> select svr_ip,svr_port,count(*) from oceanbase.__all_virtual_partition_table group by svr_ip,svr_port;
注意
- 对于分区表,每个分区均会算一次 partition 数。
- 对于索引:
- 如果是非本地索引,会独立算 partition 数。
- 如果是本地索引,则不会额外增加分区数
补充说明
除了单机上分区数限制以外,租户的最大分区数还受限于租户的资源规格。如果租户资源规格不够,在 OceanBase 数据库中创建分区的操作可能会失败,报 ret=-5188(too many partitions)的错误。 租户在任一 OBServer 节点上的分区数上限是根据租户资源单元的内存上限来计算的,计算公式如下:partition_num = (max_memory - memstore_limit)/ partition_mem。
其中:
max_memory:租户最大内存。
memstore_limit:MemStore 内存。
partition_mem:每个分区占用的内存(系统按这个大小来估算分区总数并加以限制)。
不在 partition group 的分区:168K。
在 partition group 中的分区:512K。
适用版本
OceanBase 数据库 V3.x 版本。