在 OceanBase 中,我们将表进行分区,按照分区粒度将数据划分到集群的不同节点上,来实现负载均衡的目标。但这依赖用户能设计比较好的分区规则才能更好地使用水平扩展能力,这不仅要求用户具备对各种分区方式有充分的理解,并且还要求用户对业务使用数据库的方式有深入的了解,甚至在有些场景中,采用手动分区很难达到各方面都比较优的效果。自动分区分裂特性能自动地根据用户设定的分区阈值大小自动进行分区分裂,使得用户在对分区规划关注较少的前提下,也能用好 OceanBase 数据库的分布式能力。
OceanBase 数据库可以自动的根据分区数据量,对较大的分区进行切分,从而将数据分散到不同的节点。每个节点都可以独立地执行任务,并且可以通过高速的网络互相通信,实现数据的交互和同步,所以分区分裂可以使 SQL 利用更多的节点的资源从而带来更高的执行效率
1.环境准备,解压文件,执行脚本
tar -xzvf split_test_v9.tar.gz
cd /root/split_test_collection/oceanbase/sysbench/lua/ && ./prepare_test_environment.sh
该脚本会创建一个 temp_tenant 租户,配置 4c 10g 的规格的资源,用于接下来的测试。看到 “初始化环境完成” 后可以进行后续实验步骤。
2.在不开自动分裂的环境, 对单分区表进行数据导入,以及 sysbench 查询的测试
obclient -h0.0.0.0 -P2883 -uroot@temp_tenant -c -A -Dtest
CREATE TABLE IF NOT EXISTS sbtest1(
id int AUTO_INCREMENT,
k INTEGER DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
primary key (id)
) partition by range(id) (
partition p0
values
less than (MAXVALUE)
);
quit
# 返回终端执行数据插入脚本
cd /root/split_test_collection/oceanbase/sysbench/lua && ./insert_data.sh
# 利用脚本发起一个 sysbench 随机点查测试
cd /root/split_test_collection/oceanbase/sysbench/lua && ./start_sysbench_test.sh
# 最终 sysbench 将会把本次任务的 QPS 相关统计呈现在终端, 这里我们主要关注 queries 这一行统计数据 (5826.68 per sec),也就是单分区表,每秒平均执行了 5826.68 次 SQL。
3.在打开自动分裂的环境,对单分区表进行数据导入(系统自动分裂该单分区表),以及 sysbench 查询的测试。
# 登陆到目标租户机器。
obclient -h0.0.0.0 -P2883 -uroot@temp_tenant -c -A -Dtest
# 打开租户级别自动分裂配置项, 这样后续测试的表, 都会打开自动分裂功能
alter system set enable_auto_split = true;
# 新建一张单分区的表
DROP TABLE IF EXISTS sbtest1;
CREATE TABLE sbtest1(
id int AUTO_INCREMENT,
k INTEGER DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
primary key (id)
) partition by range(id) (
partition p0
values
less than (MAXVALUE)
);
quit
# 返回终端执行数据插入脚本
cd /root/split_test_collection/oceanbase/sysbench/lua && ./insert_data.sh
# 登陆到目标租户机器, 发起一次冻结, 用于加速分裂调度(实际生产环境中这一步并不是必要的)
obclient -h0.0.0.0 -P2883 -uroot@temp_tenant -c -A -Dtest
#返回终端,随后登陆到系统租户,查询等待系统完成自动分裂
alter system minor freeze;
quit
# 返回终端,随后登陆到系统租户,查询等待系统完成自动分裂
obclient -h0.0.0.0 -P2883 -uroot@sys -c -A -Doceanbase
# 执行下列 SQL 可查看测试表 sbtest1 各 tablet 主副本(leader)所在的节点信息
SELECT C.tablet_id,
C.ls_id,
D.svr_ip,
D.svr_port
FROM __all_virtual_ls_meta_table AS D
JOIN
( SELECT tenant_id,
A.tablet_id,
ls_id
FROM __all_virtual_tablet_to_ls AS A
JOIN
( SELECT tablet_id,
part_name
FROM __all_virtual_part
WHERE table_id =
( SELECT table_id
FROM __all_virtual_table
WHERE TABLE_NAME = 'sbtest1' ) ) AS B ON A.tablet_id = B.tablet_id ) AS C ON C.ls_id = D.ls_id
WHERE D.role = 1
AND D.tenant_id =
( SELECT tenant_id
FROM __all_tenant
WHERE tenant_name = 'temp_tenant' );
# 输入 quit 返回终端, 并利用脚本发起一个 sysbench 随机点查测试
cd /root/split_test_collection/oceanbase/sysbench/lua && ./start_sysbench_test.sh
# 最终 sysbench 脚本将会把本次任务的 QPS 相关统计呈现在终端,这里我们主要关注 queries 这一行统计数据(9209.51 per sec)。也就是打开分区分裂后,每秒平均执行了 9209.51 次 SQL
sysbench 测试结果总结
核心优势
OceanBase 的自动分裂特性通过将大数据分区自动切分并分散到不同节点,相比与单分区无分裂实现了以下提升:
性能提升显著
延迟表现优秀
负载均衡优化
资源利用率:多节点并行处理能力得到充分利用。
结论
这些数据充分证明了 OceanBase 自动分裂特性提高了 SQL 执行效率,是发挥分布式数据库优势的重要技术手段。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




