最近有朋友找我问资源配置类似的问题,记在此处
目录
- 核心概念与架构基础
- FE 节点规划公式
- BE 节点规划公式
- 存储容量规划公式
- 内存规划公式
- 网络带宽规划公式
- Bucket 数量规划公式
- 集群规模分级模板
- 存算分离模式部署公式
- 资源隔离与 Workload Group 规划
- 配套组件规划公式
- 容量预警与扩容触发公式
- 成本估算公式
- 速查表
核心概念与架构基础
Doris 双进程架构
Doris 采用极简的双进程架构,部署规划只需关注两类核心节点:
| 组件 | 角色 | 核心职责 |
|---|
| FE (Frontend) | Master / Follower / Observer | 元数据管理、SQL 解析与规划、查询优化(CBO/RBO)、集群调度 |
| BE (Backend) | 计算+存储节点 | 数据存储(列式存储)、查询执行(向量化+Pipeline引擎)、数据导入、Compaction |
FE 三种角色
| 角色 | 参与选举 | 元数据写入 | 查询路由 | 适用场景 |
|---|
| Master | 是 | 是(唯一写入点) | 是 | 必须,有且仅有 1 个 |
| Follower | 是 | 否(通过 BDB JE 同步) | 是 | 高可用保障,奇数部署 |
| Observer | 否 | 否 | 是 | 扩展查询并发,可无限水平扩展 |
关键约束
- FE 参与选举的节点(Master + Follower)必须为奇数个(BDB JE Paxos 协议要求)
- 副本数 ≤ BE 节点数
- 生产环境最低副本数 = 3(保证单节点故障不丢数据)
FE 节点规划公式
核心公式
FE总节点数 = 选举组节点数(Master+Follower) + Observer节点数
选举组节点数 = 2 × ⌊BE节点数 / 阈值⌋ + 1 (结果取 3 或 5,不超过 5)
- 简化规则:生产环境固定 3 个(1 Master + 2 Follower)
Observer节点数 = ⌈(目标QPS - 选举组可承载QPS) / 单Observer可承载QPS⌉
- 单 FE 可承载 QPS ≈ 200~500(取决于查询复杂度)
- Observer 数量 ≥ 0
分级规划表
| 集群规模 | BE 节点数 | 选举组配置 | Observer 数 | FE 总数 | FE 单节点配置 |
|---|
| 小规模 | ≤ 10 | 1M + 2F | 0 | 3 | 8C / 16GB / 100GB SSD |
| 中规模 | 10~50 | 1M + 2F | 1~2 | 4~5 | 16C / 32GB / 200GB SSD |
| 大规模 | 50~200 | 1M + 2F | 3~5 | 6~8 | 32C / 64GB / 500GB SSD |
| 超大规模 | 200+ | 1M + 4F | 5~10 | 10~15 | 32C / 64GB / 500GB SSD |
FE JVM 配置公式
JVM 堆内存 = 物理内存 × 50%~70%
推荐值:
- 16GB 物理内存 → -Xmx8g -Xms8g
- 32GB 物理内存 → -Xmx24g -Xms24g
- 64GB 物理内存 → -Xmx32g -Xms32g (超过 32GB 收益递减)
FE 磁盘规划公式
FE 磁盘容量 = 元数据大小 × 3 + 日志空间
元数据大小(估算) ≈ 表数量 × 分区数 × Bucket数 × 副本数 × 0.5KB
日志空间 ≈ 50~200GB(取决于 DDL/DML 频率)
BE 节点规划公式
核心公式(存算一体模式)
BE 节点数 = MAX(按存储计算, 按计算计算, 按并发计算)
# 方法1:按存储需求
BE_存储 = ⌈总存储需求 / (单BE磁盘容量 × 磁盘利用率上限)⌉
总存储需求 = 日数据增量 × 保留天数 × 副本数 / 压缩比
# 方法2:按计算需求
BE_计算 = ⌈(日均查询QPS × 单查询平均CPU耗时_秒) / (单BE_CPU核数 × CPU利用率上限)⌉
# 方法3:按并发需求
BE_并发 = ⌈峰值并发查询数 / 单BE可支持并发数⌉
单BE可支持并发数 ≈ CPU核数 × 2~4(Pipeline引擎下)
完整推导示例
场景:日增 550GB,保留 30 天,3 副本,LZ4 压缩比 3:1
按存储:
原始总量 = 550GB × 30 = 16.5TB
压缩后 = 16.5TB / 3 = 5.5TB
副本总量 = 5.5TB × 3 = 16.5TB
单 BE 4TB SSD,利用率 80%:
BE_存储 = ⌈16.5TB / (4TB × 0.8)⌉ = ⌈16.5 / 3.2⌉ = 6 台
按计算(假设日均 100 QPS,P95 延迟 < 1s):
BE_计算 = ⌈(100 × 0.5) / (32 × 0.7)⌉ = ⌈50 / 22.4⌉ = 3 台
按并发(峰值 200 并发):
BE_并发 = ⌈200 / (32 × 3)⌉ = ⌈200 / 96⌉ = 3 台
最终:BE = MAX(6, 3, 3) = 6 台
分级配置表
| 集群规模 | 数据总量 | CPU | 内存 | 磁盘 | 网络 | BE 数量 |
|---|
| 小规模 | < 10TB | 16C | 64GB | 2TB HDD×12 | 10Gbps | 3~5 |
| 中规模 | 10~100TB | 32C | 128GB | 4TB SSD×12 | 10Gbps | 6~30 |
| 大规模 | 100TB~1PB | 64C | 256GB | 8TB SSD×12 | 25Gbps | 30~100 |
| 超大规模 | > 1PB | 64C | 256GB+ | 8TB NVMe×24 | 100Gbps | 100+ |
存储容量规划公式
总存储公式
总存储需求 = 热数据存储 + 温数据存储 + 冷数据存储 + 系统预留
热数据存储 = 日增量 × 热保留天数 × 副本数 / 压缩比
温数据存储 = 日增量 × 温保留天数 × 副本数 / 压缩比(可选 HDD)
冷数据存储 = 日增量 × 冷保留天数 × 副本数 / 压缩比(可选对象存储)
系统预留 = (热 + 温) × 20%
压缩比参考:LZ4 ≈ 3:1, ZSTD ≈ 5:1, Snappy ≈ 2.5:1
磁盘选型决策
选型规则:
├─ 实时查询场景(P95 < 1s) → 全 SSD / NVMe
├─ 混合负载(实时 + 批量) → SSD(热) + HDD(温/冷)
├─ 成本敏感 + 大批量分析 → HDD(可接受 P95 3~5s)
└─ 云原生 / 存算分离 → 本地 SSD 缓存 + 对象存储(S3/OSS)
磁盘 IOPS 校验:
单查询 IOPS ≈ 扫描数据量(MB) / 读取块大小(默认 8MB) × 1.2
总 IOPS 需求 = 并发查询数 × 单查询 IOPS
校验:总 IOPS 需求 < 单 BE 磁盘总 IOPS × 80%
内存规划公式
BE 内存规划
BE 可用内存 = 物理内存 × mem_limit(默认 80%~90%)
内存分配拆解:
├─ 查询执行内存(60%~70%)
│ └─ 单查询内存 ≈ 扫描数据量 / 压缩比 / 并行度 × 放大系数(1.5~3)
├─ 存储缓存内存(15%~25%)
│ └─ Page Cache = BE可用内存 × storage_page_cache_limit(默认 20%)
├─ Compaction 内存(5%~10%)
│ └─ = max_compaction_threads × 单任务内存(128~512MB)
└─ 系统与 JVM(5%~10%)
└─ BE 内嵌 JVM 默认 2GB (JAVA_OPTS -Xmx2048m)
单 BE 内存估算公式(简化版):
BE 内存(GB) = MAX(
64,
峰值并发数 × 单查询内存(GB) / 0.7
)
FE 内存规划
FE 内存 = JVM 堆 + 堆外 + OS
JVM 堆 ≈ (表数量 × 分区数 × Bucket数 × 副本数) × 0.5KB × 3 (含索引、缓存等开销)
实际经验:
- 1万张表以下 → 16GB 物理内存
- 1~10万张表 → 32GB 物理内存
- 10万+ 表 → 64GB 物理内存
网络带宽规划公式
核心公式
集群内部带宽需求 = MAX(导入带宽, 查询带宽, 副本同步带宽)
导入带宽(Gbps) = 峰值导入速率(GB/h) / 3600 × 8 × 副本数 × 1.2(协议开销)
查询带宽(Gbps) = 峰值QPS × 单查询Shuffle数据量(MB) × 8 / 1000
副本同步带宽(Gbps) = 日增量(GB) / 86400 × 8 × (副本数 - 1) × 1.2
建议冗余 = 实际需求 × 2(50%冗余)
推导示例
场景:峰值 15GB/h 导入,3 副本,100 QPS
导入带宽 = 15 / 3600 × 8 × 3 × 1.2 = 0.12 Gbps
查询带宽 = 100 × 50MB × 8 / 1000 = 40 Gbps(BE 间 Shuffle)
副本同步 = 550 / 86400 × 8 × 2 × 1.2 = 0.12 Gbps
→ 瓶颈在查询 Shuffle,集群内部建议 ≥ 10Gbps(聚合层)
→ 核心交换 ≥ 40Gbps
网络架构分层建议
┌─────────────────────────────────────────┐
│ 核心交换机层 │
│ 带宽 = 聚合层带宽总和 × 1.5 │
├──────────┬──────────┬───────────────────┤
│ 聚合层 │ 聚合层 │ 聚合层 │
│(Doris) │ (消息队列)│ (计算引擎) │
│ 10~40Gbps │ 10Gbps │ 10Gbps │
├──────────┴──────────┴───────────────────┤
│ 接入层(每节点) │
│ ≥ 10Gbps(中大规模建议 25Gbps) │
└─────────────────────────────────────────┘
Bucket 数量规划公式
核心公式
Bucket 数(单分区) = ⌈分区数据量 / (单Bucket目标大小)⌉
# 且需满足并行度约束:
Bucket 数 ≥ BE 节点数 × 并行度系数(1~2)
推荐单 Bucket 大小:
- 小表(< 1GB/分区) → 1~16 个 Bucket
- 中表(1~10GB/分区) → 16~64 个 Bucket,单 Bucket ≈ 100MB~500MB
- 大表(> 10GB/分区) → 64~256 个 Bucket,单 Bucket ≈ 200MB~1GB
经验公式(适用大多数场景):
Bucket 数 = MAX(BE 节点数, ⌈分区数据量(GB) × 2⌉)
例:6 BE,单分区 20GB
Bucket = MAX(6, 20×2) = 40 → 取最近的 2 的幂 = 32 或 64
动态分区 Bucket 自动推荐
Doris 3.0 支持 BUCKETS AUTO,建议中小规模直接使用自动 Bucket 功能:
DISTRIBUTED BY HASH(column) BUCKETS AUTO
PROPERTIES ("estimate_partition_size" = "10G");
集群规模分级模板
小规模集群(开发/测试/初创业务)
适用场景:数据量 < 10TB,QPS < 100,日增 < 50GB
Doris 集群:
├─ FE: 3 节点(1M + 2F)
│ └─ 配置:8C / 16GB / 100GB SSD
├─ BE: 3 节点
│ └─ 配置:16C / 64GB / 2TB SSD
├─ 总节点:6
└─ 预算参考:¥15~30万
关键配置:
- 副本数:3
- mem_limit:80%
- Compaction 线程:base=2, cumulative=4
中规模集群(业务增长期/部门级数仓)
适用场景:数据量 10~100TB,QPS 100~500,日增 50~500GB
Doris 集群:
├─ FE: 3~5 节点(1M + 2F + 0~2 Observer)
│ └─ 配置:16C / 32~64GB / 200GB SSD
├─ BE: 6~30 节点
│ └─ 配置:32C / 128GB / 4TB SSD × 4~12
├─ 总节点:9~35
└─ 预算参考:¥50~200万
关键配置:
- 副本数:3
- mem_limit:90%
- Compaction 线程:base=4, cumulative=10
- 建议开启 Resource Group 隔离
大规模集群(企业级数仓/平台级服务)
适用场景:数据量 100TB~1PB,QPS 500~2000,日增 500GB~5TB
Doris 集群:
├─ FE: 6~8 节点(1M + 2F + 3~5 Observer)
│ └─ 配置:32C / 64GB / 500GB SSD
├─ BE: 30~100 节点
│ └─ 配置:64C / 256GB / 8TB SSD × 12
├─ 总节点:36~108
└─ 预算参考:¥300~1000万
关键配置:
- 副本数:3
- mem_limit:90%
- Compaction 线程:base=8, cumulative=20
- 启用 Workload Group 多租户隔离
- 考虑存算分离或混合模式
存算分离模式部署公式
Doris 3.0 引入了 Compute Group(计算组) 概念,支持存算分离架构。
架构变化
存算一体(传统模式):
FE ←→ BE(存储+计算混合)
存算分离(Cloud 模式):
FE ←→ Meta Service ←→ Compute Group(无状态计算节点)
↕
共享存储(S3/HDFS/OSS)
* Meta Service 依赖 FoundationDB (FDB) 管理元数据
存算分离节点规划
Meta Service 节点数 = 3(固定,HA 部署)
配置:8C / 32GB / 500GB SSD
FDB 节点数 = 3~5(根据元数据规模)
配置:8C / 32GB / 500GB NVMe
Compute Group 数量 = 业务隔离域数量
单 Group 节点数 = ⌈目标QPS × 单查询CPU耗时 / (单节点CPU核数 × 利用率)⌉
本地 SSD 缓存 = 热数据集大小 × 缓存命中率目标 / 缓存命中率
建议:热数据的 30%~50% 用 SSD 缓存
存算分离 vs 存算一体决策矩阵
| 维度 | 存算一体 | 存算分离 |
|---|
| 查询延迟 | 更优(数据本地化) | 略高(需网络传输,缓存可缓解) |
| 弹性扩缩 | 扩容需迁移数据 | 计算节点秒级扩缩 |
| 成本效率 | 闲时资源浪费 | 按需付费,削峰填谷 |
| 运维复杂度 | 简单(2 种进程) | 较复杂(增加 Meta Service + FDB) |
| 适用场景 | 延迟敏感、稳定负载 | 弹性需求、多租户、云原生 |
资源隔离与 Workload Group 规划
Doris 3.0 提供 Workload Group 实现多租户资源隔离。
Workload Group 规划公式
# 每个业务域一个 Workload Group
Workload Group 数量 = 业务域数量 + 1(default/normal组)
# 资源分配公式
单 Group CPU 配额 = (该 Group QPS 占比 × 总 CPU) × 权重系数
单 Group 内存配额 = (该 Group 数据量占比 × 总内存) × 权重系数
# 关键参数
min_cpu_percent:最低保障 CPU 百分比(所有 Group 之和 ≤ 100%)
max_cpu_percent:CPU 上限百分比
max_memory_percent:内存上限百分比
max_concurrency:最大并发查询数
配置示例
CREATE WORKLOAD GROUP 'realtime_report'
PROPERTIES (
'min_cpu_percent' = '40',
'max_cpu_percent' = '80',
'max_memory_percent' = '50',
'max_concurrency' = '100'
);
CREATE WORKLOAD GROUP 'batch_analysis'
PROPERTIES (
'min_cpu_percent' = '10',
'max_cpu_percent' = '50',
'max_memory_percent' = '30',
'max_concurrency' = '20'
);
配套组件规划公式
Kafka 集群(数据管道)
Kafka Broker 数 = MAX(3, ⌈总吞吐(MB/s) / 单Broker吞吐(MB/s)⌉)
单 Broker 吞吐(保守) ≈ 100~200 MB/s
磁盘 = 日消息量 × 保留天数 × 副本数 / Broker数
分区数(单Topic) = MAX(Broker数 × 4, 目标消费并行度)
Flink 集群(实时计算)
TaskManager 数 = ⌈总并行度 / 单TM_Slot数⌉
总并行度 = MAX(Kafka分区数, 业务需要的并行度)
单 TM 内存 = Slot数 × 单Slot内存(4~8GB) + 框架内存(1GB)
JobManager:2 节点 HA(8C/32GB)
监控组件
Prometheus: 1 节点(8C/32GB/500GB SSD)
- 采集间隔:15~30s
- 数据保留:30 天
- 磁盘 = 监控指标数 × 采集频率 × 保留天数 × 2 Bytes
Grafana: 与 Prometheus 同机或独立(4C/8GB)
容量预警与扩容触发公式
扩容触发条件
触发扩容的阈值公式:
# 存储扩容
磁盘使用率 > 70
磁盘使用率 > 80
# 计算扩容
CPU 利用率 > 70
CPU 利用率 > 85
# 内存扩容
内存使用率 > 80
内存使用率 > 90
# 查询性能扩容
P95 延迟 > SLA × 0.8(持续 1 天)→ 预警
P95 延迟 > SLA → 立即扩容
扩容量计算
新增 BE 节点数 = ⌈当前节点数 × (当前利用率 / 目标利用率 - 1)⌉
例:当前 6 BE,CPU 利用率 85%,目标降到 60%
新增 = ⌈6 × (85/60 - 1)⌉ = ⌈6 × 0.417⌉ = 3 台
扩容后:9 BE
数据增长预估
T 个月后所需 BE 数 = 当前 BE 数 × (1 + 月增长率)^T / 当前利用率 × 目标利用率
建议:按 6 个月增长预留,采购周期按 1 个月计算
成本估算公式
硬件成本估算
总成本 = 服务器成本 + 网络成本 + 机房成本 + 人力成本
服务器成本 = Σ(节点数 × 单节点单价)
- FE 节点单价参考(16C/32GB/200GB SSD):¥2~3万
- BE 节点单价参考(32C/128GB/4TB SSD×4):¥6~10万
- BE 节点单价参考(64C/256GB/8TB SSD×12):¥15~25万
网络成本 = 交换机 + 光纤 + 网卡
≈ 总节点数 × ¥0.3~0.5万
机房成本(年) = 总节点数 × ¥0.3~0.5万/节点/年
含:机柜、电力、冷却
人力运维成本(年) = DBA人数 × 年薪
- 小规模:0.5 人(兼职)
- 中规模:1~2 人
- 大规模:3~5 人
单位成本效率
单 TB 存储成本 = 总成本(3年摊销) / 总有效存储(TB)
- SSD 方案参考:¥2000~5000/TB/年
- HDD 方案参考:¥500~1500/TB/年
- 云存算分离(对象存储):¥200~500/TB/年
单 QPS 成本 = 总计算成本 / 支撑 QPS
参考:¥500~2000/QPS/年
速查表
一步估算法(快速粗算)
给定:日增量 D(GB),保留天数 R,副本数 N,压缩比 C,目标 QPS Q
BE 节点数 ≈ MAX(
⌈D × R × N / C / (单BE磁盘TB × 1000 × 0.8)⌉,
⌈Q / 30⌉, # 粗算:每 BE 承载 ~30 QPS
3 # 最少 3 个 BE
)
FE 节点数 = 3 + ⌈MAX(0, Q - 1000) / 300⌉
总内存(GB) = BE数 × 128 + FE数 × 32
总磁盘(TB) = D × R × N / C / 1000 × 1.2
总CPU(核) = BE数 × 32 + FE数 × 16
常用默认值参考
| 参数 | 默认/推荐值 | 说明 |
|---|
replication_num | 3 | 副本数,生产不低于 3 |
mem_limit | 80%~90% | BE 内存使用上限 |
JVM Heap (FE) | 物理内存 50%~70% | FE JVM 堆大小 |
JVM Heap (BE) | 2GB | BE 内嵌 JVM |
max_base_compaction_threads | 4~8 | Base Compaction 线程 |
max_cumulative_compaction_threads | 10~20 | Cumulative Compaction 线程 |
scanner_thread_pool_thread_num | 48 | 扫描线程数 |
storage_page_cache_limit | 20% | Page Cache 占可用内存比例 |
端口速查
| 组件 | 端口 | 用途 |
|---|
| FE | 9010 | BDB JE(元数据同步/选举) |
| FE | 8030 | HTTP(Web UI / REST API / Stream Load) |
| FE | 9030 | MySQL 协议(查询服务) |
| FE | 9020 | Thrift RPC(BE 心跳/Report) |
| FE | 8070 | Arrow Flight SQL |
| BE | 9050 | Heartbeat(心跳端口) |
| BE | 8040 | HTTP(Stream Load / 监控) |
| BE | 9060 | BE Port(Thrift) |
| BE | 8060 | BRPC(BE间数据交换) |
| BE | 8050 | Arrow Flight SQL |
| Meta Service | 5000 | BRPC(存算分离模式) |
附录:规划 Checklist
部署前确认清单