1 部署前准备

1.1 硬件环境检查

在硬件环境检查中,要对以下硬件条件进行检查:

检查项建议配置
CPU支持 AVX2 指令集。
内存建议至少 CPU 4 倍。
存储推荐 SSD 硬盘。
文件系统ext4 或 xfs 文件系统。
网卡10GbE 网卡。

1.1.1 CPU检查

当安装 Doris 时,建议选择支持 AVX2 指令集的机器,以利用 AVX2 的向量化能力实现查询向量化加速。

运行以下命令,有输出结果,及表示机器支持 AVX2 指令集。

cat /proc/cpuinfo | grep avx2

如果机器不支持 AVX2 指令集,可以使用 no AVX2 的 Doris 安装包进行部署。

1.1.2 内存检查

Doris 没有强制的内存限制。一般在生产环境中,可以根据以下建议选择内存大小:

组件推荐内存配置
FE建议至少 16GB 以上。
BE建议内存至少是 CPU 核数的 4 倍(例如,16 核机器至少配置 64G 内存)。在内存是 CPU 核数 8 倍时,会得到更好的性能。

1.1.3 存储检查

Doris 支持将数据存储在 SSD、HDD 或对象存储中。

在以下几种场景中建议使用 SSD 作为数据存储:

  • 大规模数据量下的高并发点查场景
  • 大规模数据量下的高频数据更新场景

在 Doris 集群中,FE 主要用于元数据存储,包括元数据 edit log 和 image。BE 的磁盘空间主要用于存放数据,需要根据业务需求计算。

组件磁盘空间说明
FE建议预留 100GB 以上的存储空间,使用 SSD 硬盘。
BEDoris 默认 LZ4 压缩方式进行存储,压缩比在 0.3 - 0.5 左右磁盘空间需要按照总数据量 * 3(3 副本)计算需要预留出 40% 空间用作后台 compaction 以及临时数据的存储

1.1.4 文件系统检查

Doris 推荐使用 EXT4 或 XFS 文件系统:

  • EXT4 文件系统:具有良好的稳定性、性能和较低的碎片化问题。
  • XFS 文件系统:在处理大规模数据和高并发写操作时表现优越,适合高吞吐量应用。

1.1.5 网卡检查

Doris 的计算过程涉及数据分片和并行处理,可能产生网络资源开销。为了最大程度优化 Doris 性能并降低网络资源开销,强烈建议在部署时选用万兆网卡(10 Gigabit Ethernet,即 10GbE)或者更快网络。如果有多块网卡,建议使用链路聚合方式将多块网卡绑定成一块网卡,提高网络带宽、冗余性和复杂均衡的能力。

1.1.6 服务器建议配置

Doris 支持运行和部署在 x86-64 架构的服务器平台或 ARM64 架构的服务器上。

  • 开发及测试环境

开发与测试环境中可以混合部署 FE 与 BE 实例,遵循以下规则:

  • 验证测试环境中可以在一台服务器上混合部署一个 FE 与 BE,但不建议部署多个 FE 与 BE 实例;
  • 如果需要 3 副本数据,至少需要 3 台服各部署一个 BE 实例。

服务器规格建议如下:

模块CPU内存磁盘网络实例数量(最低要求)
Frontend8 核 +8 GB+SSD 或 SATA,10 GB+1GbE/10GbE 网卡1
Backend8 核 +16 GB+SSD 或 SATA,50 GB+1GbE/10GbE 网卡1
  • 生产环境

生产环境中建议 FE 与 BE 实例独立部署,遵循以下规则:

  • 如果环境资源紧张,将 FE 与 BE 混部在一台服务器上,建议 FE 与 BE 数据放在不同的硬盘;
  • BE 节点可以配置多块硬盘存储,在一个 BE 实例上绑定多块 HDD 或 SSD 盘。

服务器规格建议如下:

模块CPU内存磁盘网络实例数量(最低要求)
Frontend16 核 +64 GB+SSD,100GB+10GbE 网卡1
Backend16 核 +64 GB+SSD 或 SATA,100GB+10GbE 网卡3

