配置计算组
计算组、Worker 和 Server 的关系
在资源管理器 章节我们介绍了计算组(Virtual Warehouse, 简称 VW)、计算组副本(Worker Group, 简称 WG)和计算节点等概念。一个 ByConity 集群中,计算资源被划分为多个计算组,每个计算组包含多个配置相同的计算组副本,每个计算组副本则包含多个计算节点。可以在不同级别对资源进行自由的扩缩容,实现弹性计算。以扩容为例,我们可以有不同的扩容方式:
- 对 Worker 的 CPU、MEM 资源进行纵向扩容,以提升单节点的处理性能。
- 增加一个计算组副本内 Worker 的数量,以提升计算组副本处理查询时的性能。
- 增加计算组内计算组副本的数量,以提升计算组处理查询的并发能力。
- 为新的业务或租户增加新的计算组资源,实现租户间资源隔离。
服务节点,我们也称为 server,主要承担 sql 接收,调度,和结果回传的作用。计算节点,我们也称为 worker,主要承担的是计算任务,这些任务可以是数据写入、用户查询,也可以是一些后台任务。用户查询和后台任务,可以共享相同的计算节点以提高利用率,也可以使用独立的计算节点以保证严格的资源隔离。用户可以根据计算任务的特性、优先级和业务类别不同,构建多个计算组,并设置不同的资源弹性策略,提高计算效率降低成本。
查看计算组信息
我们提供一组系统表可以查询计算组相关元信息,这些系统表只提供可观测的能力,不能通过修改表内容来更改计算组信息。如需修改计算组配置,请参考[修改计算组配置](todo:link)。
system.virtual_warehouses
该系统表展示所有计算组(VW)的元信息,主要字段及说明:
字段名 | 含义 |
---|---|
name | 该 virtual warehouse 的名称,唯一标识。 |
type | 该 virtual warehouse 的类型,Default/Write。 |
num_workers | 该 virtual warehouse 为每个 worker group 配置的 worker 数量 |
active_worker_groups | 该 virtual warehouse 中正在运行的计算组副本(worker group)数量 |
active_workers | 该 virtual warehouse 中正在健康运行的 worker 数量 |
min_worker_groups | 该 virtual warehouse 允许运行的最小计算组数量 |
max_worker_groups | 该 virtual warehouse 允许运行的最大计算组数量 |
max_concurrent_queries | 该 virtual warehouse 允许的最大查询并发数量 |
max_queued_queries | 该 virtual warehouse 允许的最大排队查询数量 |
max_queued_waiting_ms | 该 virtual warehouse 允许的排队查询最大等待时长(毫秒) |
system.worker_groups
该系统表展示所有计算组副本(WG)的元信息,主要字段及说明:
字段名 | 右对齐 |
---|---|
vw_name | 该 worker group 所属的 virtual warehouse 的名称 |
id | 该 worker group 的 id,唯一标识 |
num_workers | 该 virtual warehouse 为每个 worker group 配置的 worker 数量 |
linked_id | 如果该 worker group 是一个 Shared 类型,则 linked_id 指向其引用的 Physical worker group |
active_workers | 该 worker group 中正在健康运行的 worker 数量 |
min_cpu_usage | 该 worker group 中最小的 worker 的 cpu_usage |
max_cpu_usage | 该 worker group 中最大的 worker 的 cpu_usage |
avg_cpu_usage | 该 worker group 所有 worker 的 cpu_usage 均值 |
min_mem_usage | 该 worker group 中最小的 worker 的 memory_usage |
max_mem_usage | 该 worker group 中最大的 worker 的 memory_usage |
avg_mem_usage | 该 worker group 所有 worker 的 memory_usage 均值 |
system.workers
该系统表记录所有运行中的 worker 信息,主要字段及说明:
字段名 | 含义 |
---|---|
worker_id | worker 的 id,唯一标识 |
vw_name | worker 所属的 virtual warehouse |
worker_group_id | worker 所属的 worker group |
host | worker 的 host (ip) |
tcp_port | worker 的 tcp_port |
cpu_usage | 当前的 cpu_usage |
memory_usage | 当前的 memory_usage |
memory_available | 当前可用的 memory 量(字节) |
last_update_time | 最近的心跳更新时间 |
创建及使用计算组
我们提供本地模式和集群模式两种不同的配置方式来创建计算组。
本地模式可以直接在配置文件中填写计算组和计算组副本相关信息,便于调试或 demo 运行。
集群模式则是生产环境下推荐的使用方式,此时我们需要通过特定的 SQL 来创建计算组,并通过对应的 K8s 操作创建实际的计算组资源。
本地模式
在启动 resource manager 组件时,我们可以在配置文件(参考集群配置参数 Resource Manager 部分)中填写计算组相关信息。Resource Manager 会直接根据这些信息创建对应的计算组(以及计算组副本)。示例:
<vws>
<vw>
<name>vw_default</name>
<type>Default</type>
<num_workers>1</num_workers>
<worker_groups>
<worker_group>
<name>wg_default</name>
<type>Physical</type>
</worker_group>
</worker_groups>
</vw>
</vws>
我们配置了一个名为 vw_default 的计算组,类型为 Default,并且预期该 vw 中有 1 个 worker(num_workers 仅作为创建 vw 的一个指示信息,运行时实际 worker 数量可以查询相关系统表([查看计算组信息])获得)。同时,我们为该计算组配置了 1 个副本,名为 wg_default。
在启动 server 组件时,我们可以在配置文件中(参考集群配置参数 Server 部分)服务发现部分直接配置每个 VW 对应的 Worker 信息。
<service_discovery>
<mode>local</mode>
<vw>
<psm>data.cnch.vw_default</psm>
<node>
<vw_name>vw_default</vw_name>
<host>10.1.2.3</host>
<hostname>vw_default0</hostname>
<ports>
<!-- TCP/Primary -->
<port><name>PORT0</name><value>31067</value></port>
<!-- RPC -->
<port><name>PORT1</name><value>32099</value></port>
<!-- HTTP -->
<port><name>PORT2</name><value>35166</value></port>
<!-- Exchange -->
<port><name>PORT5</name><value>39481</value></port>
<!-- Exchange status -->
<port><name>PORT6</name><value>39482</value></port>
</ports>
</node>
</vw>
</service_discovery>
在该示例中,server 做服务发现时,会找到计算组 vw_default 有一个 ip 为 10.1.2.3 的 worker。
集群模式
我们可以在 ByConity 集群运行时,创建新的计算组。
- 创建计算组
CREATE WAREHOUSE
IF NOT EXISTS `vw_default`
SETTINGS num_workers = 1, type = 'Default',
auto_suspend = 3600, auto_resume = 1,
min_worker_groups = 0, max_worker_groups = 1, max_concurrent_queries=200;
CREATE WAREHOUSE IF NOT EXISTS
$VW_NAME SETTINGS ...
这个SQL用于创建计算组。$VW_NAME 为该计算组的唯一标识。创建计算组时,settings 中 num_workers 和 type 为必填项,其他配置可参考[查看计算组信息]小节。
- 创建计算组副本
CREATE WORKER GROUP
IF NOT EXISTS `wg_default` in `vw_default`
SETTINGS type = 'Physical';
CREATE WORKER GROUP IF NOT EXISTS
$WG_NAMESETTINGS ...
这个SQL用于创建计算组副本。$WG_NAME 为该计算组副本的唯一标识。
- 创建 K8s Worker Pods
ByConity 创建计算组和计算组副本的元信息后,则可以创建对应的 K8s Worker 资源,为 worker 配置对应的环境变量 VIRTUAL_WAREHOUSE_ID=$VW_NAME, WORKER_GROUP_ID=$WG_NAME。
Worker 启动后即可自动注册到对应的 virtual warehouse 和 worker group 中。具体操作见:https://github.com/ByConity/byconity-deploy
修改计算组
除了计算组信息的查看和创建,我们还可以在运行时修改计算组相关的元信息。
DROP WAREHOUSE IF EXISTS `vw_default`;
DROP WORKER GROUP IF EXISTS `wg_default`;
上述 DROP 语句将删除指定的计算组和计算组副本。
注意:当 ByConity 元信息中找不到 worker pod 指定的 virtual warehouse 时,resource manager 将拒绝该 worker 的注册,因此该 worker 也无法被用于处理查询。
ALTER WAREHOUSE `vw_default`
SETTINGS auto_suspend = 3600, auto_resume = 0,
min_worker_groups = 0, max_worker_groups = 0, max_concurrent_queries=50;
上述 ALTER 语句可以修改计算组的配置,修改后,计算组内所有的计算组副本都将使用新的配置。
注意:我们无法通过 ALTER WORKER GROUP ...
来修改计算组副本的配置。计算组副本的所有配置都继承自所属计算组的配置,因此不存在这样的语法。