弹性计算节点
需求场景
目前 Doris 是一个典型 Share-Nothing 的架构,通过绑定数据和计算资源在同一个节点获得非常好的性能表现。 但随着 Doris 计算引擎性能持续提高,越来越多的用户也开始选择使用 Doris 直接查询数据湖数据。 这类场景是一种 Share-Disk 场景,数据往往存储在远端的 HDFS/S3 上,计算在 Doris 中,Doris 通过网络获取数据,然后在内存完成计算。 而如果这两个负载都混合在同一个集群时,对于目前 Doris 的架构就会出现以下不足:
资源隔离差,两个负载对集群的响应要求不一,混合部署会有相互的影响。
集群扩容时,数据湖查询只需要扩容计算资源,而目前只能存储计算一起扩容,导致磁盘使用率变低。
扩容效率差,扩容后会启动 Tablet 数据的迁移,整体过程比较漫长。而数据湖查询有着明显的高峰低谷,需要小时级弹性能力。
解决方案
实现一种专门用于联邦计算的 BE 节点角色:计算节点
, 计算节点专门处理数据湖这类远程的联邦查询。
原来的 BE 节点类型称为混合节点
, 这类节点既能做 SQL 查询,又有 Tablet 数据存储管理。
而计算节点
只能做 SQL 查询,它不会保存任何数据。
有了计算节点后,集群部署拓扑也会发生变化:混合节点用于 OLAP 类型表的数据计算,这个节点根据存储的需求而扩容,而计算节点用于联邦查询,该节点类型随着计算负载而扩容。
此外,计算节点由于没有存储,因此在部署时,计算节点可以混部在 HDD 磁盘机器或者部署在容器之中。
Compute Node 的使用
配置
在 BE 的配置文件 be.conf 中添加配置项:
be_node_role=computation
该配置项默认为mix
, 即原来的 BE 节点类型,设置为computation
后,该节点为计算节点。
可以通过show backends\G
命令看到其中NodeRole
字段的值,如果是mix
, 则为混合节点,如果是computation
, 则为计算节点
*************************** 1. row ***************************
BackendId: 10010
Cluster: default_cluster
IP: 10.248.181.219
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2022-11-30 23:01:40
LastHeartbeat: 2022-12-05 15:01:18
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 753
DataUsedCapacity: 1.955 GB
AvailCapacity: 202.987 GB
TotalCapacity: 491.153 GB
UsedPct: 58.67 %
MaxDiskUsedPct: 58.67 %
RemoteUsedCapacity: 0.000
Tag: {"location" : "default"}
ErrMsg:
Version: doris-0.0.0-trunk-80baca264
Status: {"lastSuccessReportTabletsTime":"2022-12-05 15:00:38","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false}
HeartbeatFailureCounter: 0
NodeRole: computation
使用
在 fe.conf 中添加配置项
prefer_compute_node_for_external_table=true
min_backend_num_for_external_table=3
参数说明请参阅:FE 配置项
当查询时使用 MultiCatalog 功能时,查询会优先调度到计算节点。
一些限制
- 计算节点由配置项控制,但不要将混合类型节点,修改配置为计算节点。
未尽事项
计算外溢:Doris 内表查询,当集群负载高的时候,上层 (TableScan 之外) 算子调度到计算节点中。
优雅下线:当节点下线的时候,任务新任务自动调度到其他节点; 等待老任务后全部完成后节点再下线; 老任务无法按时结束时,能够让任务能够自己结束。