高可用规格建议如下:

模块CPU内存磁盘网络实例数量
Frontend16 核 +64 GB+SSD,100GB+10GbE 网卡3
Backend16 核 +64 GB+SSD 或 SATA,100GB+10GbE 网卡3

1.2 集群规划

1.2.1 架构规划

在部署 Doris 时,可以根据业务选择存算一体或存算分离架构:

  • 存算一体:存算一体架构部署简单,性能优异,不依赖与外部的共享存储设备,适合不需要极致弹性扩缩容的业务场景;
  • 存算分离:存算分离架构依赖于共享存储,实现了计算资源的弹性伸缩,适合需要动态调整计算资源的业务场景。

本次使用存算一体架构进行部署。

1.2.2 节点规划

FE 节点数量

FE 节点主要负责用户请求的接入、查询解析规划、元数据管理及节点管理等工作。

对于生产集群,一般建议部署至少 3 个节点的 FE 以实现高可用环境。FE 节点分为以下两种角色:

  • Follower 节点:参与选举操作,当 Master 节点宕机时,会选择一个可用的 Follower 节点成为新的 Master。
  • Observer 节点:仅从 Leader 节点同步元数据,不参与选举,可用于横向扩展以提升元数据的读服务能力。

通常情况下,建议部署至少 3 个 Follower 节点。在高并发的场景中,可以通过增加 Observer 节点的数量来提高集群的连接数。

BE 节点数量

BE 节点负责数据的存储与计算。在生产环境中,为了数据的可靠性和容错性,通常会使用 3 副本存储数据,因此建议部署至少 3 个 BE 节点。

BE 节点支持横向扩容,通过增加 BE 节点的数量,可以有效提升查询的性能和并发处理能力。

本次部署规划如下:

主机名称主机IP角色
fe01192.168.2.11Frontend(Master)
fe02192.168.2.12Frontend(Follower)
fe03192.168.2.13Frontend(Follower)
be01192.168.2.14Backend
be02192.168.2.15Backend
be03192.168.2.16Backend

1.2.3 端口规划

Doris 的各个实例通过网络进行通信,其正常运行需要网络环境提供以下端口。管理员可以根据实际环境自行调整 Doris 的端口配置:

实例名称端口名称默认端口通信方向说明
BEbe_port9060FE -> BEBE 上 Thrift Server 的端口,用于接收来自 FE 的请求
BEwebserver_port8040BE <-> BEBE 上的 HTTP Server 端口
BEheartbeat_service_port9050FE -> BEBE 上的心跳服务端口(Thrift),用于接收来自 FE 的心跳
BEbrpc_port8060FE <-> BE,BE <-> BEBE 上的 BRPC 端口,用于 BE 之间的通信
FEhttp_port8030FE <-> FE,Client <-> FEFE 上的 HTTP Server 端口
FErpc_port9020BE -> FE,FE <-> FEFE 上的 Thrift Server 端口,每个 FE 的配置需保持一致
FEquery_port9030Client <-> FEFE 上的 MySQL Server 端口
FEedit_log_port9010FE <-> FEFE 上的 bdbje 通信端口

1.2.4 资源规划

实例CPU内存磁盘
FE32核128G100G+ SSD
BE32核128G10TB+ HDD

1.3 操作系统配置

在部署 Doris 时,需要对以下操作系统项进行检查:

  • 确保关闭 swap 分区
  • 确保系统关闭透明大页
  • 确保系统有足够大的虚拟内存区域
  • 确保 CPU 不使用省电模式
  • 确保网络连接溢出时自动重置新连接
  • 确保 Doris 相关端口畅通或关闭系统防火墙
  • 确保系统有足够大的打开文件句柄数
  • 确定部署集群机器安装 NTP 服务

1.3.1 关闭SWAP分区

