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

Gaussdb T 分布式集群数据存储策略示例

原创 muggle 2020-02-17
2193

1. Gaussdb T分布式集群数据存储策略介绍

GaussDB T分布式集群采用水平分表的方式,将业务数据表的元组打散存储到各个节点内。这样 带来的好处在于,查询中通过查询条件过滤不必要的数据,快速定位到数据存储位置,可极大提升数据库性能。
GaussDB T支持HASH、RANGE,LIST数据分布策略。用户可在CREATE TABLE时增加DISTRIBUTE BY参数,来对指定的表应用数据分布功能。

2. Gaussdb T分布式集群数据存储演示前准备工作

2.1 建表空间及用户

需在每个CN,每个角色为主库的DN上创建相同用户及表空间。

create tablespace gaussdb_share datafile 'gaussdb_share' size 100m  autoextend on shard;
create user muggle identified by Dbalife#8989 default tablespace gaussdb_share;
grant dba to muggle;

3.分布式集群水平分表操作示例

Gaussdb T分布式集群建表与传统建表略有差异,需带上DISTRIBUTE BY及分表策略参数(HASH/RANGE/LIST)。

3.1 HASH水平分表操作示例

a).建表:

drop table if exists muggle_hash;
CREATE TABLE muggle_hash(
id INT NOT NULL,
name VARCHAR(50)
)
TABLESPACE gaussdb_share
DISTRIBUTE BY HASH (id);

b).插入数据

declare 
i number;
begin
i:=0;
for i in 1..10000 loop
insert into muggle_hash values(i,'muggle');
commit;
end loop;
end;
/

c).检查数据分布情况:

SQL> route by null;

Succeed.

SQL>  select count(*) from muggle_hash;

COUNT(*)            
--------------------
10000               

1 rows fetched.

SQL> route by node 1;

Succeed.

SQL> select count(*) from muggle_hash;

COUNT(*)            
--------------------
5039                

1 rows fetched.

SQL> route by node 2;

Succeed.

SQL> select count(*) from muggle_hash;

COUNT(*)            
--------------------
4961                

1 rows fetched.

结论:HASH数据分布比较灵活,但数据分布并不是严格意义上的1:1分布。

3.2 RANGE水平分表操作示例

a).建表:

drop table  if exists muggle_range;
CREATE TABLE muggle_range(id INT NOT NULL, name varchar(40))
tablespace gaussdb_share
DISTRIBUTE BY RANGE(id)
(
GROUPID 1 VALUES LESS THAN(5000),
GROUPID 2 VALUES LESS THAN(MAXVALUE)
);

b).插入数据:

declare 
i number;
begin
i:=0;
for i in 1..10000 loop
if i<5000 then
insert into muggle_range values(i,'dn1');
commit;
else
insert into muggle_range values(i,'dn3');
commit;
end if;
end loop;
end;
/

c).检查数据分布情况:

SQL> route by null;

Succeed.

SQL> select min(id),max(id) from muggle_range;

MIN(ID)      MAX(ID)     
------------ ------------
1            10000       

1 rows fetched.

SQL> route by node 1;

Succeed.

SQL> select min(id),max(id) from muggle_range;

MIN(ID)      MAX(ID)     
------------ ------------
1            4999        

1 rows fetched.

SQL> route by node 2;

Succeed.

SQL> select min(id),max(id) from muggle_range;

MIN(ID)      MAX(ID)     
------------ ------------
5000         10000       

1 rows fetched.

结论:RANGE是严格意义上的1:1分布,但存在需定义groupid的问题,在数据扩容时不够灵活。

3.3 LIST水平分表操作示例

a).建表:

DROP TABLE IF EXISTS muggle_list;
CREATE TABLE muggle_list(id int, key char(32) not null) DISTRIBUTE BY
LIST(key)
(
groupid 1 values ('dn1'),
groupid 2 values ('dn3')
);

b).插入数据:

declare 
i number;
begin
i:=0;
for i in 1..10000 loop
 IF i <= 5000 THEN
insert into muggle_list values(i,'dn1');
commit;
else 
insert into muggle_list values(i,'dn3');
commit;
end if;
end loop;
end;
/

c).数据分布

SQL> route by null;

Succeed.

SQL> select min(id),max(id) from muggle_list;

MIN(ID)      MAX(ID)     
------------ ------------
1            10000       

1 rows fetched.

SQL> route by node 1;

Succeed.

SQL> select min(id),max(id) from muggle_list;

MIN(ID)      MAX(ID)     
------------ ------------
1            5000        

1 rows fetched.

SQL> route by node 2;

Succeed.

SQL> select min(id),max(id) from muggle_list;

MIN(ID)      MAX(ID)     
------------ ------------
5001         10000       

1 rows fetched.

结论:LIST是严格意义上的1:1分布,但存在需定义groupid的问题,在数据节点扩容时不够灵活。

4.总结

GaussDB T分布式集群采用水平分表的方式将数据分布到各个DN节点,类似于ORACLE的分区表,可对数据进行一定程度的拆分,在大数据量的表数据处理上,由于DN节点有限,单独使用水平分表可能还是达不到ORACLE分区表的效果,建议采用水平分表+分区组合的方式进行数据处理效果可能更佳。

最后修改时间:2020-02-17 15:51:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论