一、环境信息
已部署三个FE、BE节点并且状态显示正常运行中


硬件信息

软件信息
系统镜像版本:Centos7.9-2009
Doris版本:apache-doris-3.0.3-bin-x64-noavx2.tar
JDK版本:jdk-17.0.10_linux-x64_bin
二、环境准备
由于此台新服务器磁盘为空,需先分区并挂载分区,为了与其他机器保持一致,所以采用一样的分区格式。
1、查看当前分区信息
输入lsblk

2、分区表转换
为了方便以后扩容磁盘空间,转换分区表为GPT分区,原因如下:
MBR:支持最大 2TB 的磁盘。如果硬盘超过 2TB,MBR 无法正确识别和管理超出的空间。
GPT:支持最大 9.4 ZB(zettabyte)的磁盘,远远超出了目前硬盘的容量限制。GPT 可以处理超过 2TB 的硬盘。
输入命令:
sudo parted --script /dev/vdc mklabel gpt
*注意:此命令会清空磁盘,请注意保存资料。且/dev/vdc需改成与实际一致
3、格式化磁盘分区为XFS格式
想不起是在哪里获取到的知识了,在大数据存储场景下,XFS要比EXT4格式更合适。
输入命令:
sudo mkfs.xfs -f /dev/vdc
*注意:这个命令的作用是,使用 XFS 文件系统格式化 /dev/vdc 磁盘或分区,并且通过 -f 选项强制执行格式化操作,即使设备上已有文件系统。这个操作会删除磁盘上所有现有的数据,因此需要小心使用。

4、挂载磁盘
1.创建挂载点
输入命令:
mkdir /data
2.挂载硬盘到指定路径
sudo mount /dev/vdc /data
此时磁盘已经应用到data文件夹,但此时只是临时性的,还需设置开机自动挂载,即可永久挂载。

4.设置开机自动挂载
输入命令:
sudo vi /etc/fstab
/dev/vdc /data xfs defaults 0 0
顺便把SWAP分区也注释了,因为在Doris下,swap分区会在内存溢出时导致数据库奔溃。
5.磁盘准备结束
接下来开始安装
三、上传安装包
1、上传安装包到服务器
我这里是上传到系统盘的/home路径下,将程序自身位置与数据存储分磁盘存储,会有利于FE、BE节点的运行效率。

2、安装JDK17.0.10
Doris的不同版本有自己推荐的JDK版本,建议安装官方推荐的版本,我这个版本是推荐JDK17.0.10
rpm -ivh jdk-17.0.10_linux-x64_bin.rpm

四、软硬件环境检查
如果是全新安装部署集群,建议按照如下步骤检查,我这里属于扩容,并且是政务云虚拟机环境,CPU不支持AVX2 指令集,所以我的安装包是noavx2。
1、CPU
当安装 Doris 时,建议选择支持 AVX2 指令集的机器,以利用 AVX2 的向量化能力实现查询向量化加速。
运行以下命令,有输出结果,及表示机器支持 AVX2 指令集。
cat /proc/cpuinfo | grep avx2
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xsaves arat pku ospke flush_l1d arch_capabilities如果机器不支持 AVX2 指令集,可以使用 no AVX2 的 Doris 安装包进行部署。
2、内存
Doris 没有强制的内存限制。一般在生产环境中,建议内存至少是 CPU 核数的 4 倍(例如,16 核机器至少配置 64G 内存)。在内存是 CPU 核数 8 倍时,会得到更好的性能。
3、存储
Doris 部署时数据可以存放在 SSD 或 HDD 硬盘或者对象存储中。
在以下几种场景中建议使用 SSD 作为数据存储:
大规模数据量下的高并发点查场景
大规模数据量下的高频数据更新场景
4、文件系统
ext4 和 xfs 文件系统均支持。
5、网卡
Doris 在进行计算过程涉及将数据分片分发到不同的实例上进行并行处理,会导致一定的网络资源开销。为了最大程度优化 Doris 性能并降低网络资源开销,强烈建议在部署时选用万兆网卡(10 Gigabit Ethernet,即 10GbE)或者更快网络。
五、操作系统检查
1、关闭 swap 分区
在部署 Doris 时,必须关闭 swap 分区。swap 分区是内核发现内存紧张时,会按照自己的策略将部分内存数据移动到配置的 swap 分区,由于内核策略不能充分了解应用的行为,会对数据库性能造成较大影响。
一般人是建议关闭,我的建议就是必须关闭,在生产环境中,任何一个BUG都可能会造成雪崩。
通过以下命令可以临时或者永久关闭。
永久关闭就是两个命令都执行一遍。
临时关闭,下次机器启动时,swap 还会被打开。
swapoff -a
永久关闭,使用 Linux root 账户,注释掉 /etc/fstab 中的 swap 分区,然后重启即可彻底关闭 swap 分区。
vi /etc/fstab