在部署 Doris 时,建议关闭 swap 分区。swap 分区是内核发现内存紧张时,会按照自己的策略将部分内存数据移动到配置的 swap 分区,由于内核策略不能充分了解应用的行为,会对 Doris 性能造成较大影响,所以建议关闭。通过以下命令可以临时或者永久关闭。

临时关闭,下次机器启动时,swap 还会被打开。

swapoff -a

永久关闭,使用 Linux root 账户,注释掉/etc/fstab中的 swap 分区,重启即可彻底关闭 swap 分区。

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.3.2 关闭系统透明大页

在高负载低延迟的场景中,建议关闭操作系统透明大页(Transparent Huge Pages, THP),避免其带来的性能波动和内存碎片问题,确保 Doris 能够稳定高效地使用内存。

使用以下命令临时关闭透明大页:

echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag

如果需要永久关闭透明大页,可以使用以下命令,在下一次宿主机重启后生效:

cat >> /etc/rc.d/rc.local << EOF
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local

1.3.3 增加虚拟内存区域

为了保证 Doris 有足够的内存映射区域来处理大量数据,需要修改 VMA(虚拟内存区域)。如果没有足够的内存映射区域,Doris 在启动或运行时可能会遇到 Too many open files 或类似的错误。

通过以下命令可以永久修改虚拟内存区域至少为 2000000,并立即生效:

cat >> /etc/sysctl.conf << EOF
vm.max_map_count = 2000000
EOF

# 使用配置生效
sysctl -p

1.3.4 禁用CPU省电模式

在部署 Doris 时检修关闭 CPU 的省电模式,以确保 Doris 在高负载时提供稳定的高性能,避免由于 CPU 频率降低导致的性能波动、响应延迟和系统瓶颈,提高 Doris 的可靠性和吞吐量。如果您的 CPU 不支持 Scaling Governor,可以跳过此项配置。

通过以下命令可以关闭 CPU 省电模式:

echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

1.3.5 网络连接溢出时自动重置新连接

在部署 Doris 时,需要确保在 TCP 连接的发送缓冲区溢出时,连接会被立即中断,以防止 Doris 在高负载或高并发情况下出现缓冲区阻塞,避免连接被长时间挂起,从而提高系统的响应性和稳定性。

通过以下命令可以永久设置系统自动重置新链接,并立即生效:

cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_abort_on_overflow=1
EOF

# 使配置生效
sysctl -p

1.3.6 增加系统最大文件句柄数

Doris 由于依赖大量文件来管理表数据,所以需要将系统对程序打开文件数的限制调高。

通过以下命令可以调整最大文件句柄数。在调整后,需要重启会话以生效配置:

vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000

# 退出会话重新登录查看是否生效

ulimit -a

1.3.7 配置时间同步

Doris 的元数据要求时间精度要小于 5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。

本文以fe01、fe02作为NTP服务端

fe01节点:

vim /etc/chrony.conf

server ntp.aliyun.com iburst

allow 192.168.2.0/24

local stratum 10

# 重启

systemctl restart chronyd && systemctl enable chronyd

fe02节点:

vim /etc/chrony.conf

server ntp.aliyun.com iburst

server fe01 iburst

allow 192.168.2.0/24

local stratum 11

# 重启

systemctl restart chronyd && systemctl enable chronyd

其它节点:

vim /etc/chrony.conf

server fe01 iburst

server fe02 iburst

# 重启

systemctl restart chronyd && systemctl enable chronyd

检查验证:

chronyc sources -v

1.3.8 关闭防火墙(根据要求配置)

systemctl stop firewalld && systemctl disable firewalld

1.3.9 关闭SELinux(可选)

# 临时关闭

setenforce 0

# 永久关闭

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2 集群部署

2.1 安装JDK

Doris 的所有进程都依赖 Java。

  • 在 2.1(含)版本之前,请使用 Java 8,推荐版本:jdk-8u352 之后版本。
  • 从 3.0(含)版本之后,请使用 Java 17,推荐版本:jdk-17.0.10 之后版本。

