欢迎光临
我们一直在努力

Apache Doris 4.x 生产环境部署文档

Apache Doris 4.x 生产环境部署文档

本部署指南依据 Apache Doris 官方文档库 及 社区最佳实践 编写来部署4.X版本。所有架构决策、参数调优及版本特性描述,均严格索引自以下官方发布材料:Release Notes (版本发布说明)、Architectural Design Documents (架构设计文档)、Github Source Code (源码级确认)

Doris 简介:统一的实时分析型数据仓库

Apache Doris 是一个开源的现代化MPP分析型数据库。它旨在提供一个统一的实时数据分析平台,以高性能和高易用性满足多种复杂的分析场景。其核心价值在于用一个系统覆盖传统的批处理报表、交互式即席查询、实时数据分析乃至数据湖查询,简化了企业的技术架构,避免了为不同场景维护多套系统的复杂性和成本。

Apache Doris 版本演进核心对比(基于官方发布说明)

版本代际Apache Doris 2.x (基石:极速统一)Apache Doris 3.x (架构:存算分离)Apache Doris 4.x (本次部署) (突破:AI 智能中枢)
官方定位 高性能实时分析数据库 云原生湖仓一体架构 AI 原生实时数据仓库
核心执行引擎 Pipeline 执行引擎 引入并行管线技术,解决多核 CPU 利用率问题,实现单机性能 10 倍提升。 存算分离架构 (Tiered Storage) 引入 FoundationDB 管理元数据,支持数据在 SSD 与 S3/HDFS 间冷热分层。 向量化执行引擎 2.0 + AI 原生集成向量检索 (ANN) 算子,支持非结构化数据的高速计算。
查询优化器 Nereids (CBO) 基于成本的全新优化器,无需人工干预 SQL 写法即可获得最优计划。 多租户资源隔离 基于 Workload Group 的软硬隔离,解决 ETL 与查询资源争抢问题。 RAG 基座能力 支持 HNSW 索引,实现毫秒级向量相似度搜索,作为 LLM 的极速知识库。
数据模型 Unique Key (MOW) 合并读写 (Merge-on-Write) 技术,让主键模型具备了极速的更新能力。 湖仓一体 (Lakehouse) 增强 Paimon/Hudi/Iceberg 读写能力,支持“数据入湖即查询”。 混合检索 (Hybrid Search) 首创“倒排索引(关键词) + 向量索引(语义)”联合查询,准确率大幅提升。

为什么在 Doris 4.x 仍选择“存算一体”架构

虽然 Apache Doris 3.0+ 引入了重磅的“存算分离(Separation of Storage and Compute)”架构,但在本次3 节点物理机 + NAS 的环境中,经评估,本次部署方案采用经典的 存算一体(Coupled) 模式。

