Doris3.1.3存算一体6节点高可用集群
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 硬盘。 |
| BE | Doris 默认 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 | 内存 | 磁盘 | 网络 | 实例数量(最低要求) |
|---|---|---|---|---|---|
| Frontend | 8 核 + | 8 GB+ | SSD 或 SATA,10 GB+ | 1GbE/10GbE 网卡 | 1 |
| Backend | 8 核 + | 16 GB+ | SSD 或 SATA,50 GB+ | 1GbE/10GbE 网卡 | 1 |
- 生产环境
生产环境中建议 FE 与 BE 实例独立部署,遵循以下规则:
- 如果环境资源紧张,将 FE 与 BE 混部在一台服务器上,建议 FE 与 BE 数据放在不同的硬盘;
- BE 节点可以配置多块硬盘存储,在一个 BE 实例上绑定多块 HDD 或 SSD 盘。
服务器规格建议如下:
| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量(最低要求) |
|---|---|---|---|---|---|
| Frontend | 16 核 + | 64 GB+ | SSD,100GB+ | 10GbE 网卡 | 1 |
| Backend | 16 核 + | 64 GB+ | SSD 或 SATA,100GB+ | 10GbE 网卡 | 3 |
高可用规格建议如下:
| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量 |
|---|---|---|---|---|---|
| Frontend | 16 核 + | 64 GB+ | SSD,100GB+ | 10GbE 网卡 | 3 |
| Backend | 16 核 + | 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 | 角色 |
|---|---|---|
| fe01 | 192.168.2.11 | Frontend(Master) |
| fe02 | 192.168.2.12 | Frontend(Follower) |
| fe03 | 192.168.2.13 | Frontend(Follower) |
| be01 | 192.168.2.14 | Backend |
| be02 | 192.168.2.15 | Backend |
| be03 | 192.168.2.16 | Backend |
1.2.3 端口规划
Doris 的各个实例通过网络进行通信,其正常运行需要网络环境提供以下端口。管理员可以根据实际环境自行调整 Doris 的端口配置:
| 实例名称 | 端口名称 | 默认端口 | 通信方向 | 说明 |
|---|---|---|---|---|
| BE | be_port | 9060 | FE -> BE | BE 上 Thrift Server 的端口,用于接收来自 FE 的请求 |
| BE | webserver_port | 8040 | BE <-> BE | BE 上的 HTTP Server 端口 |
| BE | heartbeat_service_port | 9050 | FE -> BE | BE 上的心跳服务端口(Thrift),用于接收来自 FE 的心跳 |
| BE | brpc_port | 8060 | FE <-> BE,BE <-> BE | BE 上的 BRPC 端口,用于 BE 之间的通信 |
| FE | http_port | 8030 | FE <-> FE,Client <-> FE | FE 上的 HTTP Server 端口 |
| FE | rpc_port | 9020 | BE -> FE,FE <-> FE | FE 上的 Thrift Server 端口,每个 FE 的配置需保持一致 |
| FE | query_port | 9030 | Client <-> FE | FE 上的 MySQL Server 端口 |
| FE | edit_log_port | 9010 | FE <-> FE | FE 上的 bdbje 通信端口 |
1.2.4 资源规划
| 实例 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| FE | 32核 | 128G | 100G+ SSD |
| BE | 32核 | 128G | 10TB+ 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
Doris3.1.3存算一体6节点高可用集群
https://www.zyifei.top/archives/3ea06c77-b413-45b6-9144-04f76f74d659
评论