所有节点安装JDK:

tar zxf jdk-17.0.12_linux-x64_bin.tar.gz -C /opt/

配置环境变量:

vim /etc/profile

export JAVA_HOME=/opt/jdk-17.0.12

export PATH=$PATH:$JAVA_HOME/bin

# 加载配置

source /etc/profile

2.2 部署FE集群

2.2.1 解压Doris安装包

# 在fe01、fe02、fe03节点执行

tar zxf apache-doris-3.1.3-bin-x64.tar.gz -C /opt/

cd /opt

ln -s apache-doris-3.1.3-bin /opt/doris

2.2.2 存储配置

将100G SSD挂载到/data目录下,创建目录和软连接:

mkdir -p /data/doris/{doris-meta,log}

ln -s /data/doris/doris-meta /opt/doris/fe/doris-meta

ln -s /data/doris/log /opt/doris/fe/log

2.2.3 修改fe.conf配置文件

vim /opt/doris/fe/conf/fe.conf

# 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 -Xmx126976m
-Xms126976m -XX:+UseG1GC -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"

# 大小写不敏感
lower_case_table_names = 1

# 集群所在网段,根据网络CIDR地址指定。在FQDN环境中可以忽略
priority_networks = 192.168.2.0/24

# Java安装目录
JAVA_HOME = /opt/jdk-17.0.12

# 是否开启FQDN

# enable_fqdn_mode = true

2.2.4 启动FE进程

在fe01节点启动FE Master

cd /opt/doris/fe

bin/start_fe.sh --daemon

检查状态:

通过 MySQL 客户端连接 Doris 集群,初始化用户为root,默认密码为空。

mysql -uroot -P 9030 -h192.168.2.11

# 查询FE

show frontends

确认以下几项:

  • Alive 为true表示节点存活;
  • Join 为true表示节点加入到集群中,但不代表当前还在集群内(可能已失联);
  • IsMaster 为 true 表示当前节点为 Master 节点。

2.2.5 注册新的FE Follower

在fe01节点执行:

在启动新的 FE 节点前,需要先在 FE 集群中注册新的 FE 节点。

# 登录
mysql -uroot -P9030 -h192.168.2.11
# 注册新FE节点
ALTER SYSTEM ADD FOLLOWER "192.168.2.12:9010";

ALTER SYSTEM ADD FOLLOWER "192.168.2.13:9010";

# 注册FE observer节点命令
# ALTER SYSTEM ADD OBSERVER "<ip>:9010";

2.2.6 启动FE Follower

分别在fe02、fe03执行:

通过以下命令,可以启动 FE Follower 节点,并自动同步元数据。

bin/start_fe.sh --helper 192.168.2.11:9010 --daemon

--helper参数仅在第一次启动 FE 时需要,之后重启无需指定。它的值是FE 集群中任何存活节点的 IP 地址。

检查状态:参考2.2.4步骤

2.3 部署BE集群

2.3.1 解压Doris安装包

# 在be01、be02、be03节点执行

tar zxf apache-doris-3.1.3-bin-x64.tar.gz -C /opt/

cd /opt

ln -s apache-doris-3.1.3-bin /opt/doris

2.3.2 存储配置

将10TB HDD挂载到/data目录下,创建目录和软连接:

mkdir -p /data/doris/{storage,log}

ln -s /data/doris/storage /opt/doris/fe/storage

ln -s /data/doris/log /opt/doris/fe/log

2.3.3 修改be.conf配置文件

vim /opt/doris/be/conf/be.conf

#modify network CIDR
priority_networks = 192.168.2.0/24

# modify Java Home in be/conf/be.conf
JAVA_HOME = /opt/jdk-17.0.12

# BE进程占用服务器内存百分比(默认90%)

mem_limit=80%

2.3.4 在FE集群注册BE节点

# fe节点登录

mysql -uroot -P9030 -h192.168.2.11

# 在 Doris FE集群中注册 BE 节点

ALTER SYSTEM ADD BACKEND "192.168.2.14:9050";