决策依据(基于官方最佳实践):

  • 基础设施适配性:
    • 存算分离要求:强依赖高性能对象存储(S3/OSS)和分布式 KV 存储(FoundationDB)。
    • 现状:当前环境为 NAS 挂载盘。若强行部署存算分离,需额外维护 FoundationDB 集群,且 NAS 的 IOPS 性能无法支撑元数据频繁交互,反而会成为系统瓶颈。
  • 小规模集群的极致性能:
    • 在节点数 < 10 的场景下,存算一体利用本地磁盘(即使是 NAS 挂载的本地路径)进行数据读取,规避了大量的网络 RPC 开销。对于 3 节点集群,存算一体的查询延迟(Latency)通常优于存算分离。
  • 架构平滑演进:
    • Doris 4.x 的代码库不仅支持存算分离,也对存算一体进行了持续优化。未来若基础设施升级(如引入 MinIO 或上云),我们可以通过 Backup/Restore 或 CCR(跨集群同步)平滑迁移至存算分离架构。
  • 版本兼容性与演进声明

    本文档针对 Apache Doris 4.0.2 版本编写,可用于Apache Doris 4.x全部版本。 鉴于 Doris 采用快速迭代(Fast Release)模式,本部署方案充分考虑了版本演进的继承性:

    • 继承性:完整保留了 2.x 的高性能 OLAP 分析能力及 3.x 的湖仓一体(Lakehouse)特性。
    • 前瞻性:启用 4.x 特有的 AI 向量分析能力,架构设计预留了未来向“存算分离”平滑演进的接口。

    Apache Doris 4.x 生产环境部署概况表

    集群总体概况

    维度规划详情备注
    Apache Doris 版本 4.0.2 (Release) 开启 PipelineX 引擎与向量检索支持
    部署架构模式 3 FE + 3 BE (混合部署 / Mixed) 生产级最小高可用拓扑 (HA),任一节点宕机不影响读写
    存储架构模式 存算一体 (Coupled Mode) 基于本地挂载盘,规避 NAS 网络元数据瓶颈
    操作系统 (OS) CentOS 7.9 / Rocky Linux 8 需关闭 Swap,文件句柄数调优至 65535+
    JDK 版本 Oracle JDK17 Doris 4.x 推荐版本,性能优于 JDK 8
    数据副本数 3 副本 (Replication Num = 3) 保证数据可靠性,允许挂一台机器

    服务器节点规划表

    服务器 IP主机名 (Hostname)节点角色 (Roles)硬件配置关键端口规划
    192.168.221.62 bigdata-1 FE (Master) BE CPU: 8 Core RAM: 32 GB Disk: 100G (/data) FE: 8030/9030 BE: 8040/9050
    192.168.221.63 bigdata-2 FE (Follower) BE CPU: 8 Core RAM: 32 GB Disk: 100G (/data) 同上
    192.168.221.64 bigdata-3 FE (Follower) BE CPU: 8 Core RAM: 32 GB Disk: 100G (/data) 同上

    软件资源准备

    为了确保部署环境的一致性,避免因版本不兼容导致的报错,本次部署统一采用经由验证的标准化安装包。

    本教程涉及的所有核心组件(Apache Doris 4.0.2 安装包、JDK 17 环境包、MySQL 客户端工具)已打包整理完毕。

    已上传到服务器中的/data/目录 在这里插入图片描述

    核心安装包清单

    组件名称文件名说明
    Doris 内核 apache-doris-4.0.2-bin-x64.tar.gz Doris 4.0.2 核心程序包(AVX2版)
    Java 环境 jdk-17.0.12_linux-x64_bin.tar.gz Doris 运行强依赖的 JDK 环境
    客户端工具 mysql-客户端rpm.zip 用于连接 Doris FE 的 MySQL 命令行工具

    📥 获取方式

    为了方便大家快速搭建,上述所有安装包已整理上传至公众号。

    请关注我的公众号 [李指导数据前沿],后台回复关键字 “Doris”,即可免费获取全套部署资源包及相关脚本。


    一、环境准备与系统调优

    对集群服务器进行操作系统层面的关键参数调优与基础依赖配置,消除潜在的性能瓶颈与运行限制,确保 Doris 分布式环境的稳定性。

    1. 配置 SSH 免密互信

    第一步:配置 hosts 映射

    在大数据集群运维中,配置 SSH 免密登录 是基础中的基础。它能让你在一个节点(通常是 Master)上通过脚本批量控制所有节点,后续的分发文件、启动集群都会轻松很多。

    在这里插入图片描述

    请在 三台机器 上都修改 /etc/hosts 文件,配置上自己的IP和主机名;修改后应如下(三台修改):

    在这里插入图片描述

    [root@bigdata-1 ~]# hostname -i
    192.168.221.62
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# cat /etc/hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.221.62 bigdata-1
    192.168.221.63 bigdata-2
    192.168.221.64 bigdata-3
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]#

    第二步:生成密钥 (三台执行)

    ## 生成密钥对(一路回车即可,不要设置密码):
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

    分发公钥给所有节点(包括自己): 这一步会要求你输入一次各台机器的 root 密码,输入完这一次,以后就不用输了。

    ## 发给自己 (很重要,很多脚本需要ssh localhost)
    ssh-copy-id bigdata-1

    ## 发给 63
    ssh-copy-id bigdata-2

    ## 发给 64
    ssh-copy-id bigdata-3

    第三步:验证免密

    依然在 62 节点 上,尝试运行以下命令,看是否还需要输入密码:

    ssh bigdata-1 date
    ssh bigdata-2 date
    ssh bigdata-3 date

    结果标准:如果三条命令都直接输出了时间,没有提示输入密码,说明 主节点控制权 已经打通!

    第四步:配置三台机器两两互通

    (将 62 的权杖复制给别人):既然 62 已经能免密访问所有人了,你可以直接把 62 的 .ssh 目录分发给 63 和 64。这样它们就拥有了同样的“钥匙”。在 62 节点上执行:

    scp -r ~/.ssh bigdata-2:~/
    scp -r ~/.ssh bigdata-3:~/

    做完以上步骤就完整配齐了SSH免密登录,完整步骤记录如下:

    [root@bigdata-1 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    Generating public/private rsa key pair.
    Created directory '/root/.ssh'.
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:TeWP7+J1EsKpwGjIIv08u58pOnq3e8YRvPHvHP7MsWw root@bigdata-1
    The key's randomart image is:
    +—[RSA 2048]—-+
    | . |
    | o |
    | . . . |
    | . . .+o o . + |
    |. o o o=S . = o |
    | . + .o .. . o . |
    | +. . .o . + .|
    | o oo+o o.=E= o |
    |.o.+=O+ .++B.. |
    +—-[SHA256]—–+
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# ssh-copy-id bigdata-1
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host '
    bigdata-1 (192.168.221.62)' can't be established.
    ECDSA key fingerprint is SHA256:0bFBqa1O8fkLAVg9OxN7u2BdI7nfxW6h/B5LksdwtHc.
    ECDSA key fingerprint is MD5:7e:17:c5:bd:2b:b5:d3:ad:bc:c4:09:b5:89:72:ec:fa.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
    root@bigdata-1's password:

    Number of key(s) added: 1

    Now try logging into the machine, with: "ssh 'bigdata-1'"
    and check to make sure that only the key(s) you wanted were added.

    [root@bigdata-1 ~]# ssh-copy-id bigdata-2
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host 'bigdata-2 (192.168.221.63)' can't be established.
    ECDSA key fingerprint is SHA256:0bFBqa1O8fkLAVg9OxN7u2BdI7nfxW6h/B5LksdwtHc.
    ECDSA key fingerprint is MD5:7e:17:c5:bd:2b:b5:d3:ad:bc:c4:09:b5:89:72:ec:fa.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
    root@bigdata-2's password:

    Number of key(s) added: 1

    Now try logging into the machine, with: "ssh 'bigdata-2'"
    and check to make sure that only the key(s) you wanted were added.

    [root@bigdata-1 ~]#

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述


    2. 系统文件句柄数优化

    通过修改文件句柄数来控制系统打开文件的数量。通常情况下默认为1024个文件, 通过 ulimit -n 查看目前最大文件句柄数;Doris 处理海量连接和文件,默认的 1024 远远不够,必须调大。 如果是临时修改可执行 ulimit -n 65535 进行临时生效(重启后失效)。执行以下命令进行永久配置。三台节点都需执行

    第一步:修改 limits.conf

    我们将使用 * 通配符,确保无论你用 root 还是其他用户启动 Doris 都能生效。

    ## 先验证 这个时候输出的应该是1024
    ulimit -n

    ## 备份
    cp /etc/security/limits.conf /etc/security/limits.conf.bak

    ## 追加配置
    ## 使用 cat >> EOF 的方式比 printf 更清晰,不容易出错
    cat >> /etc/security/limits.conf <<EOF
    * soft nofile 65536
    * hard nofile 65536
    * soft nproc 65536
    * hard nproc 65536
    EOF

    ## 验证
    tail -n 4 /etc/security/limits.conf

    第二步:修改 sysctl.conf

    内核级限制

    ## 备份
    cp /etc/sysctl.conf /etc/sysctl.conf.bak

    ## 追加配置
    cat >> /etc/sysctl.conf <<EOF
    fs.file-max = 2000000
    vm.max_map_count = 2000000
    EOF

    ## 让配置立即生效
    sysctl -p

    之后直接使用ulimit -n验证可能并不会生效,而是需要另起一个窗口使用该命令,输出应该是 65536;再使用sysctl vm.max_map_count 输出应该是 vm.max_map_count = 2000000

    命令执行记录

    [root@bigdata-1 ~]# cp /etc/security/limits.conf /etc/security/limits.conf.bak
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# cat >> /etc/security/limits.conf <<EOF
    > * soft nofile 65536
    > * hard nofile 65536
    > * soft nproc 65536
    > * hard nproc 65536
    > EOF
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# tail -n 4 /etc/security/limits.conf
    * soft nofile 65536
    * hard nofile 65536
    * soft nproc 65536
    * hard nproc 65536
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# cp /etc/sysctl.conf /etc/sysctl.conf.bak
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# cat >> /etc/sysctl.conf <<EOF
    > fs.file-max = 2000000
    > vm.max_map_count = 2000000
    > EOF
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# sysctl -p
    fs.file-max = 2000000
    vm.max_map_count = 2000000
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# ulimit -n
    1024
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]# sysctl vm.max_map_count
    vm.max_map_count = 2000000
    [root@bigdata-1 ~]#
    [root@bigdata-1 ~]#

    在这里插入图片描述


    3. 关闭防火墙服务

    为确保 Doris 集群节点之间的顺畅通信,需要进行关闭防火墙服务或清空规则。本文以清空防火墙规则为例,仅关闭 Doris 所需端口的相关规则,其他端口规则保持不变。请注意⚠️,此操作存在安全风险,仅建议在测试环境或变更窗口期间执行,部署完成后应恢复防火墙并启用相关规则。三台节点都需执行

    ## 查看防火墙命令
    systemctl status firewalld

    ## 开启防火墙命令
    systemctl start firewalld

    ## 关闭防火墙命令
    systemctl stop firewalld

    ## 禁用防火墙命令
    systemctl disable firewalld

    ## 查看系统防火墙规则命令
    iptables -L

    ## 清空系统防火墙规则命令
    iptables -F

    在这里插入图片描述


    4. 禁用 SELinux 安全模块

    SeLinux有三种状模式,一个是宽容模式Enforcing,一种是Permissive,还有一种是关闭模式Disabled,其中前两种虽然一个会强制执行一个不会强制执行,但是都会限制部分系统资源访问权限。所以SeLinux最好设置为关闭状态 –Disabled。 三台节点都需执行

    ## 查看SeLinux状态
    getenforce

    ## 临时关闭SeLinux
    setenforce 0

    ## 永久关闭SeLinux
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

    ## 重启生效

    在这里插入图片描述


    5. 禁用 Swap 交换分区

    swap指的是一个交换分区或文件,主要是在内存使用存在压力时,触发内存回收,这时可能会将部分内存的数据交换到swap空间。Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区,不关闭则会导致内存使用率过高,从而引发FE Memory limit exceeded 后挂掉。 三台节点都需执行

    ## 查看Swappiness版本号
    swapon –version

    ## 【永久关闭】修改 fstab 防止重启复活
    sed -i '/swap/s/^/#/' /etc/fstab

    ## 【内核策略】告诉内核尽量别用
    echo "vm.swappiness = 0" >> /etc/sysctl.conf

    ##【立即关闭】先在当前系统里把它关了,如果不重启的情况下
    swapoff -a

    ## 立即生效
    sysctl -p

    在这里插入图片描述


    6. 禁用透明大页 (Transparent Huge Pages)

    为避免 THP 引发内存碎片与不可预期的延迟抖动,需要在运行期禁用并设置开机持久化 三台节点都需执行

    ## 立即禁用(当前运行期临时有效)
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag

    ## 永久有效(写入开机持久化) 这里和图中不太一样,以这里为准;
    cat >> /etc/rc.d/rc.local <<'EOF'
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    EOF

    ## 赋权
    chmod +x /etc/rc.d/rc.local

    在这里插入图片描述


    7. 部署官方标准 Java 运行环境(JDK)

    官方 4.x quick start 明确建议 Java 17;

    前提条件:所有节点已完成 SSH 免密互通,且 JDK 安装包已上传至主节点 (bigdata-1) 的 /data 目录。 目标版本:Oracle JDK 17.0.12 安装路径:/usr/java/jdk-17.0.12

    安装包在本文开头提供 三台节点都需执行

    参考文档:3.10 JDK官方安装步骤

    第一步:清理旧版本 JDK (所有节点)

    为了避免环境变量冲突,需先卸载系统自带的 OpenJDK 1.7/1.8 版本。

    ## 检查当前 Java 版本
    java -version
    rpm -qa | grep jdk

    ## 卸载所有旧版 OpenJDK
    yum -y remove java*openjdk*

    ## 再次验证(应提示“未找到命令”)
    java -version

    第二步: 在这里插入图片描述

    第三步:分发安装包 (主节点)

    将 JDK 安装包从主节点分发至其余计算节点。

    cd /data

    ## 分发至 bigdata-2
    scp /data/jdk-17.0.12_linux-x64_bin.tar.gz bigdata-2:/data/

    ## 分发至 bigdata-3
    scp /data/jdk-17.0.12_linux-x64_bin.tar.gz bigdata-3:/data/

    在这里插入图片描述

    第四步:解压与安装 (所有节点)

    统一安装目录规范为 /usr/java。

    ## 创建规范标准安装目录
    mkdir -p /usr/java

    ## 解压安装包到目标目录
    tar -zxf /data/jdk-17.0.12_linux-x64_bin.tar.gz -C /usr/java/

    ## 修正文件权限(确保 root 用户拥有权限)
    chown -R root:root /usr/java/jdk-17.0.12/

    ## 验证目录结构
    ll /usr/java/
    # 预期输出应包含 jdk-17.0.12 目录

    第五步:配置环境变量 (所有节点)

    将 JDK 路径写入系统级配置文件 /etc/profile,使其永久生效。

    ## 写入环境变量
    cat >> /etc/profile <<EOF

    ## jdk
    export JAVA_HOME=/usr/java/jdk-17.0.12
    export PATH=\\$JAVA_HOME/bin:\\$PATH
    EOF

    ## 加载配置使其立即生效
    source /etc/profile

    第六步:最终验证 (所有节点)

    检查 Java 版本是否正确识别为 17.0.12。

    ## 执行
    java -version
    ## 预计输出
    java version "17.0.12" 2024-07-16 LTS
    Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
    Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)

    在这里插入图片描述


    8. 配置 NTP 时钟同步

    Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。比如报错:Clock delta: 86508 ms. between Feeder: 10.20.144.14… and this Replica exceeds max permissible delta: 5000 ms.

    这篇文章(3.9章)详细讲解了时钟同步的步骤:3.9 时钟同步


    二、Doris 4.x HA 安装部署

    下表详细解析了我们将安装包解压至 /data/doris402 后的标准目录结构。需要特别注意⚠️的是,虽然安装包内预置了默认的数据存放目录(如 FE 的 doris-meta 和 BE 的 storage),但在本次生产级部署实践中,我们采用了**“程序与数据物理分离”**的最佳实践架构:

  • 程序侧:/data/doris402 仅作为软件运行目录,存放二进制文件、启动脚本及依赖库。
  • 数据侧:通过修改 fe.conf 和 be.conf 配置文件,我们将所有的元数据、业务数据及运行日志强制重定向到了 /data/doris/ 目录下。
  • 此目录规划实现了“存算解耦”。即使删除程序目录 (/data/doris402),位于 /data/doris 下的元数据与业务数据也不会丢失,保障了数据的安全性。更能在未来升级 Doris 版本时,直接替换程序目录而无需迁移庞大的业务数据。但注意:不等同于 Doris 的存算分离架构

    目录/文件名对应组件官方定义与核心作用您的部署状态
    fe/ Frontend (FE) (核心) 前端节点目录。负责元数据管理、客户端连接、查询解析、规划生成。 ✅ 已部署 (作为 Master/Follower)
    be/ Backend (BE) (核心) 后端节点目录。负责数据存储、查询计划执行。Doris 的计算和存储均由此完成。 ✅ 已部署 (负责存算)
    extensions/ Extensions 扩展插件目录。目前主要包含 apache_hdfs_broker,用于通过 Broker 协议访问 HDFS/S3 数据。 ⏸️ 暂未使用 (一般通过 Catalog 直连)
    ms/ Meta Service 存算分离组件。用于 Doris 存算分离架构下的元数据服务。 ⏸️ 暂未使用 (因为我们是存算一体模式)
    tools/ Tools 工具集。包含 FoundationDB (fdb) 相关工具,用于存算分离架构的元数据后端支持。 ⏸️ 暂未使用

    1. 硬件兼容性预检 (AVX2)

    Apache Doris 4.0 的核心——向量化执行引擎,本文使用的是 x64(avx2) 二进制包,该包底层强依赖 CPU 的 AVX2 指令集以实现极致的并行计算性能。如果 CPU 不支持 AVX2,后端节点 (BE) 将因无法识别指令而直接崩溃,导致服务不可用。因此,在部署前必须执行以下命令进行硬件兼容性自检:cat /proc/cpuinfo | grep flags | grep avx2 | head -n 1;若不支持请改用 x64(no avx2) 包。

    可以通过自动判断的命令来一件检测:

    if grep -q avx2 /proc/cpuinfo; then echo "✅ CPU 支持 AVX2"; else echo "❌ 不支持 AVX2"; fi


    2. 软件解压与目录初始化

    为了规范安装路径并避免多层目录嵌套,我们使用该命令创建目标文件夹 doris402,并在解压时通过 –strip-components=1 参数自动剥离压缩包自带的顶层版本目录,直接将核心程序文件释放到指定位置。

    mkdir -p doris402 && tar -zxf apache-doris-4.0.2-bin-x64.tar.gz -C doris402 –strip-components=1


    3. 批量创建数据存储与日志目录

    该命令利用 Shell 循环批量远程连接所有集群节点,一次性建立统一规划的元数据、日志及存储等标准目录结构,并递归赋予最高读写权限(777),以防止服务启动时因权限不足而报错。

    for host in bigdata-1 bigdata-2 bigdata-3; do
    echo ">>> 正在处理 $host …"
    ssh $host "mkdir -p /data/doris/{doris_meta,fe_log,storage,be_log,jdbc_drivers} && chmod -R 755 /data/doris"
    done

    上述操作汇总: 在这里插入图片描述 在这里插入图片描述


    4. FE (控制节点) 配置文件fe.conf调优

    在这里插入图片描述

    4.1.配置优化清单:
    类别配置项 (Property)修改值 (Value)修改原因与说明 (Rationale)
    1. 路径配置 LOG_DIR /data/doris/fe_log 日志目录分离。 将日志移出安装目录,保持整洁并防止升级误删。
    meta_dir /data/doris/doris_meta 元数据目录分离。 FE 最核心的数据存储位置,必须独立存放以确保数据安全。
    audit_log_dir /data/doris/fe_log 审计日志目录。 统一存放 SQL 审计日志,便于管理。
    2. 网络配置 priority_networks 192.168.221.0/24 强制绑定内网网段。 防止绑定到 Docker (172.x) 等虚拟网卡,确保多节点通信正常。
    3. Java 环境 JAVA_HOME /usr/java/jdk-17.0.12 指定 JDK 路径。 防止因环境变量缺失导致服务启动失败。
    4. 资源与内存 (JVM) JAVA_OPTS_FOR_JDK_17 -Xmx8192m -Xms8192m (需确保整行配置无换行) JVM 堆内存优化 (32GB 机器标准)。 FE 和 BE 混部时,固定 FE 内存为 8GB,防止 FE 占用过多内存导致 BE (数据节点) 内存不足而崩溃 (OOM)。
    5. 导入与并发 max_routine_load_task_num_per_be 10 提升 Kafka 导入并发。 默认为 5。增加该值可允许单个 BE 节点同时处理更多的 Kafka 分区任务,提升实时数据写入吞吐量。
    6. 业务兼容性 lower_case_table_names 1 表名大小写不敏感。 兼容 MySQL 习惯。注意⚠️:仅初始化前可改,初始化后不可逆。
    enable_sql_audit true 开启 SQL 审计。 记录查询历史,用于排查慢查询和安全审计。
    qe_max_connection 1600 提升最大连接数。 默认 1024。调大以支持 Flink、Web 后端、BI 等更多客户端并发连接。
    7. 性能与超时 bdbje_heartbeat_timeout_second 60 放宽心跳超时。 防止网络/磁盘波动导致 FE 误判死亡发生主从切换。
    remote_fragment_exec_timeout_ms 15000 远程片段超时。 防止僵死查询长时间占用 BE 资源。
    4.2.priority_networks 配置项说明

    在 Doris 集群的多节点通信中,priority_networks 是至关重要的配置项。它用于强制指定 Doris 进程(FE/BE)使用哪个网段进行内部通信,防止自动绑定到错误的虚拟网卡(如 Docker 或 KVM 网桥)导致集群无法互通。

    怎么取值?在 bigdata-1 中 输入:

    ip addr

    得到如下结果:

    [root@bigdata-1 ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 50:6b:8d:9b:b2:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.221.62/24 brd 192.168.221.255 scope global noprefixroute eth0
    valid_lft forever preferred_lft forever
    inet6 fe80::64cc:ba7f:2d8:5838/64 scope link tentative noprefixroute dadfailed
    valid_lft forever preferred_lft forever
    inet6 fe80::3eb7:830:8706:94e/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:f4:ee:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
    valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:f4:ee:9f brd ff:ff:ff:ff:ff:ff
    [root@bigdata-1 ~]# hostname -i
    192.168.221.62
    [root@bigdata-1 ~]#

    在这里插入图片描述

    1. 环境现状分析 (基于 ip addr 输出)

    通过在服务器上执行 ip addr 命令,我们获取到当前机器的网络接口信息如下:

    • 接口 1: lo (Loopback)
      • IP: 127.0.0.1/8
      • 类型: 本地回环接口。
      • 判断: ❌ 不可用。此接口仅限本机内部通信,无法与集群内其他机器(bigdata-2, bigdata-3)连接。
    • 接口 2: eth0 (Ethernet)
      • IP: 192.168.221.62/24
      • 类型: 物理网卡(或主虚拟网卡)。
      • 判断: ✅ 正确。这是局域网内的真实 IP 地址,三台机器(62, 63, 64)通过此网络互通。
    • 接口 3: virbr0 (Virtual Bridge)
      • IP: 192.168.122.1/24
      • 类型: KVM/Libvirt 虚拟化网桥。
      • 判断: ❌ 不可用。这是 Linux 虚拟化自动生成的网桥,通常用于虚拟机 NAT 上网,外部机器无法访问此 IP。如果 Doris 绑定到这个 IP,会导致 BE 心跳检测失败。
    2. 值是如何计算的?

    根据选定的正确接口 eth0,我们提取以下关键信息进行 CIDR(网段)计算:

    • IP 地址: 192.168.221.62
    • 子网掩码: /24 (即 255.255.255.0)

    计算规则: 保留 IP 前三段(网络位),将最后一段(主机位)归零,并加上掩码长度。

    192.168.221.62 -> 192.168.221.0 加上掩码后缀 -> /24

    最终结果: 192.168.221.0/24

    3. 最终配置结论

    在 fe.conf 和 be.conf 中,该参数应填写如下:

    # 强制绑定 192.168.221.x 网段,屏蔽 virbr0 和 lo 接口
    priority_networks = 192.168.221.0/24

    配置优势: 使用网段格式(CIDR)而非具体 IP,可以保证三台机器(192.168.221.62, .63, .64)使用完全相同的配置文件,无需单独修改,便于分发和管理。

    4.3.完整 fe.conf 如下:

    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements. See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership. The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License. You may obtain a copy of the License at
    #
    # http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing,
    # software distributed under the License is distributed on an
    # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND, either express or implied. See the License for the
    # specific language governing permissions and limitations
    # under the License.

    #####################################################################
    ## The uppercase properties are read and exported by bin/start_fe.sh.
    ## To see all Frontend configurations,
    ## see fe/src/org/apache/doris/common/Config.java
    #####################################################################

    CUR_DATE=`date +%Y%m%d-%H%M%S`

    # Log dir 日志目录分离
    LOG_DIR = /data/doris/fe_log

    # For jdk 17, this JAVA_OPTS will be used as default JVM options
    JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$
    LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M –add-opens=java.base/java.nio=ALL-UNNAMED –add-opens java
    .base/jdk.internal.ref=ALL-UNNAMED –add-opens java.base/sun.nio.ch=ALL-UNNAMED –add-opens java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"

    # 指定JDK路径
    JAVA_HOME=/usr/java/jdk-17.0.12

    ##
    ## the lowercase properties are read by main program.
    ##

    # 元数据目录分离
    meta_dir = /data/doris/doris_meta

    # Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
    # jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers

    http_port = 8030
    rpc_port = 9020
    query_port = 9030
    edit_log_port = 9010
    arrow_flight_sql_port = 8070

    # Choose one if there are more than one ip except loopback address.
    # Note that there should at most one ip match this list.
    # If no ip match this rule, will choose one randomly.
    # use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
    # 强制绑定内网网段。
    priority_networks = 192.168.221.0/24

    # Advanced configurations
    # log_roll_size_mb = 1024
    # INFO, WARN, ERROR, FATAL
    sys_log_level = INFO
    # NORMAL, BRIEF, ASYNC
    sys_log_mode = ASYNC
    # sys_log_roll_num = 10
    # sys_log_verbose_modules = org.apache.doris
    # 审计日志目录
    audit_log_dir = /data/doris/fe_log
    # audit_log_modules = slow_query, query
    # audit_log_roll_num = 10
    # meta_delay_toleration_second = 10
    # qe_max_connection = 1024
    # qe_query_timeout_second = 300
    # qe_slow_log_ms = 5000

    # 开启 SQL 审计
    enable_sql_audit = true
    # 放宽元数据心跳超时
    bdbje_heartbeat_timeout_second = 60
    # 设置远程片段执行超时
    remote_fragment_exec_timeout_ms = 15000
    # 提升最大连接数
    qe_max_connection = 2048
    # 表名大小写不敏感
    lower_case_table_names = 1
    # 提升 Kafka 导入并发。
    max_routine_load_task_num_per_be = 10


    5. 启动 FE Master 主节点

    在 FE Master( bigdata-1)节点启动 FE,先确保主节点没问题;

    ## 启动FE MASTER 节点
    [root@bigdata-1 fe]# /data/doris402/fe/bin/start_fe.sh –daemon

    ## 执行完后可等待10s之后执行后面相关状态检测命令

    ## JPS 查看是否成功启动了FE的进程
    [root@bigdata-1 fe]# jps
    25120 Jps
    24892 DorisFE

    ## 检查 fe_log 是否输出了 FE内部通信RPC启动成功,注⚠️:WARN … Help module failed 是帮助模块加载失败,不影响核心功能,可以直接忽略。
    [root@bigdata-1 fe]# grep -E "thrift server started|QeService" /data/doris/fe_log/fe.log
    2026-01-08 01:15:10,270 INFO (UNKNOWN fe_4f44a060_40eb_4b01_a9c3_b1c5677a0324(-1)|1) [FeServer.start():80] thrift server started.
    2026-01-08 01:15:13,600 WARN (UNKNOWN fe_4f44a060_40eb_4b01_a9c3_b1c5677a0324(-1)|1) [QeService.start():58] Help module failed. ignore it.
    at org.apache.doris.qe.QeService.start(QeService.java:56)
    2026-01-08 01:15:14,023 INFO (UNKNOWN fe_4f44a060_40eb_4b01_a9c3_b1c5677a0324(-1)|1) [QeService.start():75] QE service start.
    [root@bigdata-1 fe]#

    ## FE 节点是否从 UNKNOWN 变为了 MASTER 如果输出为空也是正常情况
    [root@bigdata-1 fe]# grep "transfer from UNKNOWN to MASTER" /data/doris/fe_log/fe.log
    [root@bigdata-1 fe]#

    ## 是否有报错 log4j:WARN No appenders 此类警告属于非致命错误,可忽略
    [root@bigdata-1 fe]# grep "ERROR" /data/doris/fe_log/fe.log
    2026-01-08 01:15:09,839 ERROR (stateListener|88) [LogLog.warn():157] log4j:WARN No appenders could be found for logger (io.netty.util.ResourceLeakDetector).
    2026-01-08 01:15:09,839 ERROR (stateListener|88) [LogLog.warn():157] log4j:WARN Please initialize the log4j system properly.
    2026-01-08 01:15:09,839 ERROR (stateListener|88) [LogLog.warn():157] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    [root@bigdata-1 fe]#

    在这里插入图片描述


    6. 安装 MySQL 客户端工具

    因为 Doris 没有自带命令行工具,它直接“借用”了 MySQL 的客户端来作为它的操作界面。在集群部署的这个阶段,我们需要进行集群组建操作,而这些操作只能通过 SQL 命令完成,无法通过修改配置文件完成。如果没有安装这个客户端,就无法进入 Doris 的控制台

    [root@bigdata-1 data]# ll
    总用量 3739088
    -rw-r–r– 1 root root 3596248208 1211 17:54 apache-doris-4.0.2-bin-x64.tar.gz
    drwxrwxrwx 7 root root 4096 18 00:44 doris
    drwxr-xr-x 7 root root 4096 18 00:43 doris402
    -rw-r–r– 1 root root 182799609 17 23:58 jdk-17.0.12_linux-x64_bin.tar.gz
    drwx—— 2 root root 16384 16 18:35 lost+found
    -rw-r–r– 1 root root 49741908 17 23:59 mysql-客户端rpm.zip

    ## 解压 mysql客户端安装包
    [root@bigdata-1 data]# unzip mysql-客户端rpm.zip
    Archive: mysql-客户端rpm.zip
    inflating: mysql-community-client-5.7.28-1.el7.x86_64.rpm
    inflating: mysql-community-common-5.7.28-1.el7.x86_64.rpm
    inflating: mysql-community-libs-5.7.28-1.el7.x86_64.rpm

    ## 安装 MYSQL 客户端
    [root@bigdata-1 data]# rpm -ivh mysql-community-*.rpm –force –nodeps
    警告:mysql-community-client-5.7.28-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
    准备中... ################################# [100%]
    正在升级/安装...
    1:mysql-community-common-5.7.28-1.e################################# [ 33%]
    2:mysql-community-libs-5.7.28-1.el7################################# [ 67%]
    3:mysql-community-client-5.7.28-1.e################################# [100%]
    [root@bigdata-1 data]#


    7. FE 集群组网:注册 Follower 节点

    1. 登录 Master 节点 FE 首次启动默认无密码。请使用 MySQL 客户端连接 Master(命令:mysql -h 127.0.0.1 -P 9030 -uroot),进入管理终端。

    2. 预注册 Follower 节点 在 Master 上执行 SQL,将另外两台规划中的 FE 节点加入集群白名单:

    ALTER SYSTEM ADD FOLLOWER "192.168.221.63:9010";
    ALTER SYSTEM ADD FOLLOWER "192.168.221.64:9010";

    ⚠️ 核心逻辑说明:为什么这里要填具体 IP? 虽然我们在配置文件 (fe.conf) 中设置的 priority_networks 是网段(如 192.168.221.0/24),但该配置的作用是让节点启动时自动命中本机的一个具体 IP。

    在此处注册时,必须填写该节点“命中后”的真实 IP 地址。

    请务必确认填写的 192.168.221.63 确实位于目标机器的 priority_networks 网段规则内,且是该机器的真实内网地址。

    切勿在此处直接填写 CIDR 网段,Master 仅接受具体的 IP:Port 格式。

    ## 进入Doris终端
    [root@bigdata-1 data]# mysql -h 127.0.0.1 -P 9030 -uroot
    Welcome to the MySQL monitor. Commands end with ; or \\g.
    Your MySQL connection id is 1
    Server version: 5.7.99 doris version doris-4.0.2-rc02-30d2df0459
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
    mysql>

    ## 添加另外两台机器的FE角色为Follower;
    mysql> ALTER SYSTEM ADD FOLLOWER "192.168.221.63:9010";
    Query OK, 0 rows affected (0.03 sec)

    mysql> ALTER SYSTEM ADD FOLLOWER "192.168.221.64:9010";
    Query OK, 0 rows affected (0.01 sec)

    mysql>

    在这里插入图片描述


    8. 分发程序包(doris402)并启动 Follower 服务

    1.全量分发安装包 将 Master 节点(bigdata-1)上解压并配置完成的 doris402 目录分发至所有 Follower 节点,确保集群配置文件的绝对一致性。

    ## 在 bigdata-1 执行
    [root@bigdata-1 data]# scp -r /data/doris402 bigdata-2:/data/
    [root@bigdata-1 data]# scp -r /data/doris402 bigdata-3:/data/

    2.启动 Follower 节点 (首次启动需指定 Helper) 在 bigdata-2 和 bigdata-3 上分别启动 FE 服务。

    ## 节点2 bigdata-2 操作
    [root@bigdata-2 doris402]# /data/doris402/fe/bin/start_fe.sh –helper 192.168.221.62:9010 –daemon
    [root@bigdata-2 doris402]# jps
    55050 Jps
    54925 DorisFE

    ## 节点3 bigdata-3 操作
    [root@bigdata-3 ~]# /data/doris402/fe/bin/start_fe.sh –helper 192.168.221.62:9010 –daemon
    [root@bigdata-3 ~]# jps
    53906 DorisFE
    54034 Jps

    💡 技术贴士: –helper 参数仅在 FE 第一次启动(元数据目录为空)时需要。一旦从节点成功加入集群并同步了元数据,以后重启服务只需直接运行 start_fe.sh –daemon 即可,无需再加 helper 参数。

    返回主节点通过 SQL 命令检查集群拓扑,确认所有 FE 节点均已加入集群且心跳状态正常。

    返回 Master 节点执行检查 在 bigdata-1 上执行以下命令。该命令使用 -e 参数直接执行 SQL 并退出,使用 -t 参数以表格形式输出,方便查看。

    mysql -h 127.0.0.1 -P 9030 -uroot -t -e "SHOW FRONTENDS"

    在这里插入图片描述

    至此,FE 高可用集群已成功组建并验证无误。接下来,我们将进入核心存储层——BE(Backend)节点的配置与部署阶段。


    9. BE (数据节点) 配置文件be.conf调优

    在这里插入图片描述

    9.1.配置优化清单:
    类别配置项 (Property)修改值 (Value)修改原因与说明 (Rationale)
    1. 路径配置 LOG_DIR /data/doris/be_log 日志目录分离。 将 BE 运行日志移出安装目录,防止升级误删。
    storage_root_path /data/doris/storage,medium:HDD 数据存储目录。 指定数据存储在数据盘,并显式标记介质类型为 HDD(机械硬盘)或 SSD。这是 BE 最核心的配置。
    jdbc_drivers_dir /data/doris/jdbc_drivers 驱动目录分离。 存放连接外部数据库(如 JDBC Catalog)所需的 Jar 包。
    2. 网络配置 priority_networks 192.168.221.0/24 强制绑定内网网段。 防止 BE 错误绑定到 Docker 或虚拟网卡,导致与 FE 心跳失联。和FE配置一样
    3. Java 环境 JAVA_HOME /usr/java/jdk-17.0.12 指定 JDK 路径。 确保 BE 能够加载 Java 环境(用于 JDBC 外表查询等功能)。
    JAVA_OPTS_FOR_JDK_17 … -Xmx2048m … 限制 BE 的 Java 堆内存。 BE 是 C++ 程序,但部分功能(如 JDBC)需用到 JVM。在 32GB 机器上,将 JVM 限制为 2GB,把更多内存留给 C++ 核心计算引擎。
    4. 内存管理 mem_limit 80% BE 进程总内存限制。 限制 Doris BE 进程最大占用物理内存的 80%(约 25.6GB),预留 20% 给操作系统和内核,防止机器死机。
    5. 性能优化 enable_vertical_compaction true 开启垂直 Compaction。 显著减少数据合并时的内存消耗,对内存有限(32GB)的机器非常关键。
    enable_segcompaction true 开启 Segment Compaction。 在写入过程中进行小文件合并,减少小文件数量,提升查询性能。
    6. 导入与并发 routine_load_thread_pool_size 10 提升 Kafka 导入并发。 增加 Kafka 导入的线程池大小,允许单个 BE 节点并行处理更多 Kafka 分区。
    streaming_load_max_mb 4096 提升单次导入上限。 允许 Stream Load 单次导入最大 4GB 的数据(默认通常较小),适合大批量数据同步。
    fragment_pool_thread_num_max 512 提升查询并行度。 增加查询执行线程池上限,提升高并发场景下的查询吞吐量。
    9.2.完整 be.conf 如下:

    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements. See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership. The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License. You may obtain a copy of the License at
    #
    # http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing,
    # software distributed under the License is distributed on an
    # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND, either express or implied. See the License for the
    # specific language governing permissions and limitations
    # under the License.

    CUR_DATE=`date +%Y%m%d-%H%M%S`

    # 日志目录分离
    LOG_DIR = /data/doris/be_log

    # 限制 BE 的 Java 堆内存
    # For jdk 17, this JAVA_OPTS will be used as default JVM options
    JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx2048m -DlogPath=$LOG_DIR/jni.log -Xlog:gc*:$LOG_DIR/be.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Dsun.java.command=DorisBE -XX:-Critical
    JNINatives -XX:+IgnoreUnrecognizedVMOptions –add-opens=java.base/java.lang=ALL-UNNAMED –add-opens=java.base/java.lang.invoke=ALL-UNNAMED –add-opens=java.base/java.lang.reflect=ALL-UNNAMED –add-opens=java.base/java.io=ALL-UNNAMED –add-opens=java.base/java.net=ALL-UNNAMED –add-opens=java.base/java.nio=ALL-UNNAMED –add-opens=java.base/java.util=ALL-UNNAMED –add-opens=java.base/java.util.concurrent=ALL-UNNAMED –add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED –add-opens=java.base/sun.nio.ch=ALL-UNNAMED –add-opens=java.base/sun.nio.cs=ALL-UNNAMED –add-opens=java.base/sun.security.action=ALL-
    UNNAMED –add-opens=java.base/sun.util.calendar=ALL-UNNAMED –add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED –add-opens=java.management/sun.management=ALL-UNNAMED -Darrow.enable_null_check_for_get=false"

    # 指定 JDK 路径
    JAVA_HOME = /usr/java/jdk-17.0.12

    # https://github.com/apache/doris/blob/master/docs/zh-CN/community/developer-guide/debug-tool.md#jemalloc-heap-profile
    # https://jemalloc.net/jemalloc.3.html
    JEMALLOC_CONF="percpu_arena:percpu,background_thread:true,metadata_thp:auto,muzzy_decay_ms:5000,dirty_decay_ms:5000,oversize_threshold:0,prof:true,prof_active:false,lg_prof_interval:-1,lg_extent_max_active_fit:8"
    JEMALLOC_PROF_PRFIX="jemalloc_heap_profile_"

    # ports for admin, web, heartbeat service
    # 业务管控端口
    be_port = 9060
    # 数据导入与监控端口。
    webserver_port = 8040
    # 心跳存活检测端口。
    heartbeat_service_port = 9050
    # 内部数据传输端口。
    brpc_port = 8060
    # 极速数据读取端口 (4.0 新特性)。
    arrow_flight_sql_port = 8050

    # HTTPS configures
    enable_https = false
    # path of certificate in PEM format.
    ssl_certificate_path = "$DORIS_HOME/conf/cert.pem"
    # path of private key in PEM format.
    ssl_private_key_path = "$DORIS_HOME/conf/key.pem"

    # Choose one if there are more than one ip except loopback address.
    # Note that there should at most one ip match this list.
    # If no ip match this rule, will choose one randomly.
    # use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
    # Default value is empty.
    # 强制绑定内网网段
    priority_networks = 192.168.221.0/24

    # data root path, separate by ';'
    # You can specify the storage type for each root path, HDD (cold data) or SSD (hot data)
    # eg:
    # 数据存储目录
    storage_root_path = /data/doris/storage,medium:HDD
    # storage_root_path = /home/disk1/doris,medium:SSD;/home/disk2/doris,medium:SSD;/home/disk2/doris,medium:HDD
    # /home/disk2/doris,medium:HDD(default)
    #
    # you also can specify the properties by setting '<property>:<value>', separate by ','
    # property 'medium' has a higher priority than the extension of path
    #
    # Default value is ${DORIS_HOME}/storage, you should create it by hand.
    # storage_root_path = ${DORIS_HOME}/storage

    # Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
    # 驱动目录分离
    jdbc_drivers_dir = /data/doris/jdbc_drivers

    # Advanced configurations
    # INFO, WARNING, ERROR, FATAL
    sys_log_level = INFO

    # sys_log_roll_mode = SIZE-MB-1024
    # sys_log_roll_num = 10
    # sys_log_verbose_modules = *
    # log_buffer_level = -1

    # aws sdk log level
    # Off = 0,
    # Fatal = 1,
    # Error = 2,
    # Warn = 3,
    # Info = 4,
    # Debug = 5,
    # Trace = 6
    # Default to turn off aws sdk log, because aws sdk errors that need to be cared will be output through Doris logs
    aws_log_level = 2

    # azure sdk log level
    # Verbose = 1,
    # Informational = 2,
    # Warning = 3,
    # Error = 4
    azure_log_level = 4
    ## If you are not running in aws cloud, you can disable EC2 metadata
    AWS_EC2_METADATA_DISABLED=true

    # BE 进程总内存限制
    mem_limit = 80%
    # 开启垂直 Compaction
    enable_vertical_compaction = true
    # 开启 Segment Compaction 小文件合并
    enable_segcompaction = true
    # 提升 Kafka 导入并发
    routine_load_thread_pool_size = 10
    # 提升单次导入上限
    streaming_load_max_mb = 4096
    # 提升查询并行度
    fragment_pool_thread_num_max = 512
    fragment_pool_queue_size = 2048

    9.3.分发 be.conf 配置文件到另外两台机器

    确保三台机器的配置完全一致。

    ## 发给 bigdata-2
    [root@bigdata-1 conf]# scp /data/doris402/be/conf/be.conf bigdata-2:/data/doris402/be/conf/
    be.conf 100% 5101 10.7MB/s 00:00
    ## 发给 bigdata-3
    [root@bigdata-1 conf]# scp /data/doris402/be/conf/be.conf bigdata-3:/data/doris402/be/conf/
    be.conf 100% 5101 13.6MB/s 00:00
    [root@bigdata-1 conf]#


    10. 分发配置并重启 BE 服务

    为了让新配置生效,我们需要重启 BE。执行下面这段脚本,它会自动遍历三台机器进行“先停后启”。

    for host in bigdata-1 bigdata-2 bigdata-3; do

    echo “>>> 正在重启 $host 的 BE …”

    停止 BE

    ssh $host “/data/doris402/be/bin/stop_be.sh”

    等待 3 秒确保端口释放

    sleep 3

    启动 BE (带环境变量加载,防找不到 JAVA_HOME)

    ssh $host “source /etc/profile; /data/doris402/be/bin/start_be.sh –daemon”

    done

    下面的日志中报错 not exist 是正常情况, 表示我要停止它,但是发现这个进程本来就没有运行;

    [root@bigdata-1 conf] for host in bigdata-1 bigdata-2 bigdata-3; do
    echo ">>> 正在重启 $host 的 BE …"

    ssh $host "/data/doris402/be/bin/stop_be.sh"

    sleep 3

    ssh $host "source /etc/profile; /data/doris402/be/bin/start_be.sh –daemon"
    done

    >>> 正在重启 bigdata-1 的 BE ...
    ERROR: /data/doris402/be/bin/be.pid does not exist
    >>> 正在重启 bigdata-2 的 BE ...
    ERROR: /data/doris402/be/bin/be.pid does not exist
    >>> 正在重启 bigdata-3 的 BE ...
    ERROR: /data/doris402/be/bin/be.pid does not exist


    11. 验证 BE 进程启动状态

    for host in bigdata-1 bigdata-2 bigdata-3; do
    echo ">>> Checking $host …"
    ssh $host "ps -ef | grep doris_be | grep -v grep"
    done

    在这里插入图片描述


    12. 注册 BE 节点至集群

    ## 进入doris控制台
    [root@bigdata-1 data]# mysql -h 127.0.0.1 -P 9030 -uroot
    Welcome to the MySQL monitor. Commands end with ; or \\g.
    Your MySQL connection id is 2
    Server version: 5.7.99 doris version doris-4.0.2-rc02-30d2df0459

    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
    mysql>
    ## 向doris注册三台BE节点
    mysql> ALTER SYSTEM ADD BACKEND "192.168.221.62:9050";
    Query OK, 0 rows affected (0.01 sec)

    mysql> ALTER SYSTEM ADD BACKEND "192.168.221.63:9050";
    Query OK, 0 rows affected (0.01 sec)

    mysql> ALTER SYSTEM ADD BACKEND "192.168.221.64:9050";
    Query OK, 0 rows affected (0.01 sec)

    mysql> SHOW PROC '/backends';

    三台BE节点的Alive 为 true 则全部启动成功;

    在这里插入图片描述


    13. 系统安全加固:修改默认密码

    在 Apache Doris 初始化完成后,默认会有 root 和 admin 两个超级账户,且默认都没有密码。如果不进行修改,任何人只要网络能通,都能随意删库跑路或停止节点。在集群正式接入业务数据或开放网络访问前,必须强制修改这两个账户的密码,以防止未经授权的恶意访问或误操作。

    ## 修改 root 账户密码 (最高权限账户)
    SET PASSWORD FOR 'root' = PASSWORD('123456');

    ## 修改 admin 账户密码 (通常用于通过 WebUI 访问)
    SET PASSWORD FOR 'admin' = PASSWORD('123456');

    (注⚠️:将 123456 替换为实际规划的强密码)

    13.1.验证登录

    修改完成后,原有的无密连接将立刻失效。请退出当前会话,使用新密码进行登录验证。

    mysql -h 192.168.221.62 -P 9030 -uroot -p123456

    完整操作步骤:

    [root@bigdata1 data]# mysql -h 127.0.0.1 -P 9030 -uroot
    Welcome to the MySQL monitor. Commands end with ; or \\g.
    Your MySQL connection id is 2
    Server version: 5.7.99 doris version doris4.0.2rc0230d2df0459

    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
    mysql>
    mysql> SET PASSWORD FOR 'root' = PASSWORD('123456');
    Query OK, 0 rows affected (0.03 sec)
    mysql> SET PASSWORD FOR 'admin' = PASSWORD('123456');
    Query OK, 0 rows affected (0.03 sec)
    mysql> exit;

    [root@bigdata1 data]# mysql -h 192.168.221.62 -P 9030 -uroot -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor. Commands end with ; or \\g.
    Your MySQL connection id is 14
    Server version: 5.7.99 doris version doris4.0.2rc0230d2df0459

    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

    mysql>


    14. 集群整体健康度验收

    集群部署并配置完成后,需要进行最后一步的整体健康度检查。此步骤旨在确认 FE 高可用机制是否生效,以及 BE 节点是否正常汇报心跳并承载数据。

    14.1. FE 节点完整状态检查

    在 MySQL 客户端执行以下命令,检查 FE 集群的选主状态和同步情况。

    SHOW PROC '/frontends';

    NameHostEditLogPortHttpPortQueryPortRpcPortArrowFlightSqlPortRoleIsMasterClusterIdJoinAliveReplayedJournalIdLastStartTimeLastHeartbeatIsHelperErrMsgVersionCurrentConnectedLiveSince
    fe_4f44a060_… 192.168.221.62 9010 8030 9030 9020 8070 FOLLOWER true 1880978945 true true 364246 2026-01-08 01:15:09 2026-01-26 17:16:15 true doris-4.0.2-rc02… Yes 2026-01-08 01:15:08
    fe_607b7b4e_… 192.168.221.63 9010 8030 9030 9020 8070 FOLLOWER false 1880978945 true true 364244 2026-01-08 01:32:05 2026-01-26 17:16:15 true doris-4.0.2-rc02… No 2026-01-08 22:54:27
    fe_1dc8f430_… 192.168.221.64 9010 8030 9030 9020 8070 FOLLOWER false 1880978945 true true 364244 2026-01-08 01:32:21 2026-01-26 17:16:15 true doris-4.0.2-rc02… No 2026-01-08 22:52:17

    ✅ FE 验收标准:

    • Alive: 全部为 true。
    • Role: 三个节点均为 FOLLOWER。
    • IsMaster: 必须且仅有一个节点为 true(本例中为 192.168.221.62)。
    • ReplayedJournalId: 主从节点之间的数值差异极小(本例中为 364246 vs 364244),说明元数据同步非常及时。
    14.2. BE 节点完整状态检查

    在 MySQL 客户端执行以下命令,检查 BE 节点的存活状态、磁盘容量及分片负载情况。

    SHOW PROC '/backends';

    BackendIdHostHeartbeatPortBePortHttpPortBrpcPortArrowFlightSqlPortLastStartTimeLastHeartbeatAliveSystemDecommissionedTabletNumDataUsedCapacityTrashUsedCapacityAvailCapacityTotalCapacityUsedPctMaxDiskUsedPctRemoteUsedCapacityTagErrMsgVersionStatusHeartbeatFailureCounterNodeRoleCpuCoresMemoryLiveSinceRunningTasks
    1767806110395 192.168.221.62 9050 9060 8040 8060 8050 2026-01-08 02:07:42 2026-01-26 17:16:25 true false 3499 382.001 MB 0.000 76.698 GB 97.931 GB 21.68 % 21.68 % 0.000 {“location” : “default”} doris-4.0.2-rc02… {“lastSuccessReportTabletsTime”:“2026-01-26 17:16:21”,…“isActive”:true,“isShutdown”:false…} 0 mix 8 31.23 GB 2026-01-26 17:16:25 0
    1767806110396 192.168.221.63 9050 9060 8040 8060 8050 2026-01-08 02:07:46 2026-01-26 17:16:25 true false 5432 643.519 MB 0.000 85.176 GB 97.931 GB 13.02 % 13.02 % 0.000 {“location” : “default”} doris-4.0.2-rc02… {“lastSuccessReportTabletsTime”:“2026-01-26 17:15:31”,…“isActive”:true,“isShutdown”:false…} 0 mix 8 31.23 GB 2026-01-26 17:16:25 0
    1767806110398 192.168.221.64 9050 9060 8040 8060 8050 2026-01-08 02:07:51 2026-01-26 17:16:25 true false 5425 658.448 MB 0.000 85.170 GB 97.931 GB 13.03 % 13.03 % 0.000 {“location” : “default”} doris-4.0.2-rc02… {“lastSuccessReportTabletsTime”:“2026-01-26 17:16:18”,…“isActive”:true,“isShutdown”:false…} 0 mix 8 31.23 GB 2026-01-26 17:16:25 0

    ✅ BE 验收标准:

    • Alive: 必须全部为 true。
    • LastHeartbeat: 应该为当前时间(与 LastStartTime 相比,心跳一直在更新)。
    • TabletNum: 非零且数值较大(如 3499, 5432),这表明系统已经创建了内部分片,且数据正在三台机器间进行均衡(Rebalance)。
    • UsedPct: 磁盘占用率正常显示(如 13%~21%),无异常爆满或为 0 的情况。

    15. 附录 A:集群核心运维命令速查

    本章节汇总了 Apache Doris 日常运维中最常用的 Shell 脚本命令与 SQL 管理命令。

    15.1.服务启停管理 (Shell 脚本)

    以下命令需在 Linux 终端执行。路径以本次部署的 /data/doris402 为例,请根据实际情况调整。

    操作类型FE 节点 (Master/Follower)BE 节点 (Backend)
    前台启动 (调试用,关闭窗口即停止) /data/doris402/fe/bin/start_fe.sh /data/doris402/be/bin/start_be.sh
    后台启动 (生产标准启动方式) /data/doris402/fe/bin/start_fe.sh –daemon /data/doris402/be/bin/start_be.sh –daemon
    后台停止 (优雅关闭服务) /data/doris402/fe/bin/stop_fe.sh /data/doris402/be/bin/stop_be.sh
    强制停止 (进程卡死时使用) kill -9 <PID> kill -9 <PID>
    15.2. 集群运维管理 (SQL 命令)

    以下命令需登录 MySQL 客户端后执行。 登录命令:mysql -h <FE_IP> -P 9030 -uroot -p

    描述SQL 命令关键关注点
    查看 FE 状态 SHOW FRONTENDS; Alive 必须为 true;IsMaster 只能有一个 true。
    查看 BE 状态 SHOW BACKENDS; Alive 必须为 true;UsedPct 磁盘不应过高。
    查看 Broker SHOW BROKER; 如果配置了 Broker 节点用于 HDFS 导入,需检查此项。
    描述SQL 命令说明
    添加 FE (Follower) ALTER SYSTEM ADD FOLLOWER "IP:9010"; 用于增加参与选主的节点。
    添加 FE (Observer) ALTER SYSTEM ADD OBSERVER "IP:9010"; 仅同步元数据,不参与选主,用于扩展读取能力。
    下线 FE ALTER SYSTEM DROP FOLLOWER "IP:9010"; 删除 FE 节点。
    添加 BE ALTER SYSTEM ADD BACKEND "IP:9050"; 9050 为心跳端口。
    安全下线 BE ALTER SYSTEM DECOMMISSION BACKEND "IP:9050"; 推荐。会自动迁移数据后再下线,不丢数据。
    强制删除 BE ALTER SYSTEM DROP BACKEND "IP:9050"; 危险。直接剔除节点,仅在节点彻底损坏且无法恢复时使用。
    描述SQL 命令
    修改当前用户密码 SET PASSWORD = PASSWORD('new_password');
    修改特定用户密码 SET PASSWORD FOR 'root' = PASSWORD('123456');
    创建新用户 CREATE USER 'test_user'@'%' IDENTIFIED BY '123456';
    描述SQL 命令作用
    查看正在运行的查询 SHOW PROC '/current_queries'; 排查卡住的 SQL 或慢查询。
    查看建表语句 SHOW CREATE TABLE <表名>; 获取完整的建表 DDL,包含分区、分桶信息。
    查看分区详情 SHOW PARTITIONS FROM <表名>; 检查分区是否健康、版本号及数据量。
    查看表的数据量 SELECT COUNT(*) FROM <表名>; 统计行数。
    查看导入任务状态 SHOW LOAD ORDER BY CreateTime DESC LIMIT 10; 查看最近的 Stream Load 或 Broker Load 任务结果。

    16. 附录 B:常见启动报错排查:

    doris启动中的报错大概率都是前面的前置条件做错了和配置文件配置有误,可以参考之前2.x版本整理的常见报错清单(第五章):

    https://blog.csdn.net/LiHaoHang6/article/details/133091137?spm=1001.2014.3001.5502


    🎉 结论

    | **SQL 命令** |

    | ——————– | —————————————————– | | 修改当前用户密码 | SET PASSWORD = PASSWORD('new_password'); | | 修改特定用户密码 | SET PASSWORD FOR 'root' = PASSWORD('123456'); | | 创建新用户 | CREATE USER 'test_user'@'%' IDENTIFIED BY '123456'; |

    描述SQL 命令作用
    查看正在运行的查询 SHOW PROC '/current_queries'; 排查卡住的 SQL 或慢查询。
    查看建表语句 SHOW CREATE TABLE <表名>; 获取完整的建表 DDL,包含分区、分桶信息。
    查看分区详情 SHOW PARTITIONS FROM <表名>; 检查分区是否健康、版本号及数据量。
    查看表的数据量 SELECT COUNT(*) FROM <表名>; 统计行数。
    查看导入任务状态 SHOW LOAD ORDER BY CreateTime DESC LIMIT 10; 查看最近的 Stream Load 或 Broker Load 任务结果。

    16. 附录 B:常见启动报错排查:

    doris启动中的报错大概率都是前面的前置条件做错了和配置文件配置有误,可以参考之前2.x版本整理的常见报错清单(第五章):

    https://blog.csdn.net/LiHaoHang6/article/details/133091137?spm=1001.2014.3001.5502


    🎉 结论

    至此,Apache Doris 4.0.2(4.x版本通用) 高可用集群部署工作全部完成。 集群 FE 选主正常,BE 存储节点心跳健康,数据分片已自动开始均衡,具备正式接入业务数据的条件。

    赞(0)
    未经允许不得转载:171主机测评 » Apache Doris 4.x 生产环境部署文档
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址