首批通过分布式安全可靠测评,为关键业务系统打造
OBKV-HBase 自动分区分裂
更新时间:2026-04-15 16:01:32
本文档介绍了 OBKV-HBase 的自动分区和分裂策略,以及如何在 OceanBase 中使用 OBKV-HBase 的自动分区和分裂功能。自动分区分裂功能可以根据你设定的分区阈值大小自动进行分区分裂,使你在对分区规划关注较少的情况下,仍然能够充分利用 OceanBase 数据库的分布式能力。
使用限制
目前支持自动 Range/Range Columns 分区,它继承了 Range 分区的优势之一,比较适合范围扫描的场景。同时,它还有普通 Range 分区所不具有的自动按照数据量分裂的能力,将数据量进行均匀分布。
使用说明及示例
表识别标志
OBKV-HBase 分区分裂功能需要通过 kv_attributes 参数来识别指定表是否是 OBKV-HBase 表。因此强烈建议在建表时添加 kv_attributes 设置,以便系统能够准确识别 OBKV 表类型。具体说明请参见 OBKV-HBase 数据模式-表识别标志。
快速入门
要使用自动分区功能,首先需要关注两个配置项:
| 配置项 | 说明 |
|---|---|
enable_auto_split |
控制租户是否开启自动分区功能,默认值 FALSE。 |
auto_split_tablet_size |
控制租户开启自动分区功能之后触发分裂的阈值,默认值 128MB。 |
开启自动分区,命令如下:
ALTER SYSTEM SET enable_auto_split = true TENANT='tenant';
在创建/修改表时,若该表开启了自动分区功能,但未设定自动分区阈值,则会把 auto_split_tablet_size 配置项的默认值 128MB 作为该表自动分区的阈值。当分区的磁盘占用超过该配置项设定的大小时,就会触发分区分裂。如果要手动设置自动分区的阈值,示例命令如下:
-- 设置自动分区阈值为 256MB
AlTER SYSTEM SET auto_split_tablet_size = '256MB';
进阶使用
仅通过配置项可以快速地启用 OBKV-HBase 的自动分区分裂功能,但会为租户内所有的业务启用本功能。如果你的需求是更精细化地管理部分业务表的自动分区分裂功能,可参考如下场景示例:
- 一个将使用 OBKV-HBase 的新业务。
针对这个场景,我们对该业务的新表开启自动分区,示例如下:
-- 创建自动分区的非分区表(使用默认配置的 128MB 为分裂阈值)
CREATE TABLE auto_pt2 (c1 int, c2 int, primary key(c1));
PARTITION BY RANGE ();
-- 创建自动分区的非分区表(分裂阈值为 1024MB,使用用户配置)
CREATE TABLE auto_pt3 (c1 int, c2 int, primary key(c1))
PARTITION BY RANGE () SIZE('1024MB');
- 旧版本的 OBKV-HBase 集群想要升级到支持自动分区的新版本。
针对这种场景,我们需要把已有表开启自动分区功能,通过修改自动分区属性实现,示例如下:
-- 想要从旧版本升级到新版本的业务表 t1,在旧版本建表时未开启自动分区
CREATE TABLE t1 (C1 INT, C2 INT, PRIMARY KEY(C1))
PARTITION BY RANGE(C1) SIZE('10GB')
(PARTITION p0 VALUES LESS THAN(100),
PARTITION p1 VALUES LESS THAN(200),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
-- 在新版本修改表 t1 未自动分区表的分区属性,开启自动分区
ALTER TABLE t1 PARTITION BY RANGE() SIZE('128MB');
- 建议手动分区的业务。
由于目前的自动分区分裂功能只支持数据量的均衡,可能会出现某些分区的数据量较小,但同时某些分区负载又较高的情况。在这种情况下,可以使用手动分区方式,设置分裂的阈值,将高负载分区的数据均匀分配到不同的分区中。示例如下:
-- 假设你有一个表 t1,未开启自动分区
CREATE TABLE pt1 (c1 int, c2 int, c3 int, primary key(c1))
PARTITION BY RANGE(c1)
(PARTITION p0 VALUES LESS THAN(50),
PARTITION p1 VALUES LESS THAN(100),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
-- 假设你发现 0-50 这个分区负载较高,则可以进一步拆分为多个分区
ALTER TABLE t1 REORGANIZE PARTITION p0 INTO (
PARTITION p0_1 VALUES LESS THAN (30),
PARTITION p0_2 VALUES LESS THAN (50)
);