Doris 3.0 机器部署规划通用公式

9 阅读15分钟

最近有朋友找我问资源配置类似的问题,记在此处


目录

  1. 核心概念与架构基础
  2. FE 节点规划公式
  3. BE 节点规划公式
  4. 存储容量规划公式
  5. 内存规划公式
  6. 网络带宽规划公式
  7. Bucket 数量规划公式
  8. 集群规模分级模板
  9. 存算分离模式部署公式
  10. 资源隔离与 Workload Group 规划
  11. 配套组件规划公式
  12. 容量预警与扩容触发公式
  13. 成本估算公式
  14. 速查表

核心概念与架构基础

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 单节点配置
小规模≤ 101M + 2F038C / 16GB / 100GB SSD
中规模10~501M + 2F1~24~516C / 32GB / 200GB SSD
大规模50~2001M + 2F3~56~832C / 64GB / 500GB SSD
超大规模200+1M + 4F5~1010~1532C / 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 数量
小规模< 10TB16C64GB2TB HDD×1210Gbps3~5
中规模10~100TB32C128GB4TB SSD×1210Gbps6~30
大规模100TB~1PB64C256GB8TB SSD×1225Gbps30~100
超大规模> 1PB64C256GB+8TB NVMe×24100Gbps100+

存储容量规划公式

总存储公式

总存储需求 = 热数据存储 + 温数据存储 + 冷数据存储 + 系统预留

热数据存储 = 日增量 × 热保留天数 × 副本数 / 压缩比
温数据存储 = 日增量 × 温保留天数 × 副本数 / 压缩比(可选 HDD)
冷数据存储 = 日增量 × 冷保留天数 × 副本数 / 压缩比(可选对象存储)

系统预留 = (热 + 温) × 20%   # 预留 Compaction、临时数据空间
压缩比参考: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

建议冗余 = 实际需求 × 250%冗余)

推导示例

场景:峰值 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 的幂 = 3264

动态分区 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 节点
Meta Service 节点数 = 3(固定,HA 部署)
配置:8C / 32GB / 500GB SSD

# FoundationDB 节点
FDB 节点数 = 3~5(根据元数据规模)
配置:8C / 32GB / 500GB NVMe

# Compute Group 节点(无状态,可弹性伸缩)
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 数量 = 业务域数量 + 1default/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%(持续 7 天)→ 预警
  磁盘使用率 > 80%                → 立即扩容

# 计算扩容
  CPU 利用率 > 70%(峰值持续 2 小时)→ 预警  
  CPU 利用率 > 85%(峰值持续 30 分钟)→ 立即扩容

# 内存扩容
  内存使用率 > 80%(持续 1 小时)→ 预警
  内存使用率 > 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.2CPU(核)  = BE数 × 32 + FE数 × 16

常用默认值参考

参数默认/推荐值说明
replication_num3副本数,生产不低于 3
mem_limit80%~90%BE 内存使用上限
JVM Heap (FE)物理内存 50%~70%FE JVM 堆大小
JVM Heap (BE)2GBBE 内嵌 JVM
max_base_compaction_threads4~8Base Compaction 线程
max_cumulative_compaction_threads10~20Cumulative Compaction 线程
scanner_thread_pool_thread_num48扫描线程数
storage_page_cache_limit20%Page Cache 占可用内存比例

端口速查

组件端口用途
FE9010BDB JE(元数据同步/选举)
FE8030HTTP(Web UI / REST API / Stream Load)
FE9030MySQL 协议(查询服务)
FE9020Thrift RPC(BE 心跳/Report)
FE8070Arrow Flight SQL
BE9050Heartbeat(心跳端口)
BE8040HTTP(Stream Load / 监控)
BE9060BE Port(Thrift)
BE8060BRPC(BE间数据交换)
BE8050Arrow Flight SQL
Meta Service5000BRPC(存算分离模式)

附录:规划 Checklist

部署前确认清单

  • 确定业务场景:实时分析 / 批量分析 / 混合负载
  • 确定数据规模:日增量、总量、保留策略
  • 确定性能 SLA:查询 QPS、P95/P99 延迟、导入延迟
  • 确定可用性要求:RPO、RTO、副本数
  • 确定部署模式:存算一体 / 存算分离
  • 确定网络架构:单机房 / 多机房 / 云部署
  • 确定资源隔离需求:Workload Group 划分
  • 确定扩容策略:手动 / 弹性伸缩
  • 确定监控告警:Prometheus + Grafana
  • 确定备份策略:RPO 目标、备份方式、异地灾备