OceanBase 单机租户最多能支持多少分区?
OceanBase 单机租户允许创建的最大分区数是多少?作者通过分区超限错误排查,计算出单机允许创建的最大分区数量。
作者:何文超,爱可生南区交付服务部 DBA 团队成员,主要负责 MySQL 故障处理,MySQL 高可用架构改造,OceanBase 相关技术支持。爱好足球,羽毛球。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文共 1200 字,预计阅读需要 3 分钟。
背景
ERROR 1499 (HY000): Too many partitions (including subpartitions) were defined
创建表报错,虽然是内部错误,但是错误信息是指:创建了太多了分区。
[root@observer04 ~]# mysql -h10.186.64.125 -P2883 -uroot@wenchao_mysql#hwc_cluster:1682755171 -p"xxxx" MySQL [lss]> CREATE TABLE `wms_order` ( `A1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A1', `A2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A2', `A3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A3', `A4` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A4', `A5` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A5', `A6` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A6', `A7` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A7', `A8` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A8', `A9` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A9', `A10` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A10' ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.0' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 COMMENT = '物流订单表' MySQL [lss]> ERROR 1499 (HY000): Too many partitions (including subpartitions) were defined
接下来我们分析一下问题的原因。
排查
2.1 检查参数
- 检查每个 OBServer 上可以创建最大的分区数量,当前是 500000。
[root@observer04 ~]# mysql -h10.186.64.125 -P2883 -uroot@sys#hwc_cluster:1682755171 -p"xxxx" -A oceanBase MySQL [oceanBase]> select * from __all_virtual_sys_parameter_stat where name like '%_max_partition_%'; +-------+----------+---------------+----------+-------------------------------+-----------+--------+--------------+---------------------------------------------+-------------+----------+---------------+---------+---------+-------------------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | value_strict | info | need_reboot | section | visible_level | scope | source | edit_level | +-------+----------+---------------+----------+-------------------------------+-----------+--------+--------------+---------------------------------------------+-------------+----------+---------------+---------+---------+-------------------+ | zone1 | observer | 10.186.64.122 | 2882 | _max_partition_cnt_per_server | NULL | 500000 | NULL | specify max partition count on one observer | NULL | OBSERVER | NULL | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | +-------+----------+---------------+----------+-------------------------------+-----------+--------+--------------+---------------------------------------------+-------------+----------+---------------+---------+---------+-------------------+
- 检查当前分区数量的和,目前并没有超过这个限制(500000)。
MySQL [oceanBase]> select count(*) from v$partition; +----------+ | count(*) | +----------+ | 421485 | +----------+
2.2 检查回收站
- 检查回收站是否开启?
[root@observer04 ~]# mysql -h10.186.64.125 -P2883 -uroot@wenchao_mysql#hwc_cluster:1682755171 -p"xxxx" MySQL [lss]> show variables like '%recy%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | recyclebin | ON | +---------------+-------+ 1 row in set (0.01 sec)
- 检查回收站中是否存在未删除的分区表?
MySQL [lss]> show recyclebin; +-----------------------------------------+---------------+-------+----------------------------+ | OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME | +-----------------------------------------+---------------+-------+----------------------------+ | __recycle_$_1682755171_1689139725669688 | mytable_1 | TABLE | 2023-07-12 13:28:45.687379 | | __recycle_$_1682755171_1689139737584112 | mytable_1 | TABLE | 2023-07-12 13:28:57.584660 | | __recycle_$_1682755171_1689139750594392 | t1 | TABLE | 2023-07-12 13:29:10.594118 | +-----------------------------------------+---------------+-------+----------------------------+ 3 rows in set (0.01 sec)
如果存在,需要和业务侧沟通是否可以清理。回收站的表清理后,发现分区表数量减少,但是创建表依旧报错。
- 查看回收站中中对象保留天数。
MySQL [lss]> SHOW PARAMETERS LIKE 'recyclebin_object_expire_time'\G; *************************** 1. row *************************** zone: zone1 svr_type: observer svr_ip: 10.186.64.122 svr_port: 2882 name: recyclebin_object_expire_time data_type: NULL value: 0s info: recyclebin object expire time, default 0 that means auto purge recyclebin off. Range: [0s, +∞) section: ROOT_SERVICE scope: CLUSTER source: DEFAULT edit_level: DYNAMIC_EFFECTIVE 1 row in set (0.02 sec)
配置项 recyclebin_object_expire_time
的取值说明如下:
- 当其值为 0s 时,表示关闭自动 Purge 回收站功能。
- 当其值不为 0s 时,表示回收一段时间前进入回收站的 Schema 对象。
2.3 检查租户内存
- 找到分区数最多的 10 个租户。
[root@observer04 ~]# mysql -h10.186.64.125 -P2883 -uroot@sys#hwc_cluster:1682755171 -p"xxxx" // 1. 找到分区数最多的 10 个租户 SELECT t2.tenant_name,t2.tenant_id, t1.replica_count FROM (SELECT tenant_id, COUNT(*) AS replica_count FROM __all_virtual_partition_info GROUP BY tenant_id ORDER BY replica_count DESC LIMIT 10) t1 JOIN (SELECT tenant_id, tenant_name FROM __all_tenant) t2 ON t1.tenant_id=t2.tenant_id ORDER BY replica_count DESC; +-------------------+-----------+---------------+ | tenant_name | tenant_id | replica_count | +-------------------+-----------+---------------+ | wenchao_mysql | 1100 | 107853 | | wenchao_01 | 1088 | 99846 | | wenchao_02 | 1104 | 15873 | | wenchao_03 | 1 | 3867 | | wenchao_04 | 1044 | 3270 | | wenchao_05 | 1066 | 2811 | | wenchao_06 | 1079 | 2658 | | wenchao_07 | 1103 | 2103 | | wenchao_08 | 1057 | 2040 | | wenchao_09 | 1016 | 1950 | +-------------------+-----------+---------------+ 10 rows in set (0.13 sec)
- 查找租户有多少表。
select count(*),svr_Ip from __all_virtual_meta_table where tenant_id=1100 and role=1 group by svr_ip; +----------+-------------+ | count(*) | svr_Ip | +----------+-------------+ | 11921 |10.186.64.103| | 11868 |10.186.64.104| | 12013 |10.186.64.105| +----------+-------------+ 3 rows in set (0.35 sec)
- 计算租户需要扩容内存大小。
- 租户当前分区总数 num=107853/副本数
- 租户可用内存上限=(1-memstore_limit_percentage)*租户 unit 的内存大小 =(1-0.8)*24GB=4.8GB
- 单个副本分区所需总内存 partition_mem=128k*(107853/3)+max(1000,(107853/3)/10)*400k=5.75GB
注意:单个副本分区所需总内存 > 租户可用内存上限,租户所需内存超限,需要对租户内存进行扩容。
- 根据租户内存计算最大分区数量。
- 单机租户允许创建的最大分区数量=(max_memory-memstore_limit)/partition_mem_n
- 单机租户允许创建的最大分区数量=(24-24*0.8)/(5.75/(107853/3))=4.8/(5.75/(107853/3))=30011
- partition_mem_n:指的是单个分区所需总内存
临时处理方案: 扩容租户内存。
根源治理: 不可能无限扩内存;给出业务方合理的分区数量限制,建议业务侧合理使用分区表,制定合理的定期清理策略。
总结
根据上述计算得出:单机租户允许创建的最大分区数量为 30011,建议业务侧注意控制分区数量,以免超限,对业务造成影响。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大象转身:支付宝资金技术 Serverless 提效总结
1. 前言 本文是支付宝资金技术团队在《大象转身-支付宝资金技术交付提效之路》系列总结之一。如果你正在负责一个所支撑的业务面临从平台到场景化创新的发展阶段,希望通过提升交付效率来提升技术团队的竞争力和团队研发幸福感, 那么这篇文章也许会让你有收获: 1、Serverless 的技术理念是什么?对业务研发有什么借鉴意义? 2、如何基于 Serverless 驱动研发模式的升级,设计一个能让场景化创新快起来的技术架构,提升全局研发效率? 本篇作者:呆莫(代巍)、歆明(何鑫铭) 文章较长,建议收藏和保存 为什么写这篇文章 我们做了近两年的 Serverless 研发模式的探索和落地,目前该模式已经承接了大部分资金业务的场景,平台也已经进入推广期,有 20+ 团队经过 SOFAServerless 技术团队的介绍找到我们。未接入 SOFAServerless 的想从业务视角寻求架构选型依据和应用架构设计,已接入 SOFAServerless 的同学来寻找基座治理经验。因此决定写一篇文章,将我们的架构选型、设计和落地经验做一次完整的总结。 2. 我们遇到的问题 我们的问题:随着场景创新增多,SO...
- 下一篇
跟着 iLogtail 学习设计模式
设计模式是软件开发中的重要经验总结,Gang of Four (GoF) 提出的经典设计模式则被誉为设计模式中的“圣经”。但是设计模式往往是以抽象和理论化的方式呈现,对于初学者或者没有太多实战经验的开发者来说,直接学习设计模式往往会显得枯燥乏味。 市面上或者网上也经常有一些书籍或者文章,尝试以实际的应用场景深入浅出地介绍设计模式。但是这些资料所列举的样例或应用实践,往往都是一些构造的虚拟场景,缺乏生产级软件的真实应用。而软件理论最重要的是学以致用,那是否有真实生产级代码的学习机会呢? iLogtail 作为一款阿里云日志服务(SLS)团队自研的可观测数据采集器,目前已经在 Github 开源,其核心定位是帮助开发者构建统一的数据采集层。iLogtail 在多年的技术演进过程中,也一直在尝试进行各种设计模式的应用,这些设计模式的应用大大提升了软件的质量与可维护性。本文我们将结合 iLogtail 项目,从实践角度探讨一些常见设计模式的技术原理。在这里也要感谢字节跳动多位同学对 iLogtail Golang 部分架构的一些升级优化。 如果你曾经感到学习设计模式枯燥无味,那么来学习 iLo...
相关文章
文章评论
共有0条评论来说两句吧...