Hologres的Table Group和Shard简介
文章目录
- 一、基础概念
- 1、Table Group和Shard
- 2、Shard与计算节点Worker的关系
- 3、使用建议
- 二、操作指南
- 1、查询默认的Table Group
- 2、查询当前DB有哪些Table Group
- 3、查询某Table Group设置的Shard数
- 4、查询某Table Group下有哪些表
- 5、查询表所在的Table Group
- 6、新建Table Group
- 7、修改默认的Table Group
- 8、新建表指定Table Group
- 9、删除Table Group
- 10、(Resharding)迁移表至新建Table Group
一、基础概念
1、Table Group和Shard
Hologres中数据存储在Pangu系统上,Shard表示数据分片,Table Group则是用于管理这些Shard,类似于存储逻辑概念。
Table Group是Hologres特有的一个存储逻辑概念(PostgreSQL无此概念)。Table Group与PostgreSQL中的TABLESPACE是不一样的:TABLESPACE唯一标识了数据库对象的存储位置,类似一个目录的概念。而Table Group代表的是底层的逻辑Shard组。
以上可以看出
1、Table Group与Schema的区别
Schema是一个标准的数据库概念,而Table Group是一个逻辑存储概念,并非数据库标准。不同Schema下的表可以位于同一个Table Group,即底层使用同一组Shard存储。
2、Table Group与数据库(DB)的关系
一个DB可以包含一个或者多个Table Group,但是一个DB只能有一个默认Table Group。在创建DB之后,系统会创建一个默认Table Group,可以根据业务情况增加Table Group或者修改默认Table Group。
3、不同Table Group的区别
一个DB可以存在多个Table Group,但Table Group之间的Shard互不相交,每个Shard在实例级别拥有单独的编号。
4、Shard Count
一个Table Group中Shard的数量称为Shard Count。Shard Count在创建Table Group时指定,所以Table Group一旦建立,Shard Count就不能调整,如需调整Shard Count,需要重新创建Table Group并指定Shard数。
5、Shard与Table的关系
Shard负责表数据的存储和查询,系统根据Distribution Key决定表数据分布在哪些Shard,如果没有设置Distribution Key,那么数据就会被随机分配到各个Shard。一个Table Group中可以有多个Table,即多个Table可以分布在同一组Shard上。但是一个Table只能属于一个Table Group,如果Table Group中没有Table,那么Table Group会被系统自动删除。如果Table的数据要从一个Table Group迁移至另外一个Table Group,那么需要重新建表指定Table Group,或者通过迁移函数将数据进行迁移。
2、Shard与计算节点Worker的关系
当创建Table Group并设置Shard数后(如果没有显式设置Table Group和Shard数,那么Hologres会在创建数据库时创建一个默认Table Group并为其设置默认的Shard Count,详情请参见实例规格概述),每个计算节点Worker会在内部创建多个SE,一个SE负责一个Shard数据的读取和写入。
系统机制会尽量保证每个Worker中的SE数量均匀,这样能够让Worker计算资源均匀分配。
系统会保证一个Table Group内的Shard一定是分配给多个Worker,不会出现一个Table Group仅对应一个Worker,其余Worker空置的情况。但如果Table Group的Shard数较少,但是实例规格较大即Worker较多,则会导致某些Worker无法分配Shard,导致某些Worker空置,因此在设计Shard数时一定要充分考虑业务情况,确保Worker的个数与实例总的Shard数有一定的均衡关系。
从上图中能很容易看出一个问题:假如Table Group的Shard数与Worker个数不成比例关系(如上图Table Group 1有3个Shard,但是只有2个Worker),那么就一定会存在某个Worker比其他Worker多分配一个SE给Table Group的情况,这样在计算时,就非常容易造成Worker资源倾斜,容易出现计算长尾。因此我们建议若是要修改Shard Count,建议Shard Count与计算Worker成一定的比例关系。如下图所示Table Group 1和Table Group 2的Shard数都与Worker个数存在倍数关系,计算资源能够均匀的分配。
3、使用建议
1.如无必要不建议新建Table Group,使用默认Table Group即可2.数据量过大,可新建独立较大Shard数的Table Group。表的数据量很小但数量很多,可独立出一个小Shard数的Table Group,减小Query启动开销。3.需要Join在一起的表(Local Join),必须放在同一个Table Group中。4.不要为每个表都设置一个Table Group。5.设置Shard数时,充分考虑Worker个数以及后续的扩容情况,尽量使得Shard数与Worker个数为倍数关系,以此让资源分配更加平衡。6.不支持修改已经创建Table Group的Shard数。如果您需要修改Shard数量,请新建Table Group。7.不建议Shard数设置过多,否则会导致无法分配计算资源,带来额外开销。Hologres从2.0版本开始,将会默认为单个Table Group的Shard数设置上限,并为整个实例设置Shard数上限,防止出现Shard数设置过多导致无法分配计算资源的问题,当超过约定的Shard总数上限时,会提示异常too many shards in this instance,具体Shard数上限规则如下:单个Table Group的Shard数上限=单个Table Group默认Shard数 * 2实例总的Shard数上限=单个Table Group默认Shard数 * 88.如需调整单Table Group的Shard数上限和实例总Shard数上限,需要使用如下GUC参数取消Shard数上限,但是不建议使用,否则可能会因为Shard数过多导致无法分配计算资源。
set hg_experimental_enable_shard_count_cap =off;
二、操作指南
1、查询默认的Table Group
SELECT * FROM hologres.hg_table_group_properties
WHERE tablegroup_name IN (SELECT tablegroup_name FROM hologres.hg_table_group_propertiesWHERE property_key = 'is_default_tg' AND property_value = '1'
);
2、查询当前DB有哪些Table Group
SELECT tablegroup_name
FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;
3、查询某Table Group设置的Shard数
SELECT property_value AS shard_count
FROM hologres.hg_table_group_properties
WHERE property_key = 'shard_count' AND tablegroup_name ='<tg_name>';
4、查询某Table Group下有哪些表
SELECT table_namespace AS schema_name, table_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND property_value = '<tg_name>';
5、查询表所在的Table Group
SELECT property_value AS table_group_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND table_name = '<table_name>';
6、新建Table Group
CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);
--示例:
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);
7、修改默认的Table Group
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');-- 将新创建TG设为默认Table Group,后续新建的表,将默认使用新的Table Group (v0.9及以上版本)
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', 'tg_8');
8、新建表指定Table Group
-- 新建表tbl1并直接关联名为tg_8的Table Group
BEGIN;
CREATE TABLE tbl1 (col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;
9、删除Table Group
--如果Table Group有表存在,则无法删除。
CALL HG_DROP_TABLE_GROUP('tg_8');
10、(Resharding)迁移表至新建Table Group
方式一: 通过Rebuild语法Resharding
方式二: 通过内置存储过程Resharding