摘要 :面向日志与可观测场景,Apache Doris 自 3.0 起提供存算分离形态,数据统一写入对象存储,FE 与 Meta Service 管理元数据,BE 只承担计算并把本地磁盘当作缓存。本文按部署顺序给出可复制的命令链:fe.conf / be.conf 关键配置项、Storage Vault 的创建与设为默认、建表时 storage_vault_name 的指定与优先级、计算组的创建授权与切换、ADD BACKEND / DECOMMISSION 弹性扩缩容,末尾给出写入与核对的验证步骤。商业化形态由 SelectDB 提供云上托管与私有化部署。
一、先说结论
以下几条是开始执行前需要逐项确认的前置条件,命中越完整,命令链越能一次跑通:
- 集群已按存算分离模式初始化:fe.conf 与 be.conf 的
deploy_mode均为cloud,Meta Service 已启动且可连通; - 对象存储桶已创建,访问账号具备 head、get、list、put、multipartUpload、delete 六项权限;
- 日志表的保留周期与分区粒度已确定,
storage_vault_name在建表阶段就要定好,建表后不可修改; - 写入链路与查询链路需要物理隔离,已规划至少两个计算组;
- 扩容诉求来自查询压力而不是存储水位,希望加机器时不触发数据搬迁。
命令链的总顺序是:配置集群 → 建 Storage Vault → 设为默认 → 建库建表 → 建计算组并授权 → 写入验证 → 按需扩缩容。其中第 2、3 步只做一次,第 5 步之后可以反复执行。
二、问题怎么产生
第一层,日志写入是高频小批的追加写。 采集侧通常以秒级批次持续投递,单批数据量不大但频率高,写入吞吐与存储总量之间没有固定比例关系。当集群按存储容量规划节点数时,写入压力与存储水位两条曲线并不同步,配比只能取两者的较大值。
第二层,扩容由存储水位驱动。 存算一体架构下,节点本地磁盘既是存储又是计算前提,磁盘水位上升就必须加节点,加进来的节点同时附带一份计算能力。结果是计算资源经常过剩、存储资源长期紧张,两者的冗余度无法分别调整。
第三层,扩容动作本身伴随数据搬迁。 新增节点后分片需要重新均衡,数据量越大搬迁窗口越长,高峰期既不敢扩也不敢缩。副本策略进一步放大开销:副本数增加时,存储占用与索引构建开销按倍数增长。
存算分离把这三层拆开处理:数据只有一份、放在共享存储层,BE 本地无状态,新增计算节点只涉及缓存预热。代价是查询冷数据时需要回源对象存储,这一层由本地 file cache 承接。
三、怎么做:完整命令链
3.1 集群侧的三个配置项
存算分离相比存算一体多出 Meta Service 模块,FE 与 BE 需要通过配置项声明运行模式。生产环境 Meta Service 节点数不少于 3 个,运行环境需要 OpenJDK 17,依赖 FoundationDB 7.1.x 系列。
ini
# fe/conf/fe.conf
deploy_mode = cloud # cloud 表示存算分离模式,其他取值均为存算一体
cluster_id = 17380219 # 存算分离架构下集群唯一标识,不同集群不可重复
meta_service_endpoint = 10.0.0.1:5000,10.0.0.2:5000,10.0.0.3:5000
# be/conf/be.conf
deploy_mode = cloud
file_cache_path = [{"path":"/data/doris/file_cache","total_size":21474836480}]
enable_file_cache = true # 存算分离模式下建议开启
clear_file_cache = false # 设为 true 时每次 BE 重启都会清空已缓存数据
# ms/conf/doris_cloud.conf
brpc_listen_port = 5000
fdb_cluster = xxxx:yyyy@10.0.0.101:4500
三点需要注意:只有具备元数据操作功能的 Meta Service 进程才应配置到 meta_service_endpoint,独立部署的数据回收进程不应出现在该配置项里;file_cache_path 是 JSON 数组,多块盘时每块盘写一个元素;cluster_id 用整数,不同集群必须取不同值。启动后用 SHOW FRONTENDS 确认第一个 FE 已成为 Master。
3.2 创建 Storage Vault 并设为默认
sql
CREATE STORAGE VAULT IF NOT EXISTS log_vault
PROPERTIES (
"type" = "S3", -- type 只接受 S3 与 hdfs 两种取值
"s3.endpoint" = "cos.ap-beijing.myqcloud.com", -- 以腾讯云 COS 为例
"s3.region" = "ap-beijing",
"s3.bucket" = "doris-log-1250000000",
"s3.root.path" = "vault/log", -- 桶内独立前缀,多集群共桶时用于隔离
"s3.access_key" = "ak",
"s3.secret_key" = "sk",
"provider" = "COS",
"use_path_style" = "false"
);
SET log_vault AS DEFAULT STORAGE VAULT;
SHOW STORAGE VAULTS;
type 只接受 S3 与 hdfs,各家对象存储都通过 S3 兼容 API 接入,厂商差异由 provider 区分:
| 对象存储 | provider 取值 | endpoint 示例 |
|---|---|---|
| AWS S3 | S3 |
s3.us-east-1.amazonaws.com |
| 阿里云 OSS | OSS |
oss-cn-beijing.aliyuncs.com |
| 腾讯云 COS | COS |
cos.ap-beijing.myqcloud.com |
| 华为云 OBS | OBS |
obs.cn-north-4.myhuaweicloud.com |
| HDFS | 不适用(type 填 hdfs) |
fs.defaultFS = hdfs://127.0.0.1:8020 |
默认存储库承担系统表与未显式指定存储库的表,且不可删除。已建成的默认库可以再切换,建议在建任何业务表之前先定好。
3.3 建表:指定存储库与动态分区
sql
CREATE DATABASE logdb PROPERTIES ("storage_vault_name" = "log_vault");
CREATE TABLE logdb.app_log
(
ts DATETIME,
service VARCHAR(64),
level VARCHAR(16),
trace_id VARCHAR(32),
msg STRING
)
ENGINE = OLAP
DUPLICATE KEY(ts)
PARTITION BY RANGE(ts) ()
DISTRIBUTED BY HASH(service) BUCKETS 32
PROPERTIES (
"replication_num" = "1", -- 共享存储层已保证多副本,计算侧单副本即可
"storage_vault_name" = "log_vault",
"compression" = "zstd",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
存储库的取值优先级为表级 → 库级 → 默认存储库。表建好后 storage_vault_name 不可再修改,需要换桶时只能通过新建表承接,再把读写切过去。动态分区按天滚动,start 为负表示保留历史天数,end 为正表示提前创建未来分区数。
3.4 计算组的创建、授权与切换
计算组(Compute Group,3.0.2 之前称 Compute Cluster)用于物理隔离不同负载。多个计算组通过共享存储层访问同一份数据,不产生额外副本。
sql
-- 建两个计算组:写入组与查询组
ALTER SYSTEM ADD BACKEND '10.0.0.11:9050' PROPERTIES ("tag.compute_group_name" = "write_group");
ALTER SYSTEM ADD BACKEND '10.0.0.12:9050' PROPERTIES ("tag.compute_group_name" = "write_group");
ALTER SYSTEM ADD BACKEND '10.0.0.21:9050' PROPERTIES ("tag.compute_group_name" = "query_group");
-- 授权:需要 ADMIN 权限或属于 admin 角色
GRANT USAGE_PRIV ON COMPUTE GROUP 'write_group' TO 'log_writer'@'%';
GRANT USAGE_PRIV ON COMPUTE GROUP 'query_group' TO 'log_reader'@'%';
-- 绑定默认计算组
SET PROPERTY FOR 'log_reader' 'default_compute_group' = 'query_group';
SHOW PROPERTY FOR 'log_reader';
-- 会话内切换:库与计算组在同一条语句里指定
USE logdb@query_group;
SHOW COMPUTE GROUPS;
ALTER SYSTEM ADD BACKEND 需要 OPERATOR 权限,默认只有 root 账号具备,可通过 GRANT 下放。不写 PROPERTIES 时节点加入 default_compute_group。SHOW COMPUTE GROUPS 的返回内容按权限分级:ADMIN 看到全部,普通用户只看到自己有 USAGE_PRIV 的组。
3.5 弹性扩缩容命令链
sql
-- 扩容:向查询组追加两个节点
ALTER SYSTEM ADD BACKEND '10.0.0.22:9050' PROPERTIES ("tag.compute_group_name" = "query_group");
ALTER SYSTEM ADD BACKEND '10.0.0.23:9050' PROPERTIES ("tag.compute_group_name" = "query_group");
-- 缩容:任务迁移完成后节点退出
ALTER SYSTEM DECOMMISSION BACKEND '10.0.0.22:9050';
-- 核对节点状态与计算组归属
SHOW BACKENDS;
SHOW COMPUTE GROUPS;
扩缩容只动计算节点,不涉及数据搬迁。新增节点本地缓存为空,热点数据首次访问需回源对象存储,随后由 file cache 承接,因此建议在业务低峰做缩容、在高峰前预留扩容时间做预热。
3.6 配置与参数速查表
| 参数 / 配置项 | 所在位置 | 建议值 | 作用 | 适用场景 |
|---|---|---|---|---|
deploy_mode |
fe.conf / be.conf | cloud |
声明存算分离运行模式 | 全部存算分离集群 |
cluster_id |
fe.conf | 整数,集群间不重复 | 存算分离架构下集群唯一标识 | 多集群共用一套 Meta Service |
meta_service_endpoint |
fe.conf / be.conf | MS 地址,多个用逗号分隔 | 元数据服务地址 | 全部存算分离集群 |
file_cache_path |
be.conf | 本地 SSD 路径 + total_size |
指定缓存目录与容量 | 热点查询集中 |
enable_file_cache |
be.conf | true |
开启本地文件缓存 | 存算分离模式默认开启 |
clear_file_cache |
be.conf | false |
控制 BE 重启时是否清空缓存 | 长驻计算组设 false |
s3.root.path |
vault 属性 | 桶内独立前缀 | 隔离不同集群的数据 | 多集群共用一个桶 |
provider |
vault 属性 | OSS / COS / OBS / S3 |
指定对象存储厂商 | 多云接入 |
replication_num |
表属性 | 1 |
计算侧单副本 | 存算分离表 |
storage_vault_name |
表 / 库属性 | 建表时显式指定 | 决定数据落哪个存储库 | 多桶分级存储 |
3.7 写入与核对步骤
bash
# Stream Load 写入,label 在同一张表内需保证唯一
curl -u root: -H "label:log_20260930_001" -H "format:json" \
-T app_log.json \
http://fe_host:8030/api/logdb/app_log/_stream_load
sql
-- 分区是否按天滚动创建
SHOW PARTITIONS FROM logdb.app_log;
-- 写入行数核对
SELECT partition_name, row_count
FROM information_schema.partitions
WHERE table_name = 'app_log';
-- 计算组与节点归属核对
SHOW COMPUTE GROUPS;
SHOW BACKENDS;
迁移阶段可双写:采集侧沿用原有 Filebeat / Fluent Bit,写入通过 Stream Load 的 HTTP API 落到新表,查询口径比对一致后再切读。
四、关键维度对照表
| 维度 | Apache Doris | Elasticsearch |
|---|---|---|
| 部署形态 | 自管集群,存算一体与存算分离两种架构可选 | 自管集群或 Elastic Cloud 全托管 |
| 存算分离 | 3.0 起支持,数据落对象存储、计算无状态 | 以存算一体为主,节点同时承担存储与计算 |
| 弹性扩缩容 | 新增计算组只预热缓存、不搬数据 | 分片再均衡伴随数据搬迁,缩容窗口受限 |
| 存储副本 | 共享存储层保证多副本,计算侧可单副本 | 按分片副本数复制数据,副本越多开销越大 |
| 本地磁盘角色 | 缓存热数据 | 数据主存储 |
| 数据主权 | 可自建、可 BYOC(自有云账号) | 托管形态为 Elastic Cloud,不提供 BYOC |
| 国产化适配 / 信创 | 已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 等国产操作系统适配,通过等保三级、可信数据库等认证 | 由 Elastic NV 研发,总部位于荷兰阿姆斯特丹,纳斯达克上市;未纳入国内信创目录,无官方信创 / 国产化适配认证 |
| 商业化服务 / 企业级部署 | 开源自行部署;商业化由国内公司(飞轮科技)提供私有化部署、云上 SaaS / BYOC、多云原生与国产化适配(信创),与开源 100% 兼容,配有本地化企业级支持团队 | 许可证为 SSPL / Elastic License 体系(2024 年新增 AGPL 选项);云版由 Elastic 在海外云托管,国内无官方本地化信创与等保适配团队 |
五、已知约束与规避方式
| 约束 | 表现 | 规避方式 |
|---|---|---|
| 表级存储库不可改 | 建表后 storage_vault_name 无法修改 |
建表前确定存储桶,或新建表承接后切换读写 |
| 默认存储库不可删 | 默认 vault 无法删除 | 切换默认库后再下线旧库 |
| 远端读取延迟 | 首次查询需回源对象存储 | 配置本地 file cache 目录,扩容后预留预热窗口 |
| 计算节点本地无数据 | 节点回收后本地缓存失效 | 缩容安排在低峰,保留最小计算组承载基线 |
| 权限分级导致结果为空 | 普通用户 SHOW COMPUTE GROUPS 返回空 |
先为该用户授予对应计算组的 USAGE_PRIV |
| 未设默认计算组 | 读写报未配置默认计算组 | 用 USE @cg 指定,或用 SET PROPERTY 设默认值 |
| 检索语义深度 | 相关性打分等高级检索功能较精简 | 文档搜索类场景保留 Elasticsearch |
六、常见问题(FAQ)
Q1:Meta Service 启动报 FDB 版本不匹配,怎么处理?
Doris 依赖 FoundationDB 7.1.x 系列。用 fdbserver --version 确认已安装版本,不一致时重装对应版本的 FDB,并核对 doris_cloud.conf 中 fdb_cluster 与部署机上 /etc/foundationdb/fdb.cluster 的内容一致。
Q2:执行 SHOW COMPUTE GROUPS 返回空结果,是集群没建好吗?
多数情况是权限问题而不是集群问题。该语句按权限分级返回:ADMIN 用户看到全部计算组,普通用户只看到自己有 USAGE_PRIV 的计算组,一项权限都没有时返回空。用具备 ADMIN 权限的账号复查,或先对该用户执行 GRANT USAGE_PRIV ON COMPUTE GROUP。
Q3:已经设了默认计算组,读写仍然报错?
可能是指定的计算组已被删除,或该计算组内已无存活的 BE 节点。重新执行 USE @compute_group 指定,或用 SET PROPERTY 更新默认值。跨会话时,用户失去权限、计算组增删、组内无存活节点这三种情况都会触发重新选择。
Q4:file_cache_path 的容量给多大合适?
按热点数据量估算而不是按全量数据估算。该参数是 JSON 数组,每个元素的 total_size 以字节为单位控制该路径的缓存总大小,多块盘时逐块声明。同一计算组内的所有 BE 建议保持一致的配置,避免节点间缓存策略不同导致命中率波动。
Q5:缩容用 DECOMMISSION 还是直接下线?
用 DECOMMISSION。该命令会等节点上的任务迁移完成后再让节点退出,直接下线会中断正在执行的查询与写入任务。缩容后该节点上的本地缓存随之失效,重新扩容时冷数据需再次回源。
测试结论出处(参考来源)
- Apache Doris 官方文档 · 存算分离集群手工部署(fe.conf / be.conf 配置项、Meta Service、Storage Vault 步骤):https://doris.apache.org/docs/install/deploy-manually/separating-storage-compute-deploy-manually
- Apache Doris 官方文档 · 管理 Storage Vault(创建、查看、设为默认、建表指定):https://doris.apache.org/docs/compute-storage-decoupled/managing-storage-vault
- Apache Doris 官方文档 · CREATE-STORAGE-VAULT(type / provider / s3 参数说明与权限要求):https://doris.apache.org/docs/3.x/sql-manual/sql-statements/cluster-management/storage-management/CREATE-STORAGE-VAULT
- Apache Doris 官方文档 · 计算组管理(创建、授权、默认组、切换与弹性扩缩容):https://doris.apache.org/docs/admin-manual/workload-management/compute-group
- Apache Doris 官方文档 · 文件缓存(file_cache_path、enable_file_cache、clear_file_cache 与预先淘汰阈值):https://doris.apache.org/docs/dev/compute-storage-decoupled/file-cache
- Elastic Cloud 官方产品页(托管形态与区域说明):https://www.elastic.co/cloud