2、检测和关闭系统防火墙
如果发现端口不同,可以试着关闭防火墙,确认是否是本机防火墙造成。如果是防火墙造成,可以根据配置的 Doris 各组件端口打开相应的端口通信。
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service3、时间检查
为什么检查时间?
Doris 的元数据要求时间精度要小于 5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
可以输入date查看本机时间,人为判定一下其他机器的误差。
也可以输入timedatectl来查看本地时间和时区,是一个用于管理系统时间和时区的工具。

通常情况下,可以通过配置 NTP 服务保证各节点时钟同步。
sudo systemctl start ntpd.service
sudo systemctl enable ntpd.service4、设置系统最大打开文件句柄数
Doris 由于依赖大量文件来管理表数据,所以需要将系统对程序打开文件数的限制调高。
vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
*注意:当前用户需要退出当前 Session,并重新登录进入才能生效
5、修改虚拟内存区域数量
修改虚拟内存区域至少 2000000
sysctl -w vm.max_map_count=2000000
6、关闭透明大页
在部署 Doris 时,建议关闭透明大页。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag六、正式安装Doris
1、进入安装包目录并解压
cd /home
tar -zxvf apache-doris-3.0.3-bin-x64-noavx2.tar.gz
修改文件夹名称为apache-doris-3.0.3
2、安装java JDK
前面已经安装了,略过...
3、安装mysql客户端
略过...
安装mysql的原因是为了方便安装集群,因为有一些命令需要使用MySQL客户端执行,生成环境建议在集群外的机器上安装mysql。
4、部署 FE 节点
略过...
此教程为集群空间扩容,所以只需要部署BE节点即可。
完整版集群扩容教程,后续更新。
5、部署BE节点
修改BE 的配置文件与其它运行中BE节点配置文件一致。
文件在BE 部署路径下的 conf 目录中,启动 BE 节点前需要修改 conf/be.conf。

在这里直接贴出其它节点的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
LOG_DIR="${DORIS_HOME}/log/"
# For jdk 8
JAVA_OPTS="-Dfile.encoding=UTF-8 -Xmx32768m -DlogPath=$LOG_DIR/jni.log -Xloggc:$LOG_DIR/be.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Dsun.java.command=DorisBE -XX:-CriticalJNINatives"
# For jdk 17, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Xmx32768m -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:-CriticalJNINatives -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"
# Set your own JAVA_HOME
JAVA_HOME=/usr/java/jdk-17
# 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:15000,dirty_decay_ms:15000,oversize_threshold:0,prof:false,lg_prof_interval:32,lg_prof_sample:19,prof_gdump:false,prof_accum:false,prof_leak:false,prof_final:false"
JEMALLOC_PROF_PRFIX=""
# ports for admin, web, heartbeat service
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
arrow_flight_sql_port = -1
# 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 = 10.10.10.0/24;192.168.0.0/16
priority_networks = 10.0.12.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 = /home/disk1/doris;/home/disk2/doris;/home/disk2/doris
# 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/doris-storage
# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
jdbc_drivers_dir = ${DORIS_HOME}/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=0
## If you are not running in aws cloud, you can disable EC2 metadata
AWS_EC2_METADATA_DISABLED=true
6、创建BE数据目录
BE 进程应用于数据的计算与存储。数据目录默认放在 be/storage 下。
在生产环境中,通常使用独立的硬盘来存储数据,将 BE 数据与 BE 的部署文件置于不同的硬盘中。
BE 支持数据分布在多盘上以更好的利用多块硬盘的 I/O 能力。
1、创建 BE 数据存储目录(若有多块硬盘则需在每一块数据硬盘上都创建)
mkdir -p /data/doris-storage
2、 创建 FE 的元数据目录软连接
cd /home/apache-doris-3.0.3/be
ln -s /data/doris-storage storage
3、验证一下软链接是否创建好

7、注册 BE 节点
在启动新的 BE 节点前,需要先在 FE 集群中注册新的 BE 节点。
*先注册再启动
1.使用MySQL客户端,链接任一存活的 FE 节点
mysql -u root -h 192.168.1.101 -P 9030 -p
2.注册 BE 节点
## 在 MySQL 客户端 中执行 ALTER SYSTEM 语句
##命令格式ALTER SYSTEM ADD BACKEND "<new_be_ip_address>:<new_be_heartbeat_service_port>"
## be_heartbeat_service_port 可以从 be.conf 中查看,默认为 9050
ALTER SYSTEM ADD BACKEND "10.0.12.14:9050";
结果如下


8、启动BE节点
输入以下命令启动
/home/apache-doris-3.0.3/be/bin/start_be.sh --daemon
BE 进程启动进入后台执行。日志默认存放在 log/ 目录下。如启动失败,可以通过查看 log/be.log 或者 log/be.out 查看错误信息
停止命令为
/home/apache-doris-3.0.3/be/bin/stop_be.sh --daemon
9、查看 BE 启动状态
也可以通过 show backends 命令查看 BE 的状态。
通常情况下需要注意以下几项状态:
Alive 为 true 表示节点存活

10、查看同步状态
TabletNum 表示该节点上的分片数量,新加入的节点会进行数据均衡,TabletNum 逐渐趋于平均。
等待它自己同步即可。