ALTER SYSTEM ADD BACKEND "192.168.2.15:9050";

ALTER SYSTEM ADD BACKEND "192.168.2.16:9050";

# 启动BE节点【be01、be02、be03】

/opt/doris/be/bin/start_be.sh --daemon

# 查看集群加入状态

show backends;

注意以下几项状态:

- Alive 为 true 表示节点存活

- TabletNum 表示该节点上的分片数量,新加入的节点会进行数据均衡,TabletNum 逐渐趋于平均。

2.4 验证集群状态并修改密码

2.4.1 验证集群状态

为了验证集群的正确性,可以在新创建的集群中创建一个测试表,并插入测试数据。

-- create a test database
create database testdb;

-- create a test table
CREATE TABLE testdb.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
k3 VARCHAR(10) COMMENT "string column",
k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 32;

-- insert data
INSERT INTO testdb.table_hash VALUES
(1, 10.1, 'AAA', 10),
(2, 10.2, 'BBB', 20),
(3, 10.3, 'CCC', 30),
(4, 10.4, 'DDD', 40),
(5, 10.5, 'EEE', 50);

-- check the data
SELECT * from testdb.table_hash;
+----+-------+----+----+
| k1 | k2    | k3 | k4 |
+----+-------+----+----+
| 3  | 10.30 | CCC| 30 |
| 4  | 10.40 | DDD| 40 |
| 5  | 10.50 | EEE| 50 |
| 1  | 10.10 | AAA| 10 |
| 2  | 10.20 | BBB| 20 |
+----+-------+----+----+

2.4.2 验证集群高可用性

# 找到FE Master节点

show frontends;

# 在Master节点执行

fe/bin/stop_fe.sh

# 其它FE节点查看状态

show frontends;

验证以下内容:

- 原 Master 节点的Alive变为 false

- 另一个 Follower 节点的IsMaster变为true

- 集群仍可正常读写

2.4.3 修改密码

# 修改root/admin用户密码

SET PASSWORD FOR 'root' = PASSWORD('your password');

SET PASSWORD FOR 'admin' = PASSWORD('your password');

3 配置开机自启

3.1 创建doris-fe.service服务文件

cat > /etc/systemd/system/doris-fe.service << EOF
[Unit]
Description=Doris FE Service
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
User=root
Group=root
LimitCORE=infinity
LimitNOFILE=200000
Restart=on-failure
RestartSec=30
StartLimitInterval=120
StartLimitBurst=3
KillMode=mixed
Environment="JAVA_HOME=/opt/jdk-17.0.12"
WorkingDirectory=/opt/doris/fe
PIDFile=/opt/doris/fe/bin/fe.pid
ExecStart=/opt/doris/fe/bin/start_fe.sh --daemon
ExecStop=/opt/doris/fe/bin/stop_fe.sh

[Install]
WantedBy=multi-user.target
EOF

3.2 创建doris-be.service服务文件

cat > /etc/systemd/system/doris-be.service << EOF
[Unit]
Description=Doris BE Service
After=network-online.target doris-fe.service
Wants=network-online.target doris-fe.service

[Service]
Type=forking
User=root
Group=root
LimitCORE=infinity
LimitNOFILE=200000
Restart=on-failure
RestartSec=30
StartLimitInterval=120
StartLimitBurst=3
KillMode=mixed
Environment="JAVA_HOME=/opt/jdk-17.0.12"
WorkingDirectory=/opt/doris/be
PIDFile=/opt/doris/be/bin/be.pid
ExecStart=/opt/doris/be/bin/start_be.sh --daemon
ExecStop=/opt/doris/be/bin/stop_be.sh

[Install]
WantedBy=multi-user.target
EOF

3.3 设置开机自启

如果集群已经使用脚本启动需要先停止,再使用systemctl命令启动。

# FE节点
systemctl enable doris-fe && systemctl start doris-fe

# BE节点
systemctl enable doris-be && systemctl start doris-be