虚拟计算集群
本页目录
虚拟计算集群#
OushuDB 支持若干个节点组织为互斥的虚拟集群。虚拟集群可以使用户的资源使用限定在若干节点上,从而达到合理分配资源并隔绝错误。目前所有关于虚拟计算集群的元数据信息记录在系统表 pg_vcluster 中。
虚拟集群实例(VCI)会根据虚拟集群的定义构造,是实际拥有资源和执行的实体。当SQL向某VC申请资源时,RM内部会选择适当的VCI处理。VCI之间同构,即必须拥有相同的节点个数,目前每个VC可以自由配置,由vcproperty的nsegs_per_vci控制。VCI的信息会体现在pg_vcluster中,名字形如vcname@vciname。
1. 特殊虚拟集群#
OushuDB 在初始化时会自动创建名为 vc_default 的虚拟集群,此虚拟集群不可删除,并自动配有 vc_default.pg_root 和 vc_default.pg_default 资源队列。OID为10的 role(通常为 oushu)会自动绑定 vc_default.pg_default。
2. 虚拟集群拓扑文件配置#
虚拟集群配置允许用户使用拓扑文件描述,其拓扑定义在OushuDB配置文件 oushu-topology.yaml 文件中, 下面是一个虚拟集群拓扑描述:
1nodes:
2 - id: m[1]
3 addr: 192.168.1.11
4 label: { region: "regionA", zone: "zoneA"}
5 - id: m[2]
6 addr: 192.168.1.12
7 label: { region: "regionA", zone: "zoneA"}
8 - id: m[3]
9 addr: 192.168.1.13
10 label: { region: "regionA", zone: "zoneA"}
11
12
13vc:
14 - name: mains
15 vci:
16 - nodes: m[1], m[2]
17 - name: vc_default
18 nsegs_per_vci: 2
19 hash_table_bucket_number: 8
20 magma_hash_table_nvseg_perseg: 8
21 conf_path:
22 vci:
23 - name: vci1
24 nodes: m[1], m[2]
nodes 标识集群内的节点,由节点id,节点地址addr, 节点标签label 构成。 vc 标识一个具体的虚拟集群拓扑描述,由集群名称name,虚拟集群实例大小nsegs_per_vci,集群内hash表的桶数hash_table_bucket_number等VC属性,以及具体的vci组成,在vci 子项下,定义了对应的vci名称以及包含的节点。 该oushu-topology.yaml 会在执行数据库配置文件重载的时候加载到数据库中,生成具体的SQL并执行完成对数据库虚拟集群的更改。
3. 创建虚拟集群#
1CREATE VCLUSTER <name> [
2 WITH ([, <VCPROPERTY>=<value> [, ...] ])
3]
4where <VCPROPERTY>=<value> is:
5 <hash_table_bucket_number> = <integer>
6| <max_nvseg_perquery> = <integer>
7| <max_nvseg_perquery_perseg> = <integer>
8| <magma_hash_table_nvseg_perseg> = <integer>
每一个新创建的虚拟集群会自动创建两个资源队列,加入新虚拟集群的名字为newvc,则资源队列名为newvc.pg_root,newvc.pg_default。
4. 虚拟集群参数#
VCPROPERTY |
Default |
Description |
|---|---|---|
nsegs_per_vci |
1 |
一个 VCI 实例需要的节点数 |
hash_table_bucket_number |
8 |
Hash 表建表时的桶数 |
max_nvseg_perquery |
512 |
单次查询中使用 virtual segment 的最大个数 |
max_nvseg_perquery_perseg |
8 |
单次查询单节点使用 virtual segment的最大个数 |
magma_hash_table_nvseg_perseg |
8 |
对于 MagmaAP 表,单次查询单个节点 virtual segment的最大个数 |
enforce_nvseg |
0 |
强制查询使用的 virtual segment 个数 |
enforce_memory_pervseg |
0 |
在强制的 virtual segment 数量基础上的 virtual segment大小 |
设置虚拟集群属性
1ALTER VCLUSTER <name> WITH (<VCPROPERTY>=<value> [, <VCPROPERTY>=<value>]) [IN SESSION]
2
3ALTER VCLUSTER <name> WITHOUT (<VCPROPERTY> [, <VCPROPERTY>]) [IN SESSION]
设置使用WITH,取消使用WITHOUT(不要设值)。 持久话不要加IN SESSION,临时设置请使用IN SESSION。
显示虚拟集群属性
1SHOW VCPROPERTY <name>
虚拟集群属性的使用/显示按照以下优先级:SESSION>CATALOG>DEFAULT。
5. 创建虚拟集群实例#
1CREATE VCLUSTER <vcname>@<vciname>
2 WITH (SEGMENTS='<hostnames>' | SEGMENTFILE='<hostfile>')
- 在创建VCI时,需要确保其所属的VC <vcname> 已经被创建。否则会产生报错
ERROR: vcluster <vcname> does not exist
在创建VCI时,需要确保VCI中包含的节点数量满足VC属性的nsegs_per_vci值,否则该节点将不对外提供服务。
其中SEGMENTS=’<hostnames>’是一组节点的域名,可由’,’分割,例如:SEGMENTS=’seg1,seg2,seg3’。 每个被分割的域名可以支持如下的扩展匹配:匹配区域由’[]’定义,模式内由’,’分割,利用’..’来进行循环。 具体来讲模式内每个条目有如下三种形式:
X 即为 X
X..Y 表示从X到Y(闭区间)
X..Y..S 表示从X到Y(闭区间),步长为S
其中X,Y,S均为整数,举例:
1192.168.1.[1,2,3..4,5..10..2], oushudb[1..2]
被解析为:
1192.168.1.1
2192.168.1.2
3192.168.1.3
4192.168.1.4
5192.168.1.5
6192.168.1.7
7192.168.1.9
8oushudb1
9oushudb2
SEGMENTFILE=’<hostfile>’是一个包含segment域名的文件位置,文件内容的语法和SEGMENT语法一致,且支持’n’分隔,支持空行
需要注意的是DDL中SEGMENTS和SEGMENTFILE里面的内容全是域名。即使写成IP也会被当成域名,值得庆幸的是IP作为域名会被解析成自身,但不幸的是会让我们产生歧义。更具体地,假设域名localhost对应IP为127.0.0.1,我们不能同时加入localhost和127.0.0.1,因为他们IP冲突。
另外,我们不会验证segments和segmentfile中的域名是否真实有效,也就是说即使你随便胡编乱造节点的域名,vc也会把它加入其中,只是这个节点永远不可用。 我们不建议在 VC 中添加虚假的节点,过多的虚假节点会导致集群状态不健康,出现无法分配或者资源分配不够的问题。
6. 删除虚拟集群或实例#
1DROP VCLUSTER [IF EXISTS] <vcname>
2DROP VCLUSTER [IF EXISTS] <vcname>@<vciname>
一个繁忙的(简易理解:有资源请求)虚拟集群无法被删除。
7. 虚拟集群缩容扩容#
虚拟集群扩容允许用户修改拓扑文件进行扩容,或者使用SQL进行扩容。我们始终建议修改拓扑文件以实现集群扩容,因为在数据库重新加载配置文件时,会生成SQL语句修改虚拟集群配置,如果仅通过SQL修改,在后续的一次参数加载时会恢复为文件配置。
如果添加一个未在拓扑文件中包含的节点,需要首先在nodes中添加一个节点,设其地址为192.168.1.14
1nodes:
2 - id: m[1]
3 addr: 192.168.1.11
4 label: { region: "regionA", zone: "zoneA"}
5 - id: m[2]
6 addr: 192.168.1.12
7 label: { region: "regionA", zone: "zoneA"}
8 - id: m[3]
9 addr: 192.168.1.13
10 label: { region: "regionA", zone: "zoneA"}
11 - id: m[4]
12 addr: 192.168.1.4
13 label: { region :"regionA", zone: "zoneA"}
对数据库节点的扩容缩容,可以直接修改oushu-topology.yaml 中的 vc配置,需首先确认vc 属性中 nseg_per_vci的值,修改为扩容缩容后的值,随后在对应的vci实例中添加/移除对应的节点标签。
1 - name: vc_default
2 nsegs_per_vci: 2
3 hash_table_bucket_number: 8
4 magma_hash_table_nvseg_perseg: 8
5 conf_path:
6 vci:
7 - name: vci1
8 nodes: m[1], m[2]
例如上述配置了一个虚拟集群,vci 大小为2节点。对其扩容一个节点m[4],其nseg_per_vci 扩容后为3,并将该节点添加到对应的vci nodes 中,新的配置应改为:
1 - name: vc_default 2 nsegs_per_vci: 3 3 hash_table_bucket_number: 8 4 magma_hash_table_nvseg_perseg: 8 5 conf_path: 6 vci: 7 - name: vci1 8 nodes: m[1], m[2], m[4]
修改配置文件后,将该拓扑文件分发到所有节点,随后执行重新加载指令即可实现虚拟集群配置更新。
对虚拟集群或虚拟集群实例进行扩容的SQL语法如下:
WITH用来扩容,WITHOUT用来缩容,此DDL同样支持扩展匹配。
同一时刻一个节点(域名或IP)只能归属一个虚拟集群。
若缩容节点有资源被使用,则缩容会提示失败。
8. FAQ#
8.1. 资源队列和ROLE#
使用vcname.rsqname来表示资源队列,即虚拟集群vcname 下的rsqname资源队列。
创建用户不指定资源队列会自动使用vc_default.pg_default。
查看用户绑定的资源队列
1select * from pg_resqueue 2 where rsqname = (select rsqname from pg_resqueue 3 where oid=(select rolresqueue from pg_authid 4 where rolname=(select current_user)));
查看用户绑定的虚拟集群
1select * from pg_vcluster 2 where oid = (select vcid from pg_resqueue 3 where oid=(select rolresqueue from pg_authid 4 where rolname=(select current_user)));
8.2. 资源管理器内部分配状态#
使用如下语句检查资源管理器的内部运行状态:
1select dump_resource_manager_status(1);