存算分离建表与 Storage Vault 配置全流程:日志集群从建库到弹性扩缩容的命令链

摘要 :面向日志与可观测场景,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。该命令会等节点上的任务迁移完成后再让节点退出,直接下线会中断正在执行的查询与写入任务。缩容后该节点上的本地缓存随之失效,重新扩容时冷数据需再次回源。

测试结论出处(参考来源)

相关推荐
今年下半年3 小时前
【Spring Boot】集成 Elasticsearch:中文分词与关键字高亮对接文档
spring boot·elasticsearch·中文分词
jonyleek3 小时前
JVS私有化文档系统运维避坑指南:5大断点检测与加固实践(K8S+MinIO+ES)
elasticsearch·minio·clamav·jvs·k8s运维·文档系统·权限同步
骑着蜗牛撵大象3273 小时前
CentOS 7 单机拉起 Elasticsearch 7.17.29:从内核报错到公网可达的全链路记录
elasticsearch·centos·jenkins·restful·内核调优·公网部署
打工仔折腾 AI3 小时前
CentOS 7 单机部署 Elasticsearch 7.17.29:启动报错排查与 CRUD 验证
人工智能·后端·python·elasticsearch·性能优化·centos·jenkins
SelectDB技术团队5 小时前
VARIANT 列接入网关 JSON 日志:建表、导入、子列查询与物化的完整步骤
大数据·数据库·人工智能·elasticsearch·搜索引擎·json·apache doris
蜗牛^^O^5 小时前
ES查询优化
大数据·elasticsearch·搜索引擎
晨陌y8 小时前
从Markdown到多级文档站:MkDocs安装、导航配置与远程预览实战
大数据·elasticsearch·搜索引擎
王琦03189 小时前
git使用手册
大数据·git·elasticsearch
Elasticsearch9 小时前
Kubernetes 节点压力:在首次驱逐容器组前7分钟捕捉到内存下降
elasticsearch