当前位置: 首页 > news >正文

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

相关文章:

  • 秘塔AI搜索:国产无广告智能搜索引擎,重塑高效信息获取体验
  • c# .netCreateLinkedTokenSource链接令牌,取消信号异步执行
  • 使用模板创建uniapp提示未关联uniCloud问题
  • 考研408《计算机组成原理》复习笔记,第三章(1)——存储系统概念
  • leetcode:面试题 08.06. 汉诺塔问题
  • Linux->进程概念(精讲)
  • Golang 中接口嵌套的详细说明和使用示例
  • K8s入门指南:架构解析浓缩版与服务间调用实战演示
  • GetX 实现 MVVM 架构, 高效 路由管理 和 状态管理
  • Maven生命周期,测试
  • Oracle导入导出 exp命令和imp命令 expdp命令和impdp命令 19c导出兼容11g版本的dmp然后使用11g导入dmp
  • 算法-动态规划-钢条切割问题
  • Python商务数据分析——Python 入门基础知识学习笔记
  • 零基础学习Redis(14) -- Spring中使用Redis
  • Go语言--语法基础6--基本数据类型--数组类型(1)
  • 为OneCode 开发TRea 开发插件,从环境搭建到生态融合
  • 跨域问题说明
  • 开发语言本身只是提供了一种解决问题的工具
  • 给docker 配置代理 IP机端口
  • Java事务失效(面试题)的常见场景
  • 网站建设技术服务费怎么入账/软文广告经典案例800字
  • wordpress发微信公众号/菏泽地网站seo
  • 舆情运营岗位主要做什么/网络优化软件有哪些
  • 企业wap网站模板/seo在线排名优化
  • 微信做模板下载网站有哪些内容/长沙疫情最新消息今天封城了
  • css网站布局原码/微信公众号营销