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

如何使用好oceanbase系列一 自动分区

帅萌的杂谈铺 2025-07-25
252
一、痛点
在使用oceanbase中是否有这样的需求
一个大集群,多个租户(至少5个租户)。每个租户下面有多个库(至少10个库),多个表(至少200个表)。当前我们最大的集群将近100T。
简单来说 是一个多库多表的场景。每个表大小不一样。
如何不拆分会怎么样?那么如何针对这样的集群进行拆分 打散?
1.1 在使用oceanbase中 如果大表不拆分会怎么样?
主要是性能有影响,大表都在一个OB server上。
这样非常会容易造成热点,并且无法利用好oceanbase 分布式的特性。
而且扩展性也受到限制。
简单来说: 会造成 负载不均衡、性能问题、扩展性受限。
1.2 那么如何针对这样的集群进行拆分 打散?
其实这个问题我很早之前咨询过纪老师,他之前给的答复是可以按照主键进行拆分,虽然也能进行拆分,但是也不够完美,毕竟表大小不一样。
如果全部按照 主键进行拆分,拆分的大小,也不一样。
很有可能大的表拆分的分区过小。小的表拆分的过大。
直到最近的发布会,我了解到了自动分区分裂这个功能。
注:自动分区分裂,我个人以为是4.4的新功能。其实是4.3.5的功能。 

二、功能介绍
后来仓氐老师的安利下,我们尝试了自动分区这个功能。
简单来说 可以针对所有的表,进行自动分区,可以按照大小进行分区。
比如当表大小40G(可设置)之后的自动进行分区。
这样的好处就是 小表不用拆分,大表可以进行拆分,进行打散。
在全局索引的使用过程中,也会遇到全局索引热点。
也可以针对全局索引进行拆分。

三、实际应用
我们的使用方式:
alter system set enable_auto_split = true tenant='xxx'开启分裂; xxx=租户id

设置分裂阈值可以搞大一些 比如40G

alter system set auto_split_tablet_size = 40G tenant='xxx' 设置分裂大小; xxx=租户id

等一次或者自己出发一次,合并。

在拆分的过程中,业务完全无感,性能也没有波动。
我们在使用的过程中发现了,默认的索引,没有添加LOCAL关键字的索引,都会变成全局索引
那么查询性能会有影响吗?
其实完全不会有影响,查询性能不会有衰退的情况。
全局索引也可以使用自动分裂。

如果不开启全局索引不开分裂,大部分用的是单分区,可能会存在流量热点,无法打散。

因为全局索引通常是range扫描,所以得用range分区,用户要写全局索引的range分区的上下界挺难,因为要了解数据是咋分布的,而且数据是动态变化的。

所以用自动分裂能够自动选择合适的分区上下界,这样比较方便使用。

操作
ALTER SYSTEM SET global_index_auto_split_policy ='ALL';

四、功能收益
最大的收益就是方便了业务和DBA的使用,通过自动拆分以及自动索引拆分。
使得我们充分利用了oceanbase 分布式的特性,打散了数据和全局索引。同时也避免了大表,索引热点等问题。
我们也充分利用了oceanbase 高压缩,高性能的特点。
非常感谢(排名不分先后):
老记、仓氐、张鑫、苏琅对我们的支持和帮助。

参考资料:

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016836

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

评论