详解GaussDB(DWS)逻辑集群,如何化解大规模业务数据管理难题
本文分享自华为云社区《GaussDB(DWS)逻辑集群详解及基本使用介绍》,作者:zl_cao。
一、逻辑集群简介
1.1 原有架构的特点
传统的基于MPP的分布式数据仓库采用的是全对等架构,每个表数据平均分布到所有节点中,这样能保证足够的并发度以及节点间协同,保证性能SLA。只要保证数据在所有节点上是均衡的,数据查询会将计算平均分配到所有节点上,结构简单,扩展性好 。
随着业务越来越大,这种简单的数据分布方式可能会带来一些问题。具体表现为:
-
用户不断把各种业务数据集成到一个数仓中,不同业务逻辑访问同一个数仓,这减少了维护多个数仓的成本,运维方便。但也会导致数仓的数据规模越来越大,表越来越多。不同业务访问数仓过程中会带来资源的竞争,比如CPU、内存、磁盘IO、网络的竞争。虽然通过配置资源池可以一定程度解决资源竞争,但所有业务执行逻辑仍然同时在每个节点上执行,无法做到资源完全隔离。事实上,同一业务的不同作业总是倾向访问本业务相关的表,对其他业务的表访问较少,如果能做到业务内数据“高内聚”,业务间“低耦合”无疑是更好的选择。
-
数据库表无论大小都被切分到所有节点,对小表来说,数据过于分散。当节点规模达到一定程度后,通过增加更多节点,提高查询并行度的方式可能就无法带来理想的扩展性了。如果为了避免集群变大,将不同业务数据拆分成独立集群,集群间数据互访就需要从应用层解决,或者需要跨集群导数。
1.2 逻辑集群架构
逻辑集群实现了一个大集群按节点拆分为不同的节点组(NodeGroup),每个节点组构建一个逻辑集群。例如下图中, 将数据节点1与数据节点2构成一个逻辑集群NodeGroup1, 我们可以让部分独立业务的表均分布在NodeGroup1中, 其他业务存放于NodeGroup2中. 逻辑集群可以很好的解决上面所述的问题.
企业可以根据不同业务的数据规模为其创建不同节点数的逻辑集群,由于不同节点属于不同的逻辑集群,这样可以做到不同业务之间物理资源彻底隔离。在一个逻辑集群内部,所有节点是对等的,数据保持均衡,确保逻辑集群内部作业高效运行。同时,由于所有业务仍然在一个统一的大集群内,有统一的元数据管理和节点管理,跨逻辑集群数据互访非常容易和高效,这样就可以做到高内聚,低耦合。
1.3 逻辑集群的能力
逻辑集群支持的功能
-
数据按节点隔离
-
逻辑集群间资源(CPU/MEMORY/IO)隔离
-
跨逻辑集群访问资源限制
-
逻辑集群并发控制和内存自适应
-
跨逻辑集群访问权限控制
-
非逻辑集群模式和逻辑集群模式转换(仅限单nodegroup )
-
逻辑集群创建、删除、扩容、缩容、节点替换;
-
逻辑集群GUC参数配置;
-
逻辑集群重启和状态查询;
-
逻辑集群支持弹性计算;
逻辑集群不支持能力
-
逻辑集群不支持备份恢复
-
逻辑集群不支持单独启动和停止
-
包含多个普通nodegroup的物理集群不能转换为逻辑集群
-
多逻辑集群不能回退为非逻辑集群模式
-
逻辑集群内不能再划分普通NodeGroup;
-
多逻辑集群不支持合并
-
逻辑集群不支持独立升级
-
逻辑集群模式下不支持一主多备,只支持主备从模式;
逻辑集群实现了三种隔离
-
数据隔离: 不同业务的表创建在不同逻辑集群上,表数据物理上隔离;
-
资源隔离: 不同逻辑集群的CPU,内存,IO资源是隔离的;跨逻辑集群数据访问的资源是受控的;同一逻辑集群内部支持多租户隔离;
-
权限隔离: 访问其他逻辑集群的表和数据库对象需要授权;
此外, 逻辑集群还具有如下特点
-
支持弹性计算: 一个逻辑集群的作业可以利用其他逻辑集群计算资源。
-
支持异构部署: 一个逻辑集群内部节点间配置应该是完全相同的,不同逻辑集群间节点配置可以不同(包括CPU、内存、IO等硬件配置,但操作系统配置需要相同)。
-
支持独立扩缩容: 业务迁移后不用的逻辑集群可以删除,释放的节点可以用于创建新的逻辑集群。
注意:
-
逻辑集群不是独立的集群,仅仅是对物理集群的一种数据划分,不支持独立运维;
-
当前一个物理集群中最多支持创建32个逻辑集群;
1.4 逻辑集群的隔离性
逻辑集群实现了一个大集群按节点拆分为不同的节点组(NodeGroup), 最主要的就是增加了隔离性, 隔离包括数据隔离,资源隔离,权限隔离,运维隔离. 逻辑集群支持数据隔离,资源隔离,权限隔离,不支持运维隔离. 下图对了当前主要的部署场景的隔离性:
相比较而言,使用逻辑集群比单纯用多租户的资源隔离性好,比采用多套物理集群的业务数据互访能力强,但缺点是不同业务不能独立运维。下面将具体来看下逻辑集群对数据隔离,资源隔离,权限隔离的处理:
1.4.1 数据隔离
逻辑集群的数据隔离是指用户表数据的隔离。逻辑集群的系统表信息是共享的(每个逻辑集群都可以看到物理集群中所有的数据库对象,包括表名、视图、函数、存储过程、用户信息、资源池信息);
1.4.2 资源隔离
逻辑集群的资源隔离是指不同逻辑集群访问本逻辑集群内数据时CPU,内存,IO资源不存在资源征用。每个逻辑集群内部可以按租户配置资源;逻辑集群访问其他逻辑集群时资源受限;逻辑集群的资源池可以配置并发作业数,CPU(配额和限额),内存,IO资源;(租户的概念可以另行查阅手册)
1.4.3 权限隔离
每个逻辑集群用户默认只能访问本逻辑集群的表;如果访问其他逻辑集群的表,需要有该逻辑集群的USAGE权限;每个逻辑集群用户只能在本逻辑集群内创建表,不允许在其他逻辑集群创建表;用户创建的所有数据库对象都受到用户所在逻辑集群的权限限制;
已当前较为常见的使用多套集群做隔离来对比逻辑集群的特点, 如下所示:
1.5 专业术语汇总
-
物理集群:有时候也叫大集群,是实际安装的GaussDB分布式数据库集群。包含所有物理节点,所有CN,DN,GTM,CM,ETCD等组件在内。
-
NodeGroup:也叫节点组,是将部分DN节点组成一个逻辑组,可以在一个NodeGroup上创建表;普通的NodeGroup非常灵活,对包含的DN节点没有任何限制,允许一个DN同时属于多个NodeGroup。
-
逻辑集群:是一种特殊的NodeGroup,要求所包含的DN节点以及DN节点所在物理节点都只能属于一个逻辑集群。
-
弹性集群:是一种特殊的NodeGroup,只在逻辑集群模式下存在,第一次创建逻辑集群时自动创建,可能包含DN节点,也可能不包含任何DN节点;
-
Installation nodegroup:GaussDB安装时自动创建的NodeGroup,包含物理集群内所有DN节点;名称通常是group_version1, group_version2;
-
逻辑集群模式:全新安装的数据库集群总是非逻辑集群模式,当数据库集群中成功创建了一个逻辑集群后,就自动转换为逻辑集群模式,判断是否在逻辑集群模式可以通过检查弹性集群是否存在来判断;当删除弹性集群后,数据库集群就转换回非逻辑集群模式(只有所有逻辑集群都删除后,才能删除弹性集群);
-
资源池(Resource Pool):用来进行资源配置的数据库对象;可以用来配置CPU,内存资源;在逻辑集群模式下,创建资源池必须指定逻辑集群名称;
-
控制组(Control Group):通过cgroup来配置CPU资源,资源池通过指定的控制组来限制用户的CPU资源;GaussDB通过gs_cgroup工具来配置控制组;
-
多租户:基于资源池的租户资源管理,包含组资源池和业务资源池两级。数据库用户通过和业务资源池绑定来控制用户执行作业时的资源;
-
系统管理员:在没开启权限分离前基本等同于超级用户,拥有对数据库管理的所有权限;
-
逻辑集群管理员:仅仅属于某个逻辑集群的管理员,但本质上还是一个普通用户,但是可以将所属逻辑集群的访问权限授予其他用户,可以在所属逻辑集群内创建资源池;
-
逻辑集群用户:在逻辑集群模式下,绑定到某个逻辑集群的普通用户,只有绑定到逻辑集群后,才能在该逻辑集群下创建用户表;
-
非逻辑集群用户:在逻辑集群模式下,没有绑定任何逻辑集群的普通用户,这些用户无法创建任何表;
-
逻辑集群转换:将整个集群从非逻辑集群模式转换成逻辑集群模式,物理集群中所有DN节点都被划分到一个统一的逻辑集群中,所有创建了表和资源池的用户都被绑定到该逻辑集群,所有表都属于该逻辑集群,同时创建一个空的弹性集群;
-
逻辑集群回退:将整个集群从逻辑集群模式转换成非逻辑集群模式,只有在集群中只有一个逻辑集群(该逻辑集群包含所有DN节点),且弹性集群为空的时候才允许,转换后所有逻辑集群都会删除,弹性集群也会删除;
-
集群公共组件:指被多个逻辑集群共享的组件,包括CN, GTM, cmserver,cmagent, ETCD;
-
数据库公共对象:指除了表、外表之外的数据库对象;这些对象是所有逻辑集群共享的(但仍然有特殊函数,sequence是特定逻辑集群私有的);
-
初始逻辑集群:指第一个创建的逻辑集群,在没有明确指定逻辑集群名称时,系统管理员创建的表会在初始逻辑集群中;
二、逻辑集群的使用
2.1 逻辑集群的使用场景
多子业务拆分:将一个大业务拆分为多个子业务,每个子业务创建一个独立逻辑集群;子业务之间资源隔离,同时也可以方便地进行跨子业务查询。例如:
-
将需要大批量查询的数据(比如跑批数据)部署在一个逻辑集群中;
-
将需要实时查询的数据部署在一个逻辑集群;
-
将需要频繁更新的数据部署在一个逻辑集群;
-
其他特定资源要求的逻辑集群;
2.2 如果使用逻辑集群
2.2.1 创建多个逻辑集群
逻辑集群有三种创建方式:
-
在新安装的全新的集群上划分逻辑集群,要求:新安装的物理集群没有任何用户表、多租户或资源池;
例如下图中, 全新的集群包含DN1~DN6 6个节点, 我们将DN1~DN3用来创建逻辑集群NodeGroup1, 剩下未使用的DN4~DN6暂时将放入弹性池中, 后续可以用来创建新的逻辑集群.
-
将原有的物理集群转换成逻辑集群,要求:原有物理集群与目标逻辑集群的节点组成需完全一致, 包含的所有用户表和数据库对象都必须全部划分到转换后的逻辑集群内;
-
在已有逻辑集群的基础上, 可以再通过新增节点(扩容)的方式创建新的逻辑集群;
2.2.2 逻辑集群下创建用户和角色
创建逻辑集群用户:
CREATE USER(ROLE)xxx PASSWORD xxx NODE GROUP ng1;
普通用户转换成逻辑集群用户:
ALTER USER (ROLE)xxx NODE GROUP ng1;
只有系统管理员和逻辑集群用户才能够在逻辑集群下创建表;
系统管理员不能绑定到某个逻辑集群,可以在所有逻辑集群下创建表;
2.2.3 原业务表迁移到目标逻辑集群
-
将需要拆分到不同逻辑集群的表通过Insert into …select迁移到其他逻辑集群,并删除原表;
-
原逻辑集群可以通过缩容释放部分节点(但被释放的节点必须独立成环);
2.2.4 逻辑集群下创建表
-
逻辑集群用户执行CREATE TABLE创建的表,分布在所属逻辑集群包含的DN节点上;
-
系统管理员在指定逻辑集群上创建表,需要通过TO GROUP指定逻辑集群名称:
CREATE TABLE ... TO GROUP nodegroup1;
-
系统管理员创建表时如果没有指定TO GROUP,创建的表默认在集群中第一个创建的逻辑集群(pgxc_group中oid最小的逻辑集群)中;通过GUC 参数default_storage_nodegroup可以改变默认的逻辑集群名称;
-
逻辑集群下,所有表(外表)都只分布在所属逻辑集群的DN节点上。
2.3 逻辑集群下SQL语法和兼容性
-
逻辑集群下,创建的函数中不能使用%type 引用表字段类型;
-
逻辑集群下,如果函数的参数和返回值有表类型,这些表必须属于同一个逻辑集群;
-
逻辑集群下,对外表来说,CREATE TABLE … LIKE 语句中源表和目的表需要在同一个逻辑集群;
-
逻辑集群下,创建表时如果需要和其他表共享Sequence,该Sequence需要是所有DN节点共享的;
-
逻辑集群下,如果函数中涉及多个逻辑集群表操作,该函数不应该声明为IMMUTABLE类型和SHIPPABLE类型,如果这样声明,会导致函数可能被下推到DN执行,这样执行过程中DN会找不到不属于其逻辑集群的表;如果函数中包含更新操作,不能声明成IMMUTABLE类型和STABLE类型;
-
逻辑集群下需要考虑逻辑集群权限,如果SQL语句或函数体中如果涉及属于不同逻辑集群的表,SQL语句和函数的执行用户需要授予这些逻辑集群的USAGE权限;
三、其他
3.1 逻辑集群GUC参数配置
每个逻辑集群都允许单独配置GUC参数
gs_guc set -Z datanode -N all -I all -c "parameter = value" --lcname=LCNAME
这些参数只在逻辑集群包含的DN节点上生效;对于postmaster类型的参数,需要重启DN节点才能生效,下面的命令可以用来重启逻辑集群包含的所有DN节点,
gs_om -t restart --nodegroup-name lcname
3.2 逻辑集群数据迁移
将其他系统的数据迁移到逻辑集群,每个逻辑集群都可以创建GDS外表来从GDS中导入数据;
四、总结
为解决大规模业务数据管理难题,通过将物理集群拆分为多个逻辑集群,实现资源、数据、权限的隔离与高效管理。逻辑集群提供了一种高效、灵活的数据库管理方式,满足复杂业务环境下的需求,同时支持弹性计算与独立扩缩容,适配了多样性的需求。