下面把之前两篇内容整合成一份完整的Doris 配置与 Broker 详解,按“全局认知 → FE → BE → Broker → 扩缩容 → 系统层 → 端口 → 总结”的顺序展开。每个配置点尽量讲清楚:是什么、为什么、怎么配、怎么验证、避坑。
Doris 配置与 Broker 详解
一、全局认知:Doris 配置分 5 层
Doris 的“配置”不只是改fe.conf、be.conf,而是多层配合:
| 层级 | 配置方式 | 作用 |
|---|---|---|
| 系统环境层 | limits.conf、Swap、时钟、Docker、内核 | 保证进程能跑、稳定、低延迟 |
| 节点静态配置文件 | fe.conf、be.conf、broker.conf | 指定元数据/数据目录、IP、端口、JVM 等 |
| 启动参数层 | start_fe.sh、start_be.sh、start_broker.sh | 控制启动方式、首次加入集群、守护进程 |
| 集群元数据层 | MySQL 协议执行 SQL | 把 BE、FE、Broker 加入集群,扩缩容 |
| 客户端访问层 | MySQL Client / JDBC / ODBC | 通过 9030 端口访问 Doris |
一句话:配置就是告诉 Doris:我是谁、我在哪、数据放哪、怎么通信、能占多少资源、集群里有哪些节点。
二、FE 配置(fe.conf):集群的“大脑”
FE(Frontend)是 Doris 的管理节点,负责接收查询请求、解析 SQL、生成执行计划、管理元数据。所有库表、分区、副本的信息都保存在 FE 的元数据中。
1. meta_dir — 元数据存储路径
是什么:FE 元数据的存储目录,包含所有库、表、分区、副本、事务等核心信息。
为什么要配:
- 元数据是集群的“户口本”,一旦丢失,整个集群无法工作。
- 默认放在 Doris 安装目录下,生产和安装目录混用有风险。
- 生产环境建议使用独立磁盘,最好是 SSD,因为元数据的读写非常频繁。
怎么配:
meta_dir = /data/doris-meta创建目录后,可以通过软链接指向默认的doris-meta目录:
mkdir -p /data/doris-meta ln -s /data/doris-meta /opt/doris/fe/doris-meta怎么验证:启动 FE 后,检查/data/doris-meta目录下是否生成了image、bdbje等子目录。如果启动失败,查看log/fe.log或log/fe.out。
避坑:不要放在 Doris 安装目录下,不要用网络挂载盘(NFS),不要和 BE 数据目录共用磁盘。
2. priority_networks — 网络 IP 绑定
是什么:告诉 FE 使用哪个网段的 IP 来标识自己。值是 CIDR 格式,如192.168.1.0/24。
为什么要配:
- 机器可能有多个网卡(内网、外网、Docker、虚拟机)。
- 不配的话,FE 可能自动选择一个错误的 IP,导致 BE 注册到错误的 IP、FE 之间无法通信。
- 建议任何情况下都显式设置该参数,避免后续机器增加新网卡导致 IP 选择不正确。
怎么配:
priority_networks = 192.168.8.0/24每台机器根据自己的实际网段修改。
怎么验证:启动后连接 FE,执行SHOW FRONTENDS;,查看返回的 IP 是否是你期望的 IP。
3. JAVA_OPTS — JVM 堆内存
是什么:控制 FE Java 进程的最大堆内存(-Xmx)和初始堆内存(-Xms)。
为什么要配:
- FE 默认最大堆内存只有 4GB,生产环境远远不够。
- 元数据量大时,内存不足会导致 OOM(内存溢出),FE 直接崩溃。
- 生产环境建议16GB 以上。
怎么配:
JAVA_OPTS="-Xmx16384m -Xms16384m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"怎么验证:启动 FE 后,执行jps找到 FE 进程,用jstat -gc <pid>查看堆内存使用情况。或者查看fe.gc.log。
4. 其他 FE 配置项
| 配置项 | 默认值 | 作用 | 注意事项 |
|---|---|---|---|
http_port | 8030 | FE Web UI 端口 | 多 FE 部署时,所有 FE 的该端口必须相同 |
rpc_port | 9020 | FE Thrift Server 端口 | BE 通过此端口访问 FE |
query_port | 9030 | MySQL 协议端口 | 用户通过此端口连接 Doris |
edit_log_port | 9010 | FE 之间 BDBJE 通信端口 | 添加 Follower/Observer 时使用 |
怎么验证:访问http://<fe_ip>:8030可以看到 FE 的 Web UI,默认用户root,密码为空。
三、BE 配置(be.conf):数据的“仓库”与“计算器”
BE(Backend)负责实际数据的存储和查询计算。数据按分片(Tablet)存储在 BE 上,默认 3 副本。
1. storage_root_path — 数据存储路径
是什么:BE 存储用户数据的目录。可以配置多个路径,实现多磁盘并行 IO。
为什么要配:
- 默认路径在
be/storage下,需要手动创建,且空间可能不够。 - 多块磁盘配多个路径可以提升读写速度(并行 IO)。
- 可以区分 SSD 和 HDD,实现冷热数据分层存储:热数据放 SSD,冷数据放 HDD。
怎么配:
# 基础写法:多个路径用英文分号分隔,最后一个目录后不要加分号 storage_root_path = /data1/doris;/data2/doris# 高级写法:指定介质类型和容量限制 storage_root_path = /home/disk1/doris,medium:SSD,capacity:500;/home/disk2/doris,medium:HDD,capacity:2000medium:SSD或medium:HDD:指定磁盘介质capacity:500:限制该路径最大使用 500GB- 不写
medium默认为 HDD
怎么验证:
SHOW BACKEND CONFIG LIKE '%storage_root_path%';或访问http://<be_ip>:8040/varz查看。
避坑:最后一个目录后不要加分号;多个路径用英文分号;,不是逗号;目录必须提前创建。
2. priority_networks — BE 的 IP 绑定
和 FE 的priority_networks作用相同,但绑定的是 BE 自己的 IP。每台 BE 机器都要配成自己的 IP。
3. BE 端口配置
| 端口名 | 默认值 | 作用 | 通信方向 |
|---|---|---|---|
be_port | 9060 | Thrift Server,接收 FE 请求 | FE → BE |
webserver_port | 8040 | HTTP Server | BE ↔ BE |
heartbeat_service_port | 9050 | 心跳端口,FE 检测 BE 存活 | FE → BE |
brpc_port | 8060 | BE 之间通信(副本同步、数据均衡) | FE ↔ BE,BE ↔ BE |
为什么heartbeat_service_port是 9050:FE 通过这个端口给 BE 发心跳,如果 BE 在 3 次心跳内没有响应,FE 会认为 BE 已经宕机。添加 BE 节点时必须使用这个端口:
ALTER SYSTEM ADD BACKEND "be_host:9050";四、Broker 详解:访问外部数据的“桥梁”
1. Broker 是什么
Broker 是一个独立的、无状态的 Java 进程,它封装了各种文件系统的接口,为 Doris 提供读写远端存储系统(如 HDFS、S3、OSS 等)文件的能力。Broker 通过一个 RPC 服务端口提供服务,内部封装了类 POSIX 的文件操作,如open、pread、pwrite等。
2. 为什么需要 Broker
Doris 的数据最终存储在 BE 的本地磁盘上。但实际业务中,原始数据往往在外部存储系统中:HDFS 上的 Hive 数仓表、S3/OSS 对象存储中的日志文件、BOS 上的备份数据等。BE 本身并不擅长直接读写这些外部系统的文件,Broker 就是为解决这个问题而生的。
3. Broker 的核心特征
| 特征 | 说明 |
|---|---|
| 无状态 | 不记录任何持久化信息,所有连接信息、文件信息、权限信息都在 RPC 调用时通过参数传递 |
| 不参与计算 | 仅作为数据通路,内存占用极少 |
| 可分组 | 相同类型的 Broker 组成一个组,设定一个名称(Broker Name),用户通过WITH BROKER "broker_name"指定 |
| 可多实例部署 | 通常每台物理机部署一个 Broker 进程 |
4. 支持的存储系统
Broker 目前已支持以下远端存储:
- Apache HDFS
- 阿里云 OSS
- 腾讯云 CHDFS / GFS
- 华为云 OBS
- 亚马逊 S3
- JuiceFS(2.0.0 版本支持)
5. Broker 的三大使用场景
场景一:Broker Load — 异步数据导入
从外部存储系统导入大规模数据到 Doris 中。这是 Broker 最核心的使用场景。
适用场景:源数据在 HDFS、S3 等外部存储中,需要批量导入 Doris 进行分析。
场景二:Export — 异步数据导出
将 Doris 表中的数据导出到外部存储系统。
场景三:Select Into Outfile — 同步数据导出
将查询结果直接导出到外部存储。
6. Broker Load 详细用法
6.1 工作原理
Broker Load 是一个异步导入方式,通过 MySQL API 发起。执行流程如下:
- 用户在 MySQL 客户端提交
LOAD语句 - FE 生成导入计划,将任务拆分为多个子任务分发给各 BE
- 每个 BE 通过 Broker 进程从远端存储拉取数据
- BE 对数据进行 ETL 处理后存储
- 用户通过
SHOW LOAD查看进度和结果
重要提示:随着 Doris 版本优化,现在从 S3 和 HDFS 直接读取已不再依赖额外的 Broker 进程,但语法相似,统称为 Broker Load。
6.2 完整语法
LOAD LABEL [<db_name>.]<load_label> ( [ MERGE | APPEND | DELETE ] DATA INFILE ("<file_path>"[, ...]) [ NEGATIVE ] INTO TABLE `<table_name>` [ PARTITION (<partition_name> [, ...]) ] [ COLUMNS TERMINATED BY "<column_separator>" ] [ LINES TERMINATED BY "<line_delimiter>" ] [ FORMAT AS "<file_type>" ] [ COMPRESS_TYPE AS "<compress_type>" ] [ (<column_list>) ] [ COLUMNS FROM PATH AS (<column_name> [, ...]) ] [ SET (<column_mapping>) ] [ PRECEDING FILTER <predicate> ] [ WHERE <predicate> ] [ DELETE ON <expr> ] [ ORDER BY <source_sequence> ] [ PROPERTIES ("<key>"="<value>" [, ...]) ] ) WITH BROKER "<broker_name>" ( <broker_properties> [, ...] ) [ PROPERTIES (<load_properties> [, ...]) ] [COMMENT "<comment>"];6.3 必选参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
<load_label> | 导入任务的唯一标识,后续通过它查询进度 | broker_load_20240101 |
<file_path> | 源文件路径,支持通配符,必须匹配到具体文件 | hdfs://namenode:8020/data/*.csv |
<table_name> | 目标 Doris 表 | lineorder_brokerload_u |
<broker_name> | 使用的 Broker 名称,通过SHOW BROKER获取 | broker_192_168_0_221 |
<broker_properties> | Broker 访问远端存储所需的认证信息 | "username"="user" |
6.4 从 HDFS 导入完整示例(含 Kerberos 认证)
LOAD LABEL broker_load_ut ( DATA INFILE("hdfs://主NameNode实例IP地址:RPC端口号/user/hive/warehouse/wxk.db/lineorder_broker/*/*") INTO TABLE lineorder_brokerload_u FORMAT AS "orc" (LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERDATE, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_COMMITDATE, LO_SHIPMODE, LO_TAX) ) WITH BROKER "broker_192_168_0_221" ( "hadoop.security.authentication" = "kerberos", "kerberos_principal" = "doris/hadoop.hadoop.com@HADOOP.COM", "kerberos_keytab" = "$(BIGDATA_HOME)/FusionInsight_Doris_*/install/FusionInsight-Doris-*/doris-fe/bin/doris.keytab" ) PROPERTIES ( "timeout" = "1200", "max_filter_ratio" = "0.1" );关键参数说明:
kerberos_principal:访问 Hadoop 集群的 keytab 文件对应的 principalkerberos_keytab:keytab 文件路径,需拷贝到所有 Broker 节点timeout:导入超时时间,默认不超时,单位秒max_filter_ratio:最大容忍可过滤数据的比例,默认零容忍
6.5 从 S3 导入示例
LOAD LABEL test_db.label1 ( DATA INFILE("s3://bucket_name/data.csv") INTO TABLE `test_tbl` COLUMNS TERMINATED BY "," FORMAT AS "csv" ) WITH BROKER "s3_broker" ( "aws.s3.access_key" = "your_access_key", "aws.s3.secret_key" = "your_secret_key", "aws.s3.region" = "us-west-2" ) PROPERTIES ( "timeout" = "3600", "max_filter_ratio" = "0.1" );6.6 关键 PROPERTIES 参数
| 参数 | 作用 | 默认值 |
|---|---|---|
timeout | 导入操作超时时间(秒) | 不超时 |
max_filter_ratio | 最大容忍可过滤数据的比例 | 0(零容忍) |
load_deleted_rows | 用于 DELETE 操作 | - |
strict_mode | 是否开启严格模式 | false |
6.7 数据转换功能
Broker Load 支持在 SQL 语句中直接进行数据转换,包括:
PRECEDING FILTER:前置过滤,在读取阶段就过滤数据WHERE:后置过滤SET:列转换函数COLUMNS FROM PATH AS:从文件路径中抽取列
6.8 查看导入结果
-- 查看最近一次导入任务 SHOW LOAD ORDER BY createtime DESC LIMIT 1\G; -- 查看目标表数据 SELECT * FROM lineorder_brokerload_u;任务状态流转:PENDING → ETL → LOADING → FINISHED(或CANCELLED)。
7. Broker 的配置与部署
7.1 Broker 配置文件
Broker 的配置文件为apache_hdfs_broker.conf,关键配置项包括:
| 配置项 | 默认值 | 说明 |
|---|---|---|
broker_ipc_port | 8000 | Broker 的 RPC 服务端口 |
hdfs_read_buffer_size_kb | 1024 | HDFS 读缓冲区大小(KB) |
hdfs_write_buffer_size_kb | 1024 | HDFS 写缓冲区大小(KB) |
client_expire_seconds | 1800 | 客户端连接过期时间 |
sys_log_dir | $BROKER_HOME/log | 日志目录 |
sys_log_level | INFO | 日志级别 |
同时需要配置priority_networks来绑定正确的 IP。
7.2 部署步骤
# 1. 编译 Broker(进入 fs_brokers 目录) sh build.sh 2. 拷贝 output 目录到目标节点,改名为 apache_hdfs_broker cp -r output/apache_hdfs_broker /opt/module/apache-doris-0.15.0/ 3. 启动 Broker /opt/module/apache-doris-0.15.0/apache_hdfs_broker/bin/start_broker.sh --daemon7.3 在 FE 中注册 Broker
ALTER SYSTEM ADD BROKER broker_name "hadoop1:8000","hadoop2:8000","hadoop3:8000";其中broker_host为 Broker 所在节点 IP,broker_ipc_port为 Broker 配置文件中指定的端口(默认 8000)。
7.4 验证 Broker 状态
SHOW BROKER;输出字段说明:
| 字段 | 说明 |
|---|---|
Name | Broker 进程名称 |
Host | Broker 进程所在节点 IP |
Port | Broker 进程端口 |
Alive | Broker 进程状态(true/false) |
LastStartTime | 上次启动时间 |
ErrMsg | 上次启动失败的错误信息 |
8. Broker 数据导出
8.1 EXPORT 异步导出
将 Doris 表中的数据导出到外部存储:
EXPORT TABLE db1.tbl1 [PARTITION (p1, p2)] [WHERE <where_clause>] TO "hdfs://path/to/export" WITH BROKER "broker_name" ( "username" = "user", "password" = "pass" ) PROPERTIES ( "label" = "mylabel", "column_separator" = ",", "columns" = "col1, col2, col3" );导出任务提交后立即返回,可通过SHOW EXPORT;查看进度。
8.2 SELECT INTO OUTFILE 同步导出
将查询结果直接导出到远端存储:
SELECT * FROM my_table INTO OUTFILE "hdfs://path/to/output" FORMAT AS CSV WITH BROKER "broker_name" ( "username" = "user", "password" = "pass" );9. Broker Load 性能调优
9.1 并发策略
Broker Load 的并发由以下两个参数控制:
| 参数 | 默认值 | 说明 |
|---|---|---|
min_bytes_per_broker_scanner | 64MB | 单个 BE 处理数据量的最小值 |
max_bytes_per_broker_scanner | 3GB | 单个 BE 处理数据量的最大值 |
max_broker_concurrency | 10 | 单个作业的最大并发导入任务数 |
单次导入并发数 =min(源文件大小 / min_bytes_per_broker_scanner, max_broker_concurrency)。
9.2 最佳实践
- 文件拆分:对于压缩文件、Parquet、ORC 文件,建议将文件分割为多个小文件后导入,以提升并发度。
- 分批导入:大数据量导入时,单批控制在 100GB 以内,分批进行。
- 适用场景:Broker Load 最适合原始数据在文件系统(HDFS、BOS、AFS)中的场景,且是单次导入中唯一的异步导入方式。
10. Broker 常见问题与排障
10.1 导入超时
现象:Broker Load 导入数据时报超时错误。
解决方案:在 FE 的自定义配置中增加broker_timeout_ms参数,默认值为 10 秒,需适当调大(如 1000 秒),并重启配置过期的 FE 实例。
10.2 Broker 进程不存活
排查步骤:
- 执行
SHOW BROKER;查看Alive字段 - 如果为 false,检查 Broker 进程是否启动:
ps -ef | grep broker - 检查 Broker 日志
$BROKER_HOME/log/下的错误信息 - 检查
priority_networks配置是否正确
10.3 权限认证失败
如果使用 Kerberos 认证,需要确保:
krb5.conf文件已正确配置在 Broker 节点- keytab 文件已拷贝到所有 Broker 节点并设置了正确的文件权限
kerberos_principal格式正确
六、端口速查表
下面汇总 FE、BE、Broker 三类的所有常用端口,方便在部署、排障和扩缩容时快速对照。
| 组件 | 端口名 | 默认值 | 通信方向 | 用途 |
|---|---|---|---|---|
| FE | http_port | 8030 | 客户端 → FE | FE Web UI 端口,多 FE 部署时所有 FE 该端口必须相同 |
rpc_port | 9020 | BE → FE | FE Thrift Server 端口,BE 通过此端口访问 FE | |
query_port | 9030 | 客户端 → FE | MySQL 协议端口,用户通过此端口连接 Doris | |
edit_log_port | 9010 | FE ↔ FE | FE 之间 BDBJE 通信端口,添加 Follower/Observer 时使用 | |
| BE | be_port | 9060 | FE → BE | Thrift Server,接收 FE 请求 |
webserver_port | 8040 | BE ↔ BE | HTTP Server | |
heartbeat_service_port | 9050 | FE → BE | 心跳端口,FE 检测 BE 存活,添加 BE 节点时使用 | |
brpc_port | 8060 | FE ↔ BE,BE ↔ BE | BE 之间通信(副本同步、数据均衡) | |
| Broker | broker_ipc_port | 8000 | BE → Broker | Broker 的 RPC 服务端口,BE 通过它访问远端存储 |
五、扩容与缩容:为什么扩?怎么扩?
1. 为什么要扩容?
| 场景 | 扩容方式 | 原因 |
|---|---|---|
| FE 读能力不足 | 增加 Observer FE | Observer 只读不参与选举,专门扩展查询能力 |
| FE 高可用不足 | 增加 Follower FE | Follower 参与选举,3 个 Follower 可实现读写高可用 |
| BE 存储或算力不足 | 增加 BE 节点 | 扩展存储容量和计算能力 |
2. FE 扩容:增加 Follower / Observer
前置准备:新 FE 节点需与现有 FE 保持相同的meta_dir、priority_networks、JAVA_OPTS等配置,并确保edit_log_port(默认 9010)可互通。
操作步骤:
- 在现有 FE 上执行
ALTER SYSTEM ADD FOLLOWER或ALTER SYSTEM ADD OBSERVER注册新节点。 - 在新节点上启动 FE 进程,它会自动从已有 FE 同步元数据。
- 通过
SHOW FRONTENDS;验证节点状态。
命令示例:
-- 增加 Follower(参与选举,用于读写高可用) ALTER SYSTEM ADD FOLLOWER "fe_host:9010"; -- 增加 Observer(只读,用于扩展查询能力) ALTER SYSTEM ADD OBSERVER "fe_host:9010";验证方法:
SHOW FRONTENDS;关注Role(Follower/Observer)、IsMaster、Alive字段。新节点Alive为 true 且Role正确即表示扩容成功。
注意事项:
- Follower 数量建议为奇数(如 1、3、5),避免选举时出现脑裂。
- Observer 不参与选举,数量可任意,但会占用元数据同步资源。
- 新 FE 首次启动会全量拉取元数据,耗时取决于元数据大小,期间
Alive可能为 false,属正常现象。
3. BE 扩容:增加 Backend 节点
前置准备:新 BE 节点需配置好storage_root_path、priority_networks、be_port(默认 9060)、heartbeat_service_port(默认 9050)等,并确保目录已创建。
操作步骤:
- 启动新 BE 进程。
- 在 FE 上执行
ALTER SYSTEM ADD BACKEND注册新节点。 - 通过
SHOW BACKENDS;验证节点状态。
命令示例:
ALTER SYSTEM ADD BACKEND "be_host:9050";验证方法:
SHOW BACKENDS;关注Alive、TabletNum、DataUsedCapacity字段。新节点Alive为 true 即表示注册成功,后续 FE 会自动将部分 Tablet 均衡到新节点。
注意事项:
- 添加 BE 时使用
heartbeat_service_port(9050),不是be_port(9060)。 - 新 BE 加入后,数据均衡是异步进行的,可通过
SHOW PROC '/cluster_balance'查看均衡进度。 - 扩容期间建议避开业务高峰,避免数据迁移影响查询性能。
4. 缩容:DECOMMISSION 下线节点
为什么用 DECOMMISSION:直接停掉节点会导致其上的 Tablet 副本缺失,影响数据可用性。DECOMMISSION 会先将该节点上的数据迁移到其他节点,迁移完成后再安全下线。
操作步骤:
- 在 FE 上执行
ALTER SYSTEM DECOMMISSION BACKEND标记下线。 - 等待数据迁移完成,节点上的 Tablet 数降为 0。
- 确认迁移完成后,再物理停止节点进程。
命令示例:
-- 下线 BE 节点 ALTER SYSTEM DECOMMISSION BACKEND "be_host:9050"; -- 下线 FE 节点(Follower/Observer) ALTER SYSTEM DROP FOLLOWER "fe_host:9010"; ALTER SYSTEM DROP OBSERVER "fe_host:9010";验证方法:
SHOW BACKENDS; SHOW FRONTENDS;下线 BE 后,SHOW BACKENDS中该节点TabletNum应逐渐降为 0,最终从列表中消失。下线 FE 后,SHOW FRONTENDS中不再显示该节点。
注意事项:
- DECOMMISSION 是异步操作,数据迁移耗时取决于数据量,期间不要强制 kill 进程。
- 下线 BE 前需确保集群有足够的剩余存储和副本数(默认 3 副本),否则迁移会失败。
- 下线 Follower 前需保证剩余 Follower 数量为奇数,避免选举异常。
- 缩容后建议执行
SHOW PROC '/cluster_balance'确认集群均衡状态恢复正常。