https://doris.apache.org/zh-CN/docs/dev/install/preparation/env-checking https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.1.4-bin-x64.tar.gz 内存为CPU4倍,CPU 8核 ,内存16G cat /proc/cpuinfo | grep avx2 如果机器不支持 AVX2 指令集,可以使用 no AVX2 的 Doris 安装包进行部署。 - Doris 推荐使用 EXT4 或 XFS 文件系统: - EXT4 文件系统:具有良好的稳定性、性能和较低的碎片化问题。 - XFS 文件系统:在处理大规模数据和高并发写操作时表现优越,适合高吞吐量应用。 - 网卡检查 - Doris 的计算过程涉及数据分片和并行处理, - 强烈建议在部署时选用万兆网卡(10 Gigabit Ethernet,即 10GbE)或者更快网络。 - 如果有多块网卡,建议使用链路聚合方式将多块网卡绑定成一块网卡,提高网络带宽、冗余性和复杂均衡的能力。 - 磁盘空间说明 - FE(Frontend) 建议预留 100GB 以上的存储空间,使用 SSD 硬盘。 - BE(Backend) Doris 默认 LZ4 压缩方式进行存储,压缩比在 0.3 - 0.5 左右磁盘空间需要按照总数据量 * 3(3 副本)计算需要预留出 40% 空间用作后台 compaction 以及临时数据的存储 - Java 环境检查 - Doris 的所有进程都依赖 Java。 - 在 2.1(含)版本之前,请使用 Java 8,推荐版本:jdk-8u352 之后版本。 - 从 3.0(含)版本之后,请使用 Java 17,推荐版本:jdk-17.0.10 之后版本。
- 安全设计
- 增加数据加密与访问控制机制
- 在Doris数仓中,启用传输加密(TLS/SSL)和静态加密(如透明数据加密TDE),尤其是当数据涉及敏感信息时。
- 添加审计日志与合规性跟踪
- 在Doris中开启详细审计日志,记录所有SQL查询、数据访问和用户操作,以满足金融监管要求。
- 在数据ETL过程中,增加数据脱敏或匿名化处理,特别是在开发测试环境中使用生产数据时。
|
|
架构规划 https://doris.apache.org/zh-CN/docs/dev/install/preparation/cluster-planning - 在部署 Doris 时,可以根据业务选择存算一体或存算分离架构: - 存算一体:存算一体架构部署简单,性能优异,不依赖与外部的共享存储设备,适合不需要极致弹性扩缩容的业务场景; - 本地盘 - 存算分离:存算分离架构依赖于共享存储,实现了计算资源的弹性伸缩,适合需要动态调整计算资源的业务场景。 - 共享存储 端口规划
节点数量规划 - FE 节点数量 - FE 节点主要负责用户请求的接入、查询解析规划、元数据管理及节点管理等工作。 - 对于生产集群,一般建议部署至少 3 个节点的 FE 以实现高可用环境。FE 节点分为以下两种角色: - Follower 节点:参与选举操作,当 Master 节点宕机时,会选择一个可用的 Follower 节点成为新的 Master。 - Observer 节点:仅从 Leader 节点同步元数据,不参与选举,可用于横向扩展以提升元数据的读服务能力。 - 通常情况下,建议部署至少 3 个 Follower 节点。在高并发的场景中,可以通过增加 Observer 节点的数量来提高集群的连接数。 - BE 节点数量 - BE 节点负责数据的存储与计算。在生产环境中,为了数据的可靠性和容错性,通常会使用 3 副本存储数据,因此建议部署至少 3 个 BE 节点。 - BE 节点支持横向扩容,通过增加 BE 节点的数量,可以有效提升查询的性能和并发处理能力。 |
|
在部署 Doris 时,需要对以下操作系统项进行检查: - 确保关闭 swap 分区 - 确保系统关闭透明大页 - 确保系统有足够大的虚拟内存区域 - 确保 CPU 不使用省电模式 - 确保网络连接溢出时自动重置新连接 - 确保 Doris 相关端口畅通或关闭系统防火墙 - 确保系统有足够大的打开文件句柄数 - 确定部署集群机器安装 NTP 服务 关闭 swap 分区 在部署 Doris 时,建议关闭 swap 分区。swap 分区是内核发现内存紧张时,会按照自己的策略将部分内存数据移动到配置的 swap 分区,由于内核策略不能充分了解应用的行为,会对 Doris 性能造成较大影响。所以建议关闭。 通过以下命令可以临时或者永久关闭。 临时关闭,下次机器启动时,swap 还会被打开。 swapoff -a 永久关闭,使用 Linux root 账户,注释掉 /etc/fstab 中的 swap 分区,重启即可彻底关闭 swap 分区。 ``` # /etc/fstab # file system dir type options dump pass tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sda1 / ext4 defaults,noatime 0 1 # /dev/sda2 none swap defaults 0 0 /dev/sda3 /home ext4 defaults,noatime 0 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 ``` 增加虚拟内存区域 为了保证 Doris 有足够的内存映射区域来处理大量数据,需要修改 VMA(虚拟内存区域)。如果没有足够的内存映射区域,Doris 在启动或运行时可能会遇到 Too many open files 或类似的错误。 通过以下命令可以永久修改虚拟内存区域至少为 2000000,并立即生效: ``` cat >> /etc/sysctl.conf << EOF vm.max_map_count = 2000000 EOF # Take effect immediately sysctl -p ``` 禁用 CPU 省电模式 在部署 Doris 时检修关闭 CPU 的省电模式,以确保 Doris 在高负载时提供稳定的高性能,避免由于 CPU 频率降低导致的性能波动、响应延迟和系统瓶颈,提高 Doris 的可靠性和吞吐量。如果您的 CPU 不支持 Scaling Governor,可以跳过此项配置。 通过以下命令可以关闭 CPU 省电模式: ``` echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ``` 网络连接溢出时自动重置新连接
在部署 Doris 时,需要确保在 TCP 连接的发送缓冲区溢出时,连接会被立即中断,以防止 Doris 在高负载或高并发情况下出现缓冲区阻塞,避免连接被长时间挂起,从而提高系统的响应性和稳定性。
通过以下命令可以永久设置系统自动重置新链接,并立即生效:
```
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_abort_on_overflow=1
EOF
# Take effect immediately
sysctl -p
```
相关端口畅通 如果发现端口不通,可以试着关闭防火墙,确认是否是本机防火墙造成。如果是防火墙造成,可以根据配置的 Doris 各组件端口打开相应的端口通信。 ``` sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service ``` 增加系统的最大文件句柄数 Doris 由于依赖大量文件来管理表数据,所以需要将系统对程序打开文件数的限制调高。 通过以下命令可以调整最大文件句柄数。在调整后,需要重启会话以生效配置: ``` vi /etc/security/limits.conf * soft nofile 1000000 * hard nofile 1000000 ``` 安装并配置 NTP 服务 Doris 的元数据要求时间精度要小于 5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。 通常情况下,可以通过配置 NTP 服务保证各节点时钟同步。 ``` sudo systemctl start_ntpd.service sudo systemctl enable_ntpd.service ``` |
sudo adduser doris docker load -i ubuntu18_v1.tar docker network rm mydk docker network create --subnet=192.168.73.0/24 mydk docker run -itd --privileged --name ds1 -h ds1 --net mydk --ip 192.168.73.11 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker run -itd --privileged --name ds2 -h ds2 --net mydk --ip 192.168.73.12 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker run -itd --privileged --name ds3 -h ds3 --net mydk --ip 192.168.73.13 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker run -itd --privileged --name ds4 -h ds4 --net mydk --ip 192.168.73.14 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker run -itd --privileged --name ds5 -h ds5 --net mydk --ip 192.168.73.15 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker run -itd --privileged --name ds6 -h ds6 --net mydk --ip 192.168.73.16 -v /opt:/opt -v /wks:/wks -v /tmp:/tmp -v /data:/data -v /media:/media -v /mnt:/mnt ubuntu18:1.0 bash docker start ds1 docker start ds2 docker start ds3 docker start ds4 docker start ds5 docker start ds6 alias ds1="sudo docker exec -it ds1 bash" alias ds2="sudo docker exec -it ds2 bash" alias ds3="sudo docker exec -it ds3 bash" alias ds4="sudo docker exec -it ds4 bash" alias ds5="sudo docker exec -it ds5 bash" alias ds6="sudo docker exec -it ds6 bash" docker stop ds1 docker stop ds2 docker stop ds3 docker stop ds4 docker stop ds5 docker stop ds6 docker rm ds1 docker rm ds2 docker rm ds3 docker rm ds4 docker rm ds5 docker rm ds6 sudo apt install openssh-serversudo service ssh status sudo service ssh status sudo service ssh restart docker exec -it ds1 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds2 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds3 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds4 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds5 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds6 bash /mnt/g/wks/gowks/src/cmd/doris/ssh_restart.sh & docker exec -it ds2 bash /mnt/g/wks/gowks/src/cmd/doris/adduser.sh -u doris -p rootroot & docker exec -it ds3 bash /mnt/g/wks/gowks/src/cmd/doris/adduser.sh -u doris -p rootroot & docker exec -it ds4 bash /mnt/g/wks/gowks/src/cmd/doris/adduser.sh -u doris -p rootroot & docker exec -it ds5 bash /mnt/g/wks/gowks/src/cmd/doris/adduser.sh -u doris -p rootroot & docker exec -it ds6 bash /mnt/g/wks/gowks/src/cmd/doris/adduser.sh -u doris -p rootroot & docker exec -it ds1 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh docker exec -it ds2 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh & docker exec -it ds3 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh & docker exec -it ds4 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh & docker exec -it ds5 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh & docker exec -it ds6 bash /mnt/g/wks/gowks/src/cmd/doris/addsudo.sh & 系统检查需要root权限 sudo apt update sudo apt install ntp # 直接启动 ntpd 服务 ntpd -d -n sudo systemctl restart ntp sudo systemctl disable systemd-timesyncd sudo systemctl stop systemd-timesyncd timedatectl status # 安装 ntpdate apt update apt install ntpdate # 手动同步时间 ntpdate pool.ntp.org |
|
开发及测试环境
Doris 支持运行和部署在 x86-64 架构的服务器平台或 ARM64 架构的服务器上。
开发与测试环境中可以混合部署 FE 与 BE 实例,遵循以下规则:
验证测试环境中可以在一台服务器上混合部署一个 FE 与 BE,但不建议部署多个 FE 与 BE 实例;
如果需要 3 副本数据,至少需要 3 台服各部署一个 BE 实例。
服务器规格建议如下:
生产环境 生产环境中建议 FE 与 BE 实例独立部署,遵循以下规则: 如果环境资源紧张,将 FE 与 BE 混部在一台服务器上,建议 FE 与 BE 数据放在不同的硬盘; BE 节点可以配置多块硬盘存储,在一个 BE 实例上绑定多块 HDD 或 SSD 盘。 服务器规格建议如下:
|
|
四步 https://doris.apache.org/zh-CN/docs/dev/install/deploy-manually/integrated-storage-compute-deploy-manually - 部署 FE Master 节点:部署第一个 FE 节点作为 Master 节点; - 部署 FE 集群:部署 FE 集群,添加 Follower 或 Observer FE 节点; - 部署 BE 节点:向 FE 集群中注册 BE 节点; - 验证集群正确性:部署完成后连接并验证集群正确性。
root@ds1:/opt# mkdir -p doris/fe1 root@ds1:/opt# chown -R doris doris/ root@ds1:/opt# su - doris doris@ds1:~$ cd /opt/doris/fe1/ doris@ds1:/opt/doris/fe1$ rsync -rltDv /mnt/d/tmp/apache-doris-3.1.4-bin-x64.tar.gz ./ |
|
创建元数据路径 在部署 FE 时,建议与 BE 节点数据存储在不同的硬盘上。 在解压安装包时,会默认附带 doris-meta 目录, 建议为元数据创建独立目录,并将其软连接到默认的 doris-meta 目录。 生产环境应使用单独的 SSD 硬盘,不建议将其放在 Doris 安装目录下; 开发和测试环境可以使用默认配置。 ``` ## Use a separate disk for FE metadata mkdir -p doris_meta_created ## Create FE metadata directory symlink ln -s doris_meta_created doris_meta_original ``` 修改 FE 配置文件 FE 的配置文件在 FE 部署路径下的 conf 目录中,启动 FE 节点前需要修改 conf/fe.conf。 在部署 FE 节点之前,建议调整以下配置: ``` ## modify Java Heap JAVA_OPTS="-Xmx16384m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE" ## modify case sensitivity lower_case_table_names = 1 ## modify network CIDR priority_networks = 10.1.3.0/24 ## modify Java Home JAVA_HOME = your-java-home-path ``` - JAVA_OPTS 指定参数 -Xmx 调整 Java Heap,生产环境建议 16G 以上。 - lower_case_table_names 设置大小写敏感,建议调整为 1,即大小写不敏感。 - priority_networks 网络 CIDR,更具网络 IP 地址指定。在 FQDN 环境中可以忽略。 - JAVA_HOME 建议 Doris 使用独立于操作系统的 JDK 环境。 启动 FE 进程 bin/start_fe.sh --daemon FE 进程将在后台启动,日志默认保存在 log/ 目录。 如果启动失败,可通过查看 log/fe.log 或 log/fe.out 文件获取错误信息。 检查 FE 启动状态 通过 MySQL 客户端连接 Doris 集群,初始化用户为 root,默认密码为空。 ``` mysql -uroot -Pfe_query_port -hfe_ip_address ``` - 链接到 Doris 集群后,可以通过 show frontends 命令查看 FE 的状态,通常要确认以下几项 - Alive 为 true 表示节点存活; - Join 为 true 表示节点加入到集群中,但不代表当前还在集群内(可能已失联); - IsMaster 为 true 表示当前节点为 Master 节点。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
## 环境变量配置
```
export JAVA_HOME=/opt/app/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=/opt/app/mysql/bin:$PATH
```
## 软件迁移
- 压缩传送到远程
```
sudo tar -zcvf app.tar.gz app/
rsync -e 'ssh -p27434' -avP /opt/app.tar.gz root@px1-jcy.matpool.com:/opt/
```
- rsync这个命令要求互传的两个服务器上都有安装 ,远程没有也是无法使用的
- 远程解压并配置环境变量
. ./.bashrc
```
(myconda) root@PleAgQ:~# cd /opt/app/doris/
(myconda) root@PleAgQ:/opt/app/doris# ls
be extensions hs_err_pid3845619.log ms stop_doris.sh
check_doris.sh fe kill_doris.sh start_doris.sh tools
(myconda) root@PleAgQ:/opt/app/doris# free -g
total used free shared buff/cache available
Mem: 8 0 0 0 7 7
Swap: 0 0 0
(myconda) root@PleAgQ:/opt/app/doris# ./start_doris.sh
```
## 配置修改
/opt/app/doris/fe/conf# vim fe.conf
```
# Set your own JAVA_HOME
JAVA_HOME=/opt/app/jdk-17
priority_networks=172.17.0.0/24
```
```
(myconda) root@PleAgQ:/opt/app/doris/fe/conf# which java
/opt/app/jdk-17/bin/java
(myconda) root@PleAgQ:/opt/app/doris/fe/conf# which mysql
/opt/app/mysql/bin/mysql
```
执行脚本修改系统配置
|
|
```
#!/bin/bash
###############################################################################
# Apache Doris OS 检查和配置脚本
# 功能:
# 1. 检查系统是否满足 Doris 安装的 OS 要求
# 2. 如果不满足,自动进行配置
# 3. 配置后立即执行相关命令使其生效
# 使用方法:
# sudo bash doris_os_check_and_setting.sh
###############################################################################
# 颜色输出定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_section() {
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}========================================${NC}"
}
# 检查是否为 root 用户
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本需要 root 权限运行"
log_info "请使用: sudo bash $0"
exit 1
fi
}
###############################################################################
# 1. 检查和关闭 swap 分区
###############################################################################
check_and_disable_swap() {
log_section "检查 Swap 分区"
# 检查 swap 是否启用
swap_total=$(free | grep Swap | awk '{print $2}')
log_info "当前 Swap 总大小: ${swap_total} KB"
if [ "$swap_total" -eq 0 ]; then
log_info "✓ Swap 分区已经关闭"
return 0
fi
log_warn "Swap 分区当前启用,建议关闭"
# 临时关闭 swap
log_info "执行: swapoff -a"
swapoff -a
if [ $? -eq 0 ]; then
log_info "✓ Swap 分区临时关闭成功"
# 永久关闭:注释 /etc/fstab 中的 swap 行
log_info "正在配置永久关闭 Swap..."
if grep -q "^.*swap.*swap" /etc/fstab; then
# 备份 fstab
cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d_%H%M%S)
# 注释 swap 行
sed -i '/^.*swap.*swap/s/^/#/' /etc/fstab
log_info "✓ 已注释 /etc/fstab 中的 swap 分区配置"
log_info "备份文件: /etc/fstab.bak.$(date +%Y%m%d_%H%M%S)"
else
log_info "/etc/fstab 中未找到 swap 配置,跳过"
fi
else
log_error "✗ Swap 分区关闭失败"
return 1
fi
# 再次检查
swap_total_after=$(free | grep Swap | awk '{print $2}')
if [ "$swap_total_after" -eq 0 ]; then
log_info "✓ Swap 分区已成功关闭"
else
log_warn "Swap 分区可能未完全关闭,请手动检查"
fi
}
###############################################################################
# 2. 检查和关闭透明大页(THP)
###############################################################################
check_and_disable_thp() {
log_section "检查透明大页(THP)"
# 检查当前 THP 状态
thp_enabled_file="/sys/kernel/mm/transparent_hugepage/enabled"
thp_defrag_file="/sys/kernel/mm/transparent_hugepage/defrag"
if [ ! -f "$thp_enabled_file" ]; then
log_warn "系统不支持透明大页,跳过此项检查"
return 0
fi
thp_enabled=$(cat "$thp_enabled_file" | grep -o "\[.*\]")
thp_defrag=$(cat "$thp_defrag_file" | grep -o "\[.*\]")
log_info "当前 THP enabled 状态: $thp_enabled"
log_info "当前 THP defrag 状态: $thp_defrag"
if [[ "$thp_enabled" == "[madvise]" ]] && [[ "$thp_defrag" == "[madvise]" ]] || \
[[ "$thp_enabled" == "[never]" ]] && [[ "$thp_defrag" == "[never]" ]]; then
log_info "✓ 透明大页已设置为推荐状态"
return 0
fi
log_warn "透明大页未设置为推荐状态,正在配置..."
# 临时设置
log_info "执行: echo madvise > $thp_enabled_file"
echo madvise > "$thp_enabled_file"
log_info "执行: echo madvise > $thp_defrag_file"
echo madvise > "$thp_defrag_file"
# 永久设置 - 添加到 rc.local
if [ -f /etc/rc.d/rc.local ]; then
log_info "正在配置永久关闭透明大页..."
# 检查是否已经存在配置
if ! grep -q "transparent_hugepage/enabled" /etc/rc.d/rc.local; then
cat >> /etc/rc.d/rc.local << EOF
# Doris: 设置透明大页为 madvise
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
log_info "✓ 已添加透明大页配置到 /etc/rc.d/rc.local"
else
log_info "/etc/rc.d/rc.local 中已存在透明大页配置"
fi
else
log_warn "/etc/rc.d/rc.local 不存在,仅配置临时设置"
fi
# 验证
thp_enabled_after=$(cat "$thp_enabled_file" | grep -o "\[.*\]")
thp_defrag_after=$(cat "$thp_defrag_file" | grep -o "\[.*\]")
log_info "设置后 THP enabled: $thp_enabled_after"
log_info "设置后 THP defrag: $thp_defrag_after"
log_info "✓ 透明大页配置完成"
}
###############################################################################
# 3. 检查和增加虚拟内存区域(vm.max_map_count)
###############################################################################
check_and_set_vm_max_map_count() {
log_section "检查虚拟内存区域(vm.max_map_count)"
# 检查当前值
current_value=$(sysctl vm.max_map_count | awk '{print $3}')
required_value=2000000
log_info "当前 vm.max_map_count: $current_value"
log_info "推荐 vm.max_map_count: $required_value"
if [ "$current_value" -ge "$required_value" ]; then
log_info "✓ 虚拟内存区域已满足要求(>= $required_value)"
return 0
fi
log_warn "虚拟内存区域不满足要求,正在设置..."
# 临时设置
log_info "执行: sysctl -w vm.max_map_count=$required_value"
sysctl -w vm.max_map_count=$required_value
# 永久设置 - 添加到 sysctl.conf
log_info "正在配置永久设置..."
# 检查是否已存在配置
if grep -q "^vm.max_map_count" /etc/sysctl.conf; then
# 更新现有配置
sed -i "s/^vm.max_map_count.*/vm.max_map_count = $required_value/" /etc/sysctl.conf
log_info "✓ 已更新 /etc/sysctl.conf 中的 vm.max_map_count 配置"
else
# 添加新配置
echo "vm.max_map_count = $required_value" >> /etc/sysctl.conf
log_info "✓ 已添加 vm.max_map_count 到 /etc/sysctl.conf"
fi
# 立即生效
log_info "执行: sysctl -p"
sysctl_output=$(sysctl -p)
log_info "sysctl -p 执行结果:"
echo "$sysctl_output"
# 验证
new_value=$(sysctl vm.max_map_count | awk '{print $3}')
log_info "设置后 vm.max_map_count: $new_value"
if [ "$new_value" -ge "$required_value" ]; then
log_info "✓ 虚拟内存区域设置成功"
else
log_error "✗ 虚拟内存区域设置失败"
return 1
fi
}
###############################################################################
# 4. 检查和禁用 CPU 省电模式
###############################################################################
check_and_disable_cpu_powersave() {
log_section "检查 CPU 省电模式"
# 检查系统是否支持 CPU 频率调节
if [ ! -d /sys/devices/system/cpu/cpu0/cpufreq ]; then
log_warn "系统不支持 CPU 频率调节(Scaling Governor),跳过此项检查"
return 0
fi
# 检查当前 governor 模式
current_governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null)
if [ -z "$current_governor" ]; then
log_warn "无法读取 CPU governor,跳过此项检查"
return 0
fi
log_info "当前 CPU Governor: $current_governor"
# 列出所有 CPU 的 governor
log_info "所有 CPU 的当前 Governor:"
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
gov=$(cat "$cpu")
cpu_name=$(echo "$cpu" | sed 's|/sys/devices/system/cpu/||' | sed 's|/cpufreq/scaling_governor||')
echo " $cpu_name: $gov"
done
if [ "$current_governor" = "performance" ]; then
log_info "✓ CPU 已设置为 performance 模式"
return 0
fi
log_warn "CPU 未设置为 performance 模式,正在配置..."
# 设置所有 CPU 为 performance 模式
log_info "执行: echo 'performance' > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
if [ $? -eq 0 ]; then
log_info "✓ CPU 已设置为 performance 模式"
# 验证
log_info "设置后所有 CPU 的 Governor:"
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
gov=$(cat "$cpu")
cpu_name=$(echo "$cpu" | sed 's|/sys/devices/system/cpu/||' | sed 's|/cpufreq/scaling_governor||')
echo " $cpu_name: $gov"
done
else
log_error "✗ CPU 模式设置失败"
return 1
fi
log_warn "注意: 此设置在系统重启后会失效,如需永久生效,请配置系统服务或启动脚本"
}
###############################################################################
# 5. 检查和设置 TCP 连接溢出时自动重置
###############################################################################
check_and_set_tcp_abort_on_overflow() {
log_section "检查 TCP 连接溢出设置"
# 检查当前值
current_value=$(sysctl net.ipv4.tcp_abort_on_overflow | awk '{print $3}')
required_value=1
log_info "当前 net.ipv4.tcp_abort_on_overflow: $current_value"
log_info "推荐值: $required_value"
if [ "$current_value" -eq "$required_value" ]; then
log_info "✓ TCP 连接溢出设置已满足要求"
return 0
fi
log_warn "TCP 连接溢出未设置为自动重置,正在配置..."
# 临时设置
log_info "执行: sysctl -w net.ipv4.tcp_abort_on_overflow=$required_value"
sysctl -w net.ipv4.tcp_abort_on_overflow=$required_value
# 永久设置 - 添加到 sysctl.conf
log_info "正在配置永久设置..."
# 检查是否已存在配置
if grep -q "^net.ipv4.tcp_abort_on_overflow" /etc/sysctl.conf; then
# 更新现有配置
sed -i "s/^net.ipv4.tcp_abort_on_overflow.*/net.ipv4.tcp_abort_on_overflow = $required_value/" /etc/sysctl.conf
log_info "✓ 已更新 /etc/sysctl.conf 中的配置"
else
# 添加新配置
echo "net.ipv4.tcp_abort_on_overflow = $required_value" >> /etc/sysctl.conf
log_info "✓ 已添加配置到 /etc/sysctl.conf"
fi
# 立即生效
log_info "执行: sysctl -p"
sysctl_output=$(sysctl -p)
log_info "sysctl -p 执行结果:"
echo "$sysctl_output"
# 验证
new_value=$(sysctl net.ipv4.tcp_abort_on_overflow | awk '{print $3}')
log_info "设置后 net.ipv4.tcp_abort_on_overflow: $new_value"
if [ "$new_value" -eq "$required_value" ]; then
log_info "✓ TCP 连接溢出设置成功"
else
log_error "✗ TCP 连接溢出设置失败"
return 1
fi
}
###############################################################################
# 6. 检查防火墙状态
###############################################################################
check_firewall() {
log_section "检查防火墙状态"
# 检查 firewalld
if systemctl list-unit-files | grep -q firewalld; then
firewalld_status=$(systemctl is-active firewalld 2>/dev/null)
log_info "Firewalld 状态: $firewalld_status"
if [ "$firewalld_status" = "active" ]; then
log_warn "Firewalld 正在运行"
log_warn "如果 Doris 端口不通,可以考虑关闭防火墙或开放相关端口"
echo ""
log_info "关闭防火墙命令:"
echo " sudo systemctl stop firewalld.service"
echo " sudo systemctl disable firewalld.service"
echo ""
log_info "或者开放 Doris 端口(示例):"
echo " sudo firewall-cmd --zone=public --add-port=9030/tcp --permanent"
echo " sudo firewall-cmd --reload"
else
log_info "✓ Firewalld 未运行"
fi
else
log_info "系统未安装 firewalld"
fi
# 检查 iptables
if systemctl list-unit-files | grep -q iptables; then
iptables_status=$(systemctl is-active iptables 2>/dev/null)
log_info "Iptables 状态: $iptables_status"
if [ "$iptables_status" = "active" ]; then
log_warn "Iptables 正在运行"
fi
else
log_info "系统未安装 iptables"
fi
}
###############################################################################
# 7. 检查和增加最大文件句柄数
###############################################################################
check_and_set_file_limits() {
log_section "检查最大文件句柄数"
# 检查当前限制
current_soft=$(ulimit -Sn)
current_hard=$(ulimit -Hn)
required_value=1000000
log_info "当前 soft nofile 限制: $current_soft"
log_info "当前 hard nofile 限制: $current_hard"
log_info "推荐值: $required_value"
if [ "$current_soft" -ge "$required_value" ] && [ "$current_hard" -ge "$required_value" ]; then
log_info "✓ 文件句柄数限制已满足要求(>= $required_value)"
return 0
fi
log_warn "文件句柄数限制不满足要求,正在配置..."
# 配置 /etc/security/limits.conf
limits_conf="/etc/security/limits.conf"
backup_file="$limits_conf.bak.$(date +%Y%m%d_%H%M%S)"
# 备份
cp "$limits_conf" "$backup_file"
log_info "备份文件: $backup_file"
# 检查是否已存在满足要求的配置(>= required_value)
existing_soft=$(grep "^[[:space:]]*\*[[:space:]]*soft[[:space:]]*nofile" "$limits_conf" | awk '{print $4}' | head -1)
existing_hard=$(grep "^[[:space:]]*\*[[:space:]]*hard[[:space:]]*nofile" "$limits_conf" | awk '{print $4}' | head -1)
if [ -n "$existing_soft" ] && [ -n "$existing_hard" ]; then
log_info "已存在的 soft nofile 配置: $existing_soft"
log_info "已存在的 hard nofile 配置: $existing_hard"
if [ "$existing_soft" -ge "$required_value" ] && [ "$existing_hard" -ge "$required_value" ]; then
log_info "/etc/security/limits.conf 中已存在满足要求的配置"
return 0
fi
fi
# 添加配置
cat >> "$limits_conf" << EOF
# Doris: 增加文件句柄数限制
* soft nofile $required_value
* hard nofile $required_value
EOF
log_info "✓ 已添加文件句柄数配置到 $limits_conf"
log_info "✓ 文件句柄数配置完成"
log_warn "注意: 需要重新登录或重启会话才能生效"
log_info "当前会话可以使用 'ulimit -n $required_value' 临时设置"
}
###############################################################################
# 8. 检查和配置 NTP 服务
###############################################################################
check_and_configure_ntp() {
log_section "检查 NTP 服务"
# 检查常见的 NTP 服务
ntp_services=("ntp" "ntpd" "chronyd" "systemd-timesyncd")
ntp_found=false
for service in "${ntp_services[@]}"; do
if systemctl list-unit-files | grep -q "^${service}.service"; then
ntp_status=$(systemctl is-active "$service" 2>/dev/null)
ntp_enabled=$(systemctl is-enabled "$service" 2>/dev/null)
log_info "发现 NTP 服务: $service"
log_info " 状态: $ntp_status"
log_info " 开机自启: $ntp_enabled"
if [ "$ntp_status" = "active" ]; then
log_info "✓ NTP 服务正在运行"
ntp_found=true
# 显示时间同步状态
if command -v timedatectl &> /dev/null; then
log_info "系统时间同步状态:"
timedatectl status
fi
else
log_warn "NTP 服务 $service 未运行"
log_info "启动命令: sudo systemctl start $service"
log_info "设置开机自启: sudo systemctl enable $service"
fi
break
fi
done
if [ "$ntp_found" = false ]; then
log_warn "未发现 NTP 服务"
log_info "建议安装并配置 NTP 服务以保持时钟同步"
echo ""
log_info "安装 NTP 服务示例:"
echo " Ubuntu/Debian: sudo apt-get install ntp"
echo " CentOS/RHEL: sudo yum install ntp"
echo ""
log_info "启动并设置开机自启:"
echo " sudo systemctl start ntpd"
echo " sudo systemctl enable ntpd"
fi
}
###############################################################################
# 主函数
###############################################################################
main() {
log_info "=========================================="
log_info "Apache Doris OS 检查和配置脚本"
log_info "=========================================="
# 检查 root 权限
check_root
# 显示系统信息
log_section "系统信息"
log_info "操作系统: $(uname -s)"
log_info "内核版本: $(uname -r)"
log_info "架构: $(uname -m)"
log_info "主机名: $(hostname)"
log_info "当前时间: $(date)"
# 执行各项检查和配置
check_and_disable_swap
check_and_disable_thp
check_and_set_vm_max_map_count
check_and_disable_cpu_powersave
check_and_set_tcp_abort_on_overflow
check_firewall
check_and_set_file_limits
check_and_configure_ntp
# 完成
log_section "检查和配置完成"
log_info "所有检查已完成"
log_warn "注意: 部分配置需要重启系统或重新登录才能完全生效"
log_info "建议重启系统以确保所有配置生效"
echo ""
log_info "脚本执行时间: $(date)"
}
# 执行主函数
main
```
|
|
|
|
|
|
|
|
|
|
|
|
|
rsync -rltDv /mnt/d/tmp/soft/apache-doris-3.1.4-bin-x64.tar.gz ./
rsync -rltDv /mnt/d/tmp/soft/openjdk-17_linux-x64_bin.tar.gz ./
tar -xvf openjdk-17_linux-x64_bin.tar.gz
vim ~/.bashrc
export JAVA_HOME=/opt/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
doris@ds1:~$ which java
/opt/jdk-17/bin/java
doris@ds1:~$ java --version
openjdk 17 2021-09-14
OpenJDK Runtime Environment (build 17+35-2724)
OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)
|
root@ds1:/opt# chown -R doris:doris doris/ tar -xvf apache-doris-3.1.4-bin-x64.tar.gz doris@ds1:/opt/doris$ cd apache-doris-3.1.4-bin-x64 doris@ds1:/opt/doris/apache-doris-3.1.4-bin-x64$ ls be extensions fe ms tools bin/start_fe.sh --daemon tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz ``` export JAVA_HOME=/opt/jdk-17 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH export PATH=/opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin:$PATH ``` mysql -uroot -Pfe_query_port -hfe_ip_address mysql -uroot -P9030 -h127.0.0.1 ``` doris@ds1:/opt/doris/apache-doris-3.1.4-bin-x64/fe/conf$ mysql -uroot -P9030 -h127.0.0.1 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 0 Server version: 5.7.99 Copyright (c) 2000, 2023, Oracle and/or its affiliates. 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> ``` |
#节点1安装 doris@ds1:/opt/doris$ tar -xvf apache-doris-3.1.4-bin-x64.tar.gz JAVA_HOME=/opt/jdk-17 http_port = 8030 rpc_port = 9020 query_port = 9030 edit_log_port = 9010 priority_networks=192.168.73.0/24 bin/start_fe.sh --daemon ps -ef |grep java mysql -uroot -P9030 -h127.0.0.1 ALTER SYSTEM ADD FOLLOWER "192.168.73.12:9010"; SHOW PROC '/frontends'; ``` mysql> SHOW PROC '/frontends'; +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ | Name | Host | EditLogPort | HttpPort | QueryPort | RpcPort | ArrowFlightSqlPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastStartTime | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ | fe_389631d5_cfc8_4dff_8be1_3e12d8c1a1b4 | 192.168.73.11 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | true | 1764774444 | true | true | 26 | 2026-01-21 12:48:00 | 2026-01-21 12:49:20 | true | | doris-3.1.4-rc02-7f5ba43de6 | Yes | | fe_6352965e_69b3_4e8e_a3e2_61c91331c00d | 192.168.73.12 | 9010 | 8030 | 0 | 0 | 0 | FOLLOWER | false | 1764774444 | false | false | 0 | NULL | NULL | true | java.net.ConnectException: Connection refused | NULL | No | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ ``` #节点2安装 root@ds2:/# mkdir /opt/doris2 chown -R doris:doris /opt/doris2 #软件准备 rsync -rltDv /opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz /opt/doris2/ rsync -rltDv /opt/doris/apache-doris-3.1.4-bin-x64.tar.gz /opt/doris2/ cd /opt/doris2 tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz tar -xvf apache-doris-3.1.4-bin-x64.tar.gz export JAVA_HOME=/opt/jdk-17 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH export PATH=/opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin:$PATH cd /opt/doris2/apache-doris-3.1.4-bin-x64/fe vim conf/fe.conf JAVA_HOME=/opt/jdk-17 priority_networks=192.168.73.0/24 下面的参数不支持,只支持0,即大小写敏感 lower_case_table_names=1 $ java --version openjdk 17 2021-09-14 OpenJDK Runtime Environment (build 17+35-2724) OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing) bin/start_fe.sh --helper 192.168.73.11:9010 --daemon mysql -uroot -P9030 -h127.0.0.1 SHOW PROC '/frontends'; ``` mysql> SHOW PROC '/frontends'; +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | Name | Host | EditLogPort | HttpPort | QueryPort | RpcPort | ArrowFlightSqlPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastStartTime | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | fe_389631d5_cfc8_4dff_8be1_3e12d8c1a1b4 | 192.168.73.11 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | true | 1764774444 | true | true | 74 | 2026-01-21 12:48:00 | 2026-01-21 12:53:20 | true | | doris-3.1.4-rc02-7f5ba43de6 | No | | fe_6352965e_69b3_4e8e_a3e2_61c91331c00d | 192.168.73.12 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | false | 1764774444 | true | true | 73 | 2026-01-21 12:52:49 | 2026-01-21 12:53:20 | true | | doris-3.1.4-rc02-7f5ba43de6 | Yes | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ 2 rows in set (0.06 sec) ``` ALTER SYSTEM ADD OBSERVER "fe_ip_address:fe_edit_log_port" 1. 停止目标节点(192.168.73.12) # 在 192.168.73.12 上执行 cd /path/to/doris/fe bin/stop_fe.sh 2. 清理目标节点的元数据 # 在 192.168.73.12 上执行 # 重命名备份 mv doris-meta doris-meta-backup mkdir doris-meta 3. 在主集群(192.168.73.11)添加follower -- 在 192.168.73.11 上登录MySQL客户端执行 mysql> ALTER SYSTEM ADD FOLLOWER "192.168.73.12:9010"; ``` mysql> SHOW PROC '/frontends'; +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+-----------+-------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | Name | Host | EditLogPort | HttpPort | QueryPort | RpcPort | ArrowFlightSqlPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastStartTime | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+-----------+-------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | fe_f76905a9_264d_4176_8abb_f95e1d534778 | 192.168.73.12 | 9010 | 8030 | 0 | 0 | 0 | FOLLOWER | false | 654649033 | false | false | 0 | NULL | NULL | true | | NULL | No | | fe_b76f1aca_a5ea_4692_b6b7_ac5b7e0f7f58 | 192.168.73.11 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | true | 654649033 | true | true | 790 | 2026-01-21 11:04:38 | 2026-01-21 12:07:59 | true | | doris-3.1.4-rc02-7f5ba43de6 | Yes | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+-----------+-------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ 2 rows in set (0.02 sec) ``` 4. 启动目标节点作为follower # 在 192.168.73.12 上执行 bin/start_fe.sh --helper 192.168.73.11:9010 --daemon mysql -uroot -P9030 -h127.0.0.1 -- 在 192.168.73.11 上执行 mysql> SHOW PROC '/frontends'; # 确保FE已停止 cd /opt/doris2/apache-doris-3.1.4-bin-x64 ./fe/bin/stop_fe.sh # 彻底清理元数据和bdb目录 rm -rf doris-meta/* # 或者更彻底地删除整个目录并重建 rm -rf doris-meta mkdir doris-meta # 如果有image目录也清理一下 rm -rf log/fe_* rm -rf log/image -- 登录主节点的MySQL客户端 mysql> ALTER SYSTEM DROP FOLLOWER "192.168.73.12:9010"; mysql> ALTER SYSTEM DROP OBSERVER "192.168.73.12:9010"; -- 等待几秒后重新添加 mysql> ALTER SYSTEM ADD FOLLOWER "192.168.73.12:9010"; |
doris@ds3:/opt/doris3$ tar -xvf apache-doris-3.1.4-bin-x64.tar.gz doris@ds3:/opt/doris3/apache-doris-3.1.4-bin-x64/fe$ vim conf/fe.conf JAVA_HOME=/opt/jdk-17 priority_networks=192.168.73.0/24 #在主节点上添加 mysql -uroot -P9030 -h127.0.0.1 ALTER SYSTEM ADD FOLLOWER "192.168.73.13:9010"; SHOW PROC '/frontends'; ``` mysql> SHOW PROC '/frontends'; +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ | Name | Host | EditLogPort | HttpPort | QueryPort | RpcPort | ArrowFlightSqlPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastStartTime | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ | fe_389631d5_cfc8_4dff_8be1_3e12d8c1a1b4 | 192.168.73.11 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | true | 1764774444 | true | true | 183 | 2026-01-21 12:48:00 | 2026-01-21 13:02:20 | true | | doris-3.1.4-rc02-7f5ba43de6 | Yes | | fe_6352965e_69b3_4e8e_a3e2_61c91331c00d | 192.168.73.12 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | false | 1764774444 | true | true | 181 | 2026-01-21 12:52:49 | 2026-01-21 13:02:20 | true | | doris-3.1.4-rc02-7f5ba43de6 | No | | fe_3f916d36_5a82_43b6_93d9_90809be5f2a3 | 192.168.73.13 | 9010 | 8030 | 0 | 0 | 0 | FOLLOWER | false | 1764774444 | false | false | 0 | NULL | NULL | true | java.net.ConnectException: Connection refused | NULL | No | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+-------+-------+-------------------+---------------------+---------------------+----------+-----------------------------------------------+-----------------------------+------------------+ 3 rows in set (0.02 sec) ``` ``` export JAVA_HOME=/opt/jdk-17 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH export PATH=/opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin:$PATH ``` ``` doris@ds3:~$ java --version openjdk 17 2021-09-14 OpenJDK Runtime Environment (build 17+35-2724) OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing) doris@ds3:~$ which mysql /opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin/mysql ``` 在 192.168.73.13 上执行 bin/start_fe.sh --helper 192.168.73.11:9010 --daemon ps -ef |grep java mysql -uroot -P9030 -h127.0.0.1 |
============================================
be安装
============================================
export JAVA_HOME=/opt/jdk-17
priority_networks=192.168.73.0/24
在启动 BE 节点前,需要先在 FE 集群中注册该节点:
## connect a alive FE node
mysql -uroot -P9030 -h127.0.0.1
## registe BE node
ALTER SYSTEM ADD BACKEND "192.168.73.11:9050";
sudo swapoff -a
对于Ubuntu/Debian系统:
```
# 编辑fstab文件
sudo vim /etc/fstab
# 找到包含swap的行,在开头添加#注释掉
# 例如:/swapfile none swap sw 0 0
# 重启生效或执行
sudo swapoff -a
```
对于CentOS/RHEL系统:
```
# 查看当前swap
sudo swapon --show
# 临时关闭
sudo swapoff -a
# 永久关闭(注释掉swap行)
sudo vim /etc/fstab
# 找到swap行,前面加上#注释
# 或者使用sed命令
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
```
doris@ds1:/opt/doris/apache-doris-3.1.4-bin-x64/be$ bin/start_be.sh --daemon
bin/start_be.sh --daemon
# 查看BE进程
ps aux | grep be_service | grep -v grep
# 查看BE日志
tail -f /opt/doris/apache-doris-3.1.4-bin-x64/be/log/be.INFO
.13, port=9020, process_uuid=1769000618699, counter:13, BE start time: 1769001711483
# 查看BE警告日志
tail -f /opt/doris/apache-doris-3.1.4-bin-x64/be/log/be.WARNING
## connect a alive FE node
mysql -uroot -P9030 -h127.0.0.1
## check BE node status
show backends;
```
mysql> show backends;
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| BackendId | Host | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag | ErrMsg | Version | Status | HeartbeatFailureCounter | NodeRole | CpuCores | Memory | RunningTasks |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| 1768999679411 | 192.168.73.11 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:21:51 | 2026-01-21 13:25:01 | true | false | 22 | 35.533 KB | 0.000 | 781.276 GB | 1006.854 GB | 22.40 % | 22.40 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:25:03","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769001727597} | 0 | mix | 28 | 31.20 GB | 0 |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
1 row in set (0.02 sec)
```
```
mysql> show backends;
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| BackendId | Host | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag | ErrMsg | Version | Status | HeartbeatFailureCounter | NodeRole | CpuCores | Memory | RunningTasks |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| 1768999679411 | 192.168.73.11 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:21:51 | 2026-01-21 13:40:12 | true | false | 12 | 55.296 KB | 0.000 | 781.196 GB | 1006.854 GB | 22.41 % | 22.41 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:39:47","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769002475412} | 0 | mix | 28 | 31.20 GB | 0 |
| 1768999679907 | 192.168.73.12 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:39:41 | 2026-01-21 13:40:12 | true | false | 10 | 22.557 KB | 0.000 | 781.196 GB | 1006.854 GB | 22.41 % | 22.41 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:39:44","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769002777647} | 0 | mix | 28 | 31.20 GB | 0 |
| 1768999679908 | 192.168.73.13 | 9050 | -1 | -1 | -1 | -1 | NULL | NULL | false | false | 0 | 0.000 | 0.000 | 1.000 B | 0.000 | 0.00 % | 0.00 % | 0.000 | {"location" : "default"} | java.net.ConnectException: Connection refused | | {"lastSuccessReportTabletsTime":"N/A","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":0} | 38 | | 1 | 0.00 | 0 |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
3 rows in set (0.01 sec)
```
通常情况下需要注意以下几项状态: Alive 为 true 表示节点存活 TabletNum 表示该节点上的分片数量,新加入的节点会进行数据均衡,TabletNum 逐渐趋于平均。 |
xt@qisan:~$ ds3
root@ds3:/# su - doris
cd /opt/doris3/apache-doris-3.1.4-bin-x64/be
vim conf/be.conf
export JAVA_HOME=/opt/jdk-17
priority_networks=192.168.73.0/24
# 在当前shell中临时设置
ulimit -n 655350
# 然后启动BE
cd /opt/doris3/apache-doris-3.1.4-bin-x64/be
bin/start_be.sh --daemon
```
mysql> show backends;
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| BackendId | Host | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag | ErrMsg | Version | Status | HeartbeatFailureCounter | NodeRole | CpuCores | Memory | RunningTasks |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
| 1768999679411 | 192.168.73.11 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:21:51 | 2026-01-21 13:45:22 | true | false | 22 | 64.780 KB | 0.000 | 781.117 GB | 1006.854 GB | 22.42 % | 22.42 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:45:09","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769002819664} | 0 | mix | 28 | 31.20 GB | 0 |
| 1768999679907 | 192.168.73.12 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:39:41 | 2026-01-21 13:45:22 | true | false | 22 | 64.780 KB | 0.000 | 781.117 GB | 1006.854 GB | 22.42 % | 22.42 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:44:58","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769002777647} | 0 | mix | 28 | 31.20 GB | 0 |
| 1768999679908 | 192.168.73.13 | 9050 | 9060 | 8040 | 8060 | -1 | 2026-01-21 13:42:58 | 2026-01-21 13:45:22 | true | false | 22 | 64.780 KB | 0.000 | 781.117 GB | 1006.854 GB | 22.42 % | 22.42 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-01-21 13:45:07","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1769002975702} | 0 | mix | 28 | 31.20 GB | 0 |
+---------------+---------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+----------+--------------+
3 rows in set (0.00 sec)
```
|
```
mysql> select user();
+--------------------+
| user() |
+--------------------+
| 'root'@'127.0.0.1' |
+--------------------+
1 row in set (0.03 sec)
-- modify the password for current user
SET PASSWORD = PASSWORD('Aa123456');
```
-- 1. 创建用户 CREATE USER 'dba'@'%' IDENTIFIED BY 'Aa123456'; -- 2. 授予管理员权限 GRANT ADMIN_PRIV ON *.* TO 'dba'@'%'; -- 3. 授予授权权限(如果需要该用户能授权给其他人) GRANT GRANT_PRIV ON *.* TO 'dba'@'%'; -- 4. 授予资源权限 GRANT USAGE_PRIV ON RESOURCE *.* TO 'dba'@'%'; -- 先创建数据库 CREATE DATABASE IF NOT EXISTS aisql; -- 授予数据库所有权限 GRANT ALL ON aisql.* TO 'dba'@'%'; -- 或者授予具体数据库权限 GRANT SELECT_PRIV ON aisql.* TO 'dba'@'%'; GRANT LOAD_PRIV ON aisql.* TO 'dba'@'%'; GRANT ALTER_PRIV ON aisql.* TO 'dba'@'%'; GRANT CREATE_PRIV ON aisql.* TO 'dba'@'%'; GRANT DROP_PRIV ON aisql.* TO 'dba'@'%'; -- 获取所有数据库 SHOW DATABASES; -- 1. 创建用户 'admin',允许从任何主机访问(安全起见,也可以指定具体IP) CREATE USER 'admin'@'%' IDENTIFIED BY 'Aa123456'; -- 2. 授予所有数据库的所有权限(等效于Doris的超级管理员) GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'; -- 3. 刷新权限使设置立即生效 GRANT ALL ON *.* TO 'admin'@'%'; -- 查看用户创建情况 SELECT user, host FROM mysql.user WHERE user = 'admin'; -- 查看用户权限 SHOW GRANTS FOR 'admin'@'%'; mysql -uroot -P9030 -h127.0.0.1 CREATE USER 'dba'@'%' IDENTIFIED BY 'Aa123456'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%'; GRANT ALL ON *.* TO 'dba'@'%'; ``` 在其他机器上使用以下命令测试连接: mysql -h192.168.73.11 -P9030 -uadmin -pAa123456 |
```
-- 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;
```
|
关闭后重新启动 cd /opt/doris/apache-doris-3.1.4-bin-x64/fe/ 主节点 bin/start_fe.sh --daemon 从节点 bin/start_fe.sh --helper 192.168.73.11:9010 --daemon mysql -uroot -P9030 -h127.0.0.1 SHOW PROC '/frontends'; ``` mysql> show proc '/frontends'; +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | Name | Host | EditLogPort | HttpPort | QueryPort | RpcPort | ArrowFlightSqlPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastStartTime | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ | fe_389631d5_cfc8_4dff_8be1_3e12d8c1a1b4 | 192.168.73.11 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | false | 1764774444 | true | true | 1375 | 2026-01-22 01:06:27 | 2026-01-22 01:12:09 | true | | doris-3.1.4-rc02-7f5ba43de6 | Yes | | fe_6352965e_69b3_4e8e_a3e2_61c91331c00d | 192.168.73.12 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | true | 1764774444 | true | true | 1377 | 2026-01-22 01:07:59 | 2026-01-22 01:12:09 | true | | doris-3.1.4-rc02-7f5ba43de6 | No | | fe_3f916d36_5a82_43b6_93d9_90809be5f2a3 | 192.168.73.13 | 9010 | 8030 | 9030 | 9020 | -1 | FOLLOWER | false | 1764774444 | true | true | 1375 | 2026-01-22 01:08:12 | 2026-01-22 01:12:09 | true | | doris-3.1.4-rc02-7f5ba43de6 | No | +-----------------------------------------+---------------+-------------+----------+-----------+---------+--------------------+----------+----------+------------+------+-------+-------------------+---------------------+---------------------+----------+--------+-----------------------------+------------------+ 3 rows in set (0.09 sec) ``` sudo swapoff -a ulimit -n 655350 cd /opt/doris/apache-doris-3.1.4-bin-x64/be bin/start_be.sh --daemon |
|
明白了,你的Doris安装目录是 `/opt/doris/apache-doris-3.1.4-bin-x64`,`meta_dir` 被注释,因此元数据目录使用默认路径 `/opt/doris/apache-doris-3.1.4-bin-x64/fe/doris-meta`。
以下是重新整理的操作步骤:
---
## 🛠️ 单节点重置操作(Doris 3.1.4)
**安装目录**:`/opt/doris/apache-doris-3.1.4-bin-x64`
**元数据目录**:`/opt/doris/apache-doris-3.1.4-bin-x64/fe/doris-meta`
**BE数据目录**:`/opt/doris/apache-doris-3.1.4-bin-x64/be/storage`
---
### 第一步:重置 FE
```bash
# 1. 停止 FE
sh /opt/doris/apache-doris-3.1.4-bin-x64/fe/bin/stop_fe.sh
# 2. 备份并清空元数据
mv /opt/doris/apache-doris-3.1.4-bin-x64/fe/doris-meta /opt/doris/apache-doris-3.1.4-bin-x64/fe/doris-meta.bak
mkdir /opt/doris/apache-doris-3.1.4-bin-x64/fe/doris-meta
# 3. 启动 FE
sh /opt/doris/apache-doris-3.1.4-bin-x64/fe/bin/start_fe.sh --daemon
```
---
### 第二步:清理 BE
```bash
# 1. 停止 BE
sh /opt/doris/apache-doris-3.1.4-bin-x64/be/bin/stop_be.sh
# 2. 清除集群归属标识
cd /opt/doris/apache-doris-3.1.4-bin-x64/be/storage
rm -f cluster_id
# 3. 启动 BE
sh /opt/doris/apache-doris-3.1.4-bin-x64/be/bin/start_be.sh --daemon
```
---
### 第三步:重新注册 BE
```bash
# 1. 连接 FE(默认端口9030,空密码)
mysql -h 127.0.0.1 -P 9030 -uroot
# 2. 添加 BE 节点(IP改为实际IP,端口默认9050)
ALTER SYSTEM ADD BACKEND "你的实际IP:9050";
# 3. 验证 BE 状态
SHOW BACKENDS\G;
```
**确认 `Alive` 字段为 `true` 即成功。**
---
### 可选:验证数据
```sql
-- 查看所有数据库
SHOW DATABASES;
-- 查询验证数据完整性
SELECT * FROM 你的表 LIMIT 10;
```
---
### ⚠️ 注意事项
| 项目 | 说明 |
|------|------|
| **数据保留** | 不要删除 `be/storage/data/` 目录下的实际数据文件 |
| **IP替换** | 注册BE时把 `"你的实际IP"` 改为本机真实IP |
| **元数据备份** | 已备份到 `doris-meta.bak`,确认正常后可删除 |
| **勿用危险功能** | 不要开启 `metadata_failure_recovery` 参数 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mkdir -p /opt/app/doris
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.1.4-bin-x64.tar.gz
scp /d/soft/openjdk-17_linux-x64_bin.tar.gz xt@101.43.140.244:/opt/app
tar -xvf openjdk-17_linux-x64_bin.tar.gz
vim ~/.bashrc
export JAVA_HOME=/opt/app/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=/opt/app/mysql/bin:$PATH
(base) xt@VM-8-13-ubuntu:~$ which mysql
/opt/app/mysql/bin/mysql
/opt/app/doris$ vim fe/conf/fe.conf
JAVA_HOME=/opt/app/jdk-17
priority_networks=10.0.8.0/24
如果内存不足,下面是1G的配置,默认是8G
```
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Darrow.enable_null_check_for_get=false --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 --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"
```
fe/bin/start_fe.sh --daemon
tail -f fe/log/fe.out
mysql -uroot -P9030 -h127.0.0.1
============================================
be安装,配置文件一定要配置对,已经在此错了两次了
============================================
vim be/conf/be.conf
JAVA_HOME=/opt/app/jdk-17
priority_networks=10.0.8.0/24
内存500m
```
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx500m -Xms500m -XX:MaxMetaspaceSize=128m -XX:MaxDirectMemorySize=256m -XX:+UseSerialGC -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=false -Dsun.java.command=DorisBE -XX:-CriticalJNINatives -XX:+IgnoreUnrecognizedVMOptions -Darrow.enable_null_check_for_get=false --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 --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"
```
内存1G
```
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -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=false -Dsun.java.command=DorisBE -XX:-CriticalJNINatives -XX:+IgnoreUnrecognizedVMOptions -Darrow.enable_null_check_for_get=false --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 --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"
```
在启动 BE 节点前,需要先在 FE 集群中注册该节点:
mysql -uroot -P9030 -h127.0.0.1
ALTER SYSTEM ADD BACKEND "localhost:9050";
SHOW PROC '/backends';
```
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------+---------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+--------+--------------+
| BackendId | Host | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag | ErrMsg | Version | Status | HeartbeatFailureCounter | NodeRole | CpuCores | Memory | RunningTasks |
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------+---------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+--------+--------------+
| 1770282089686 | localhost | 9050 | -1 | -1 | -1 | -1 | NULL | NULL | false | false | 0 | 0.000 | 0.000 | 1.000 B | 0.000 | 0.00 % | 0.00 % | 0.000 | {"location" : "default"} | java.net.ConnectException: Connection refused | | {"lastSuccessReportTabletsTime":"N/A","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":0} | 1 | | 1 | 0.00 | 0 |
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------+---------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+--------+--------------+
```
sudo swapoff -a
ulimit -n 655350
be/bin/start_be.sh --daemon
```
# 查看 BE 进程
ps aux | grep doris_be | grep -v grep
# 查看 BE 端口监听
sudo netstat -tlnp | grep 9050
sudo netstat -tlnp | grep 8040 # HTTP 端口
# 查看 BE 日志
tail -f /path/to/doris-be/log/be.INFO
tail -f /path/to/doris-be/log/be.WARNING
tail -f /path/to/doris-be/log/be.out
如果没起来,通常是配置文件不小心写错了
```
```
mysql> SHOW PROC '/backends';
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+---------+--------------+
| BackendId | Host | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag | ErrMsg | Version | Status | HeartbeatFailureCounter | NodeRole | CpuCores | Memory | RunningTasks |
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+---------+--------------+
| 1770282089686 | localhost | 9050 | 9060 | 8040 | 8060 | -1 | 2026-02-05 19:26:56 | 2026-02-05 19:28:14 | true | false | 22 | 11.843 KB | 0.000 | 14.318 GB | 58.943 GB | 75.71 % | 75.71 % | 0.000 | {"location" : "default"} | | doris-3.1.4-rc02-7f5ba43de6 | {"lastSuccessReportTabletsTime":"2026-02-05 19:28:11","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false,"isActive":true,"isShutdown":false,"currentFragmentNum":0,"lastFragmentUpdateTime":1770290840531} | 0 | mix | 2 | 3.32 GB | 0 |
+---------------+-----------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+----------+---------+--------------+
1 row in set (0.01 sec)
```
```
select user();
SET PASSWORD = PASSWORD('Aa123456');
-- 1. 创建用户
CREATE USER 'dba'@'%' IDENTIFIED BY 'Aa123456';
-- 2. 授予管理员权限
GRANT ADMIN_PRIV ON *.* TO 'dba'@'%';
-- 3. 授予授权权限(如果需要该用户能授权给其他人)
GRANT GRANT_PRIV ON *.* TO 'dba'@'%';
-- 4. 授予资源权限
GRANT USAGE_PRIV ON RESOURCE *.* TO 'dba'@'%';
-- 先创建数据库
CREATE DATABASE IF NOT EXISTS aisql;
-- 授予数据库所有权限
GRANT ALL ON aisql.* TO 'dba'@'%';
```
mysql -udba -P9030 -h127.0.0.1 -pAa123456
|
```
#!/bin/bash
###############################################################################
# Apache Doris OS 检查和配置脚本
# 功能:
# 1. 检查系统是否满足 Doris 安装的 OS 要求
# 2. 如果不满足,自动进行配置
# 3. 配置后立即执行相关命令使其生效
# 使用方法:
# sudo bash doris_os_check_and_setting.sh
###############################################################################
# 颜色输出定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_section() {
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}========================================${NC}"
}
# 检查是否为 root 用户
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本需要 root 权限运行"
log_info "请使用: sudo bash $0"
exit 1
fi
}
###############################################################################
# 1. 检查和关闭 swap 分区
###############################################################################
check_and_disable_swap() {
log_section "检查 Swap 分区"
# 检查 swap 是否启用
swap_total=$(free | grep Swap | awk '{print $2}')
log_info "当前 Swap 总大小: ${swap_total} KB"
if [ "$swap_total" -eq 0 ]; then
log_info "✓ Swap 分区已经关闭"
return 0
fi
log_warn "Swap 分区当前启用,建议关闭"
# 临时关闭 swap
log_info "执行: swapoff -a"
swapoff -a
if [ $? -eq 0 ]; then
log_info "✓ Swap 分区临时关闭成功"
# 永久关闭:注释 /etc/fstab 中的 swap 行
log_info "正在配置永久关闭 Swap..."
if grep -q "^.*swap.*swap" /etc/fstab; then
# 备份 fstab
cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d_%H%M%S)
# 注释 swap 行
sed -i '/^.*swap.*swap/s/^/#/' /etc/fstab
log_info "✓ 已注释 /etc/fstab 中的 swap 分区配置"
log_info "备份文件: /etc/fstab.bak.$(date +%Y%m%d_%H%M%S)"
else
log_info "/etc/fstab 中未找到 swap 配置,跳过"
fi
else
log_error "✗ Swap 分区关闭失败"
return 1
fi
# 再次检查
swap_total_after=$(free | grep Swap | awk '{print $2}')
if [ "$swap_total_after" -eq 0 ]; then
log_info "✓ Swap 分区已成功关闭"
else
log_warn "Swap 分区可能未完全关闭,请手动检查"
fi
}
###############################################################################
# 2. 检查和关闭透明大页(THP)
###############################################################################
check_and_disable_thp() {
log_section "检查透明大页(THP)"
# 检查当前 THP 状态
thp_enabled_file="/sys/kernel/mm/transparent_hugepage/enabled"
thp_defrag_file="/sys/kernel/mm/transparent_hugepage/defrag"
if [ ! -f "$thp_enabled_file" ]; then
log_warn "系统不支持透明大页,跳过此项检查"
return 0
fi
thp_enabled=$(cat "$thp_enabled_file" | grep -o "\[.*\]")
thp_defrag=$(cat "$thp_defrag_file" | grep -o "\[.*\]")
log_info "当前 THP enabled 状态: $thp_enabled"
log_info "当前 THP defrag 状态: $thp_defrag"
if [[ "$thp_enabled" == "[madvise]" ]] && [[ "$thp_defrag" == "[madvise]" ]] || \
[[ "$thp_enabled" == "[never]" ]] && [[ "$thp_defrag" == "[never]" ]]; then
log_info "✓ 透明大页已设置为推荐状态"
return 0
fi
log_warn "透明大页未设置为推荐状态,正在配置..."
# 临时设置
log_info "执行: echo madvise > $thp_enabled_file"
echo madvise > "$thp_enabled_file"
log_info "执行: echo madvise > $thp_defrag_file"
echo madvise > "$thp_defrag_file"
# 永久设置 - 添加到 rc.local
if [ -f /etc/rc.d/rc.local ]; then
log_info "正在配置永久关闭透明大页..."
# 检查是否已经存在配置
if ! grep -q "transparent_hugepage/enabled" /etc/rc.d/rc.local; then
cat >> /etc/rc.d/rc.local << EOF
# Doris: 设置透明大页为 madvise
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
log_info "✓ 已添加透明大页配置到 /etc/rc.d/rc.local"
else
log_info "/etc/rc.d/rc.local 中已存在透明大页配置"
fi
else
log_warn "/etc/rc.d/rc.local 不存在,仅配置临时设置"
fi
# 验证
thp_enabled_after=$(cat "$thp_enabled_file" | grep -o "\[.*\]")
thp_defrag_after=$(cat "$thp_defrag_file" | grep -o "\[.*\]")
log_info "设置后 THP enabled: $thp_enabled_after"
log_info "设置后 THP defrag: $thp_defrag_after"
log_info "✓ 透明大页配置完成"
}
###############################################################################
# 3. 检查和增加虚拟内存区域(vm.max_map_count)
###############################################################################
check_and_set_vm_max_map_count() {
log_section "检查虚拟内存区域(vm.max_map_count)"
# 检查当前值
current_value=$(sysctl vm.max_map_count | awk '{print $3}')
required_value=2000000
log_info "当前 vm.max_map_count: $current_value"
log_info "推荐 vm.max_map_count: $required_value"
if [ "$current_value" -ge "$required_value" ]; then
log_info "✓ 虚拟内存区域已满足要求(>= $required_value)"
return 0
fi
log_warn "虚拟内存区域不满足要求,正在设置..."
# 临时设置
log_info "执行: sysctl -w vm.max_map_count=$required_value"
sysctl -w vm.max_map_count=$required_value
# 永久设置 - 添加到 sysctl.conf
log_info "正在配置永久设置..."
# 检查是否已存在配置
if grep -q "^vm.max_map_count" /etc/sysctl.conf; then
# 更新现有配置
sed -i "s/^vm.max_map_count.*/vm.max_map_count = $required_value/" /etc/sysctl.conf
log_info "✓ 已更新 /etc/sysctl.conf 中的 vm.max_map_count 配置"
else
# 添加新配置
echo "vm.max_map_count = $required_value" >> /etc/sysctl.conf
log_info "✓ 已添加 vm.max_map_count 到 /etc/sysctl.conf"
fi
# 立即生效
log_info "执行: sysctl -p"
sysctl_output=$(sysctl -p)
log_info "sysctl -p 执行结果:"
echo "$sysctl_output"
# 验证
new_value=$(sysctl vm.max_map_count | awk '{print $3}')
log_info "设置后 vm.max_map_count: $new_value"
if [ "$new_value" -ge "$required_value" ]; then
log_info "✓ 虚拟内存区域设置成功"
else
log_error "✗ 虚拟内存区域设置失败"
return 1
fi
}
###############################################################################
# 4. 检查和禁用 CPU 省电模式
###############################################################################
check_and_disable_cpu_powersave() {
log_section "检查 CPU 省电模式"
# 检查系统是否支持 CPU 频率调节
if [ ! -d /sys/devices/system/cpu/cpu0/cpufreq ]; then
log_warn "系统不支持 CPU 频率调节(Scaling Governor),跳过此项检查"
return 0
fi
# 检查当前 governor 模式
current_governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null)
if [ -z "$current_governor" ]; then
log_warn "无法读取 CPU governor,跳过此项检查"
return 0
fi
log_info "当前 CPU Governor: $current_governor"
# 列出所有 CPU 的 governor
log_info "所有 CPU 的当前 Governor:"
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
gov=$(cat "$cpu")
cpu_name=$(echo "$cpu" | sed 's|/sys/devices/system/cpu/||' | sed 's|/cpufreq/scaling_governor||')
echo " $cpu_name: $gov"
done
if [ "$current_governor" = "performance" ]; then
log_info "✓ CPU 已设置为 performance 模式"
return 0
fi
log_warn "CPU 未设置为 performance 模式,正在配置..."
# 设置所有 CPU 为 performance 模式
log_info "执行: echo 'performance' > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
if [ $? -eq 0 ]; then
log_info "✓ CPU 已设置为 performance 模式"
# 验证
log_info "设置后所有 CPU 的 Governor:"
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
gov=$(cat "$cpu")
cpu_name=$(echo "$cpu" | sed 's|/sys/devices/system/cpu/||' | sed 's|/cpufreq/scaling_governor||')
echo " $cpu_name: $gov"
done
else
log_error "✗ CPU 模式设置失败"
return 1
fi
log_warn "注意: 此设置在系统重启后会失效,如需永久生效,请配置系统服务或启动脚本"
}
###############################################################################
# 5. 检查和设置 TCP 连接溢出时自动重置
###############################################################################
check_and_set_tcp_abort_on_overflow() {
log_section "检查 TCP 连接溢出设置"
# 检查当前值
current_value=$(sysctl net.ipv4.tcp_abort_on_overflow | awk '{print $3}')
required_value=1
log_info "当前 net.ipv4.tcp_abort_on_overflow: $current_value"
log_info "推荐值: $required_value"
if [ "$current_value" -eq "$required_value" ]; then
log_info "✓ TCP 连接溢出设置已满足要求"
return 0
fi
log_warn "TCP 连接溢出未设置为自动重置,正在配置..."
# 临时设置
log_info "执行: sysctl -w net.ipv4.tcp_abort_on_overflow=$required_value"
sysctl -w net.ipv4.tcp_abort_on_overflow=$required_value
# 永久设置 - 添加到 sysctl.conf
log_info "正在配置永久设置..."
# 检查是否已存在配置
if grep -q "^net.ipv4.tcp_abort_on_overflow" /etc/sysctl.conf; then
# 更新现有配置
sed -i "s/^net.ipv4.tcp_abort_on_overflow.*/net.ipv4.tcp_abort_on_overflow = $required_value/" /etc/sysctl.conf
log_info "✓ 已更新 /etc/sysctl.conf 中的配置"
else
# 添加新配置
echo "net.ipv4.tcp_abort_on_overflow = $required_value" >> /etc/sysctl.conf
log_info "✓ 已添加配置到 /etc/sysctl.conf"
fi
# 立即生效
log_info "执行: sysctl -p"
sysctl_output=$(sysctl -p)
log_info "sysctl -p 执行结果:"
echo "$sysctl_output"
# 验证
new_value=$(sysctl net.ipv4.tcp_abort_on_overflow | awk '{print $3}')
log_info "设置后 net.ipv4.tcp_abort_on_overflow: $new_value"
if [ "$new_value" -eq "$required_value" ]; then
log_info "✓ TCP 连接溢出设置成功"
else
log_error "✗ TCP 连接溢出设置失败"
return 1
fi
}
###############################################################################
# 6. 检查防火墙状态
###############################################################################
check_firewall() {
log_section "检查防火墙状态"
# 检查 firewalld
if systemctl list-unit-files | grep -q firewalld; then
firewalld_status=$(systemctl is-active firewalld 2>/dev/null)
log_info "Firewalld 状态: $firewalld_status"
if [ "$firewalld_status" = "active" ]; then
log_warn "Firewalld 正在运行"
log_warn "如果 Doris 端口不通,可以考虑关闭防火墙或开放相关端口"
echo ""
log_info "关闭防火墙命令:"
echo " sudo systemctl stop firewalld.service"
echo " sudo systemctl disable firewalld.service"
echo ""
log_info "或者开放 Doris 端口(示例):"
echo " sudo firewall-cmd --zone=public --add-port=9030/tcp --permanent"
echo " sudo firewall-cmd --reload"
else
log_info "✓ Firewalld 未运行"
fi
else
log_info "系统未安装 firewalld"
fi
# 检查 iptables
if systemctl list-unit-files | grep -q iptables; then
iptables_status=$(systemctl is-active iptables 2>/dev/null)
log_info "Iptables 状态: $iptables_status"
if [ "$iptables_status" = "active" ]; then
log_warn "Iptables 正在运行"
fi
else
log_info "系统未安装 iptables"
fi
}
###############################################################################
# 7. 检查和增加最大文件句柄数
###############################################################################
check_and_set_file_limits() {
log_section "检查最大文件句柄数"
# 检查当前限制
current_soft=$(ulimit -Sn)
current_hard=$(ulimit -Hn)
required_value=1000000
log_info "当前 soft nofile 限制: $current_soft"
log_info "当前 hard nofile 限制: $current_hard"
log_info "推荐值: $required_value"
if [ "$current_soft" -ge "$required_value" ] && [ "$current_hard" -ge "$required_value" ]; then
log_info "✓ 文件句柄数限制已满足要求(>= $required_value)"
return 0
fi
log_warn "文件句柄数限制不满足要求,正在配置..."
# 配置 /etc/security/limits.conf
limits_conf="/etc/security/limits.conf"
backup_file="$limits_conf.bak.$(date +%Y%m%d_%H%M%S)"
# 备份
cp "$limits_conf" "$backup_file"
log_info "备份文件: $backup_file"
# 检查是否已存在满足要求的配置(>= required_value)
existing_soft=$(grep "^[[:space:]]*\*[[:space:]]*soft[[:space:]]*nofile" "$limits_conf" | awk '{print $4}' | head -1)
existing_hard=$(grep "^[[:space:]]*\*[[:space:]]*hard[[:space:]]*nofile" "$limits_conf" | awk '{print $4}' | head -1)
if [ -n "$existing_soft" ] && [ -n "$existing_hard" ]; then
log_info "已存在的 soft nofile 配置: $existing_soft"
log_info "已存在的 hard nofile 配置: $existing_hard"
if [ "$existing_soft" -ge "$required_value" ] && [ "$existing_hard" -ge "$required_value" ]; then
log_info "/etc/security/limits.conf 中已存在满足要求的配置"
return 0
fi
fi
# 添加配置
cat >> "$limits_conf" << EOF
# Doris: 增加文件句柄数限制
* soft nofile $required_value
* hard nofile $required_value
EOF
log_info "✓ 已添加文件句柄数配置到 $limits_conf"
log_info "✓ 文件句柄数配置完成"
log_warn "注意: 需要重新登录或重启会话才能生效"
log_info "当前会话可以使用 'ulimit -n $required_value' 临时设置"
}
###############################################################################
# 8. 检查和配置 NTP 服务
###############################################################################
check_and_configure_ntp() {
log_section "检查 NTP 服务"
# 检查常见的 NTP 服务
ntp_services=("ntp" "ntpd" "chronyd" "systemd-timesyncd")
ntp_found=false
for service in "${ntp_services[@]}"; do
if systemctl list-unit-files | grep -q "^${service}.service"; then
ntp_status=$(systemctl is-active "$service" 2>/dev/null)
ntp_enabled=$(systemctl is-enabled "$service" 2>/dev/null)
log_info "发现 NTP 服务: $service"
log_info " 状态: $ntp_status"
log_info " 开机自启: $ntp_enabled"
if [ "$ntp_status" = "active" ]; then
log_info "✓ NTP 服务正在运行"
ntp_found=true
# 显示时间同步状态
if command -v timedatectl &> /dev/null; then
log_info "系统时间同步状态:"
timedatectl status
fi
else
log_warn "NTP 服务 $service 未运行"
log_info "启动命令: sudo systemctl start $service"
log_info "设置开机自启: sudo systemctl enable $service"
fi
break
fi
done
if [ "$ntp_found" = false ]; then
log_warn "未发现 NTP 服务"
log_info "建议安装并配置 NTP 服务以保持时钟同步"
echo ""
log_info "安装 NTP 服务示例:"
echo " Ubuntu/Debian: sudo apt-get install ntp"
echo " CentOS/RHEL: sudo yum install ntp"
echo ""
log_info "启动并设置开机自启:"
echo " sudo systemctl start ntpd"
echo " sudo systemctl enable ntpd"
fi
}
###############################################################################
# 主函数
###############################################################################
main() {
log_info "=========================================="
log_info "Apache Doris OS 检查和配置脚本"
log_info "=========================================="
# 检查 root 权限
check_root
# 显示系统信息
log_section "系统信息"
log_info "操作系统: $(uname -s)"
log_info "内核版本: $(uname -r)"
log_info "架构: $(uname -m)"
log_info "主机名: $(hostname)"
log_info "当前时间: $(date)"
# 执行各项检查和配置
check_and_disable_swap
check_and_disable_thp
check_and_set_vm_max_map_count
check_and_disable_cpu_powersave
check_and_set_tcp_abort_on_overflow
check_firewall
check_and_set_file_limits
check_and_configure_ntp
# 完成
log_section "检查和配置完成"
log_info "所有检查已完成"
log_warn "注意: 部分配置需要重启系统或重新登录才能完全生效"
log_info "建议重启系统以确保所有配置生效"
echo ""
log_info "脚本执行时间: $(date)"
}
# 执行主函数
main
```
|
``` ``` ``` # 给脚本执行权限 chmod +x doris_os_check_and_setting.sh # 使用 bash 执行 sudo bash doris_os_check_and_setting.sh # 或直接执行 sudo ./doris_os_check_and_setting.sh ``` |
```
export JAVA_HOME=/opt/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=/opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin:$PATH
主节点
bin/start_fe.sh --daemon
JAVA_HOME=/opt/jdk-17
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
priority_networks=192.168.73.0/24
mysql -uroot -P9030 -h127.0.0.1
ALTER SYSTEM ADD FOLLOWER "192.168.73.12:9010";
ALTER SYSTEM ADD FOLLOWER "192.168.73.13:9010";
SHOW PROC '/frontends';
doris@ds3:/opt/doris3/apache-doris-3.1.4-bin-x64/fe$ vim conf/fe.conf
JAVA_HOME=/opt/jdk-17
priority_networks=192.168.73.0/24
#在主节点上添加
mysql -uroot -P9030 -h127.0.0.1
ALTER SYSTEM ADD FOLLOWER "192.168.73.13:9010";
SHOW PROC '/frontends';
export JAVA_HOME=/opt/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=/opt/doris/mysql-8.0.32-linux-glibc2.12-x86_64/bin:$PATH
在 192.168.73.13 上执行
bin/start_fe.sh --helper 192.168.73.11:9010 --daemon
ps -ef |grep java
mysql -uroot -P9030 -h127.0.0.1
============================================
be安装
============================================
vim conf/be.conf
export JAVA_HOME=/opt/jdk-17
priority_networks=192.168.73.0/24
在启动 BE 节点前,需要先在 FE 集群中注册该节点:
## connect a alive FE node
mysql -uroot -Pfe_query_port -hfe_ip_address
mysql -uroot -P9030 -h127.0.0.1
## registe BE node
ALTER SYSTEM ADD BACKEND "be_ip_address:be_heartbeat_service_port"
ALTER SYSTEM ADD BACKEND "192.168.73.11:9050";
ALTER SYSTEM ADD BACKEND "192.168.73.12:9050";
ALTER SYSTEM ADD BACKEND "192.168.73.13:9050";
sudo swapoff -a
对于Ubuntu/Debian系统:
```
# 编辑fstab文件
sudo vim /etc/fstab
# 找到包含swap的行,在开头添加#注释掉
# 例如:/swapfile none swap sw 0 0
# 重启生效或执行
sudo swapoff -a
```
对于CentOS/RHEL系统:
```
# 查看当前swap
sudo swapon --show
# 临时关闭
sudo swapoff -a
# 永久关闭(注释掉swap行)
sudo vim /etc/fstab
# 找到swap行,前面加上#注释
# 或者使用sed命令
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
```
su - doris
# 在当前shell中临时设置
ulimit -n 655350
doris@ds1:/opt/doris/apache-doris-3.1.4-bin-x64/be$ bin/start_be.sh --daemon
bin/start_be.sh --daemon
# 查看BE日志
tail -f /opt/doris/apache-doris-3.1.4-bin-x64/be/log/be.INFO
# 查看BE警告日志
tail -f /opt/doris/apache-doris-3.1.4-bin-x64/be/log/be.WARNING
## connect a alive FE node
mysql -uroot -Pfe_query_port -hfe_ip_address
mysql -uroot -P9030 -h127.0.0.1
## check BE node status
show backends;
通常情况下需要注意以下几项状态:
Alive 为 true 表示节点存活
TabletNum 表示该节点上的分片数量,新加入的节点会进行数据均衡,TabletNum 逐渐趋于平均。
mysql> select user();
+--------------------+
| user() |
+--------------------+
| 'root'@'127.0.0.1' |
+--------------------+
1 row in set(0.03 sec)
-- modify the password for current user
SET PASSWORD = PASSWORD('Aa123456');
-- 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;
================================
关闭后重新启动
cd /opt/doris/apache-doris-3.1.4-bin-x64/fe/
主节点
bin/start_fe.sh --daemon
从节点
bin/start_fe.sh --helper 192.168.73.11:9010 --daemon
BE节点
sudo swapoff -a
ulimit -n 655350
cd /opt/doris/apache-doris-3.1.4-bin-x64/be
bin/start_be.sh --daemon
-- 1. 创建用户 'admin',允许从任何主机访问(安全起见,也可以指定具体IP)
CREATE USER 'admin'@'%' IDENTIFIED BY 'Aa123456';
-- 2. 授予所有数据库的所有权限(等效于Doris的超级管理员)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
-- 3. 刷新权限使设置立即生效
GRANT ALL ON *.* TO 'admin'@'%';
-- 查看用户创建情况
SELECT user, host FROM mysql.user WHERE user = 'admin';
-- 查看用户权限
SHOW GRANTS FOR 'admin'@'%';
```
|
``` # 进入 Doris 目录 cd /opt/app/doris # 创建脚本文件 vim start_doris.sh # 粘贴上面的启动脚本内容 vim stop_doris.sh # 粘贴上面的停止脚本内容 vim check_doris.sh # 粘贴上面的状态检查脚本内容 # 添加执行权限 chmod +x start_doris.sh stop_doris.sh check_doris.sh ``` ``` # 启动 Doris(按顺序:FE -> BE) ./start_doris.sh # 停止 Doris(按顺序:BE -> FE) ./stop_doris.sh # 强制停止所有进程 ./stop_doris.sh --force # 检查状态 ./check_doris.sh # 查看帮助(可以添加到脚本中) ./start_doris.sh --help ./stop_doris.sh --help ``` 下面的网址可以看doris的信息 http://localhost:8040/ |
|
|
|
|
|
|
|
# Apache Doris 单机单节点安装指南
## 📋 目录
1. [环境准备](#环境准备)
2. [Java 安装配置](#java-安装配置)
3. [MySQL 客户端安装](#mysql-客户端安装)
4. [Doris 下载安装](#doris-下载安装)
5. [FE 配置启动](#fe-配置启动)
6. [BE 配置启动](#be-配置启动)
7. [用户权限配置](#用户权限配置)
8. [启动停止操作](#启动停止操作)
9. [连接验证](#连接验证)
10. [常见问题](#常见问题)
---
## 环境准备
### 系统要求
- **操作系统**:Linux(推荐 CentOS 7+ / Ubuntu 18.04+)
- **CPU**:建议 8 核以上,最低 4 核
- **内存**:建议 16GB(为 CPU 的 2-4 倍),最低 8GB
- **磁盘**:建议 SSD,EXT4 或 XFS 文件系统
- **网络**:万兆网卡推荐
### 检查 CPU 指令集
```bash
# 检查是否支持 AVX2 指令集
cat /proc/cpuinfo | grep avx2
# 如果不支持 AVX2,需要下载 no AVX2 版本
```
### 系统优化配置
```bash
#!/bin/bash
# Doris 系统优化脚本
# 1. 关闭 Swap
sudo swapoff -a
# 永久关闭:注释 /etc/fstab 中的 swap 行
sudo sed -i '/^.*swap.*swap/s/^/#/' /etc/fstab
# 2. 关闭透明大页(THP)
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
# 永久设置
sudo cat >> /etc/rc.local << 'EOF'
# Doris: 设置透明大页为 madvise
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
sudo chmod +x /etc/rc.local
# 3. 设置虚拟内存区域
sudo sysctl -w vm.max_map_count=2000000
echo "vm.max_map_count = 2000000" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 4. 设置文件句柄数
ulimit -n 655350
# 添加到 ~/.bashrc 永久生效
echo "ulimit -n 655350" >> ~/.bashrc
# 5. 禁用 CPU 省电模式(可选)
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 6. 关闭防火墙(测试环境)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 或者开放必要端口
# sudo firewall-cmd --zone=public --add-port=9030/tcp --permanent
# sudo firewall-cmd --zone=public --add-port=9031/tcp --permanent
# sudo firewall-cmd --zone=public --add-port=8030/tcp --permanent
# sudo firewall-cmd --zone=public --add-port=9050/tcp --permanent
# sudo firewall-cmd --reload
echo "✓ 系统优化配置完成"
```
---
## Java 安装配置
Doris 需要 JDK 17 环境。
### 下载 JDK 17
```bash
# 创建目录
mkdir -p /opt/app
# 下载 JDK 17(以 Oracle JDK 为例)
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
# 或使用 OpenJDK
wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz
```
### 安装配置
```bash
# 解压
cd /opt/app
tar -xvf jdk-17_linux-x64_bin.tar.gz
# 配置环境变量
vim ~/.bashrc
# 添加以下内容
export JAVA_HOME=/opt/app/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
source ~/.bashrc
# 验证安装
java -version
```
**预期输出**:
```
java version "17.0.x"
Java(TM) SE Runtime Environment (build 17.0.x+xx)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.x+xx, mixed mode, sharing)
```
---
## MySQL 客户端安装
Doris 的 FE 节点提供 MySQL 协议接口,需要 MySQL 客户端连接。
### 安装 MySQL 客户端
**Ubuntu/Debian**:
```bash
sudo apt update
sudo apt install mysql-client -y
```
**CentOS/RHEL**:
```bash
sudo yum install mysql -y
```
**或使用官方二进制**:
```bash
# 下载
wget https://dev.mysql.com/get/mysql-8.0-linux-glibc2.28-x86_64.tar.xz
# 解压
tar -xvf mysql-8.0-linux-glibc2.28-x86_64.tar.xz -C /opt/app/
# 配置环境变量
vim ~/.bashrc
export PATH=/opt/app/mysql/bin:$PATH
source ~/.bashrc
# 验证
mysql --version
```
---
## Doris 下载安装
### 创建安装目录
```bash
mkdir -p /opt/app/doris
cd /opt/app/doris
```
### 下载 Doris
```bash
# 下载最新稳定版(3.1.4)
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.1.4-bin-x64.tar.gz
# 解压
tar -xvf apache-doris-3.1.4-bin-x64.tar.gz
# 创建软链接(可选)
ln -s apache-doris-3.1.4-bin-x64 doris
```
### 目录结构
```
/opt/app/doris/
├── apache-doris-3.1.4-bin-x64/
│ ├── fe/ # Frontend 前端
│ │ ├── bin/
│ │ ├── conf/
│ │ ├── lib/
│ │ └── log/
│ └── be/ # Backend 后端
│ ├── bin/
│ ├── conf/
│ ├── lib/
│ ├── log/
│ └── storage/
```
---
## FE 配置启动
FE(Frontend)是 Doris 的前端节点,负责元数据管理、用户请求接入、查询解析、查询规划等。
### 配置 FE
```bash
cd /opt/app/doris/apache-doris-3.1.4-bin-x64
# 编辑配置文件
vim fe/conf/fe.conf
```
**最小化配置**(内存 1GB):
```properties
# Java 环境
JAVA_HOME=/opt/app/jdk-17
# 网络配置(根据实际网段修改)
priority_networks=10.0.8.0/24
# 内存配置(默认 8GB,调整到 1GB)
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Darrow.enable_null_check_for_get=false --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 --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"
```
**说明**:
- `priority_networks`:指定 FE 监听的 IP 网段,避免多网卡问题
- `JAVA_OPTS_FOR_JDK_17`:JVM 参数,根据内存调整(生产环境建议 8GB 以上)
### 启动 FE
```bash
# 后台启动
fe/bin/start_fe.sh --daemon
# 查看日志
tail -f fe/log/fe.out
tail -f fe/log/fe.log
```
**预期日志输出**:
```
2026-03-24 20:00:00.000 INFO [main] o.a.d.p.PaloFe.start():67 - FE started successfully
```
### 验证 FE 状态
```bash
# 检查进程
ps aux | grep doris_fe
# 检查端口
# 9030: MySQL 协议端口
# 9031: HTTP 端口
sudo netstat -tlnp | grep java
```
---
## BE 配置启动
BE(Backend)是 Doris 的后端节点,负责数据存储、计算执行。
### 配置 BE
```bash
vim be/conf/be.conf
```
**最小化配置**(内存 1GB):
```properties
# Java 环境
JAVA_HOME=/opt/app/jdk-17
# 网络配置
priority_networks=10.0.8.0/24
# 内存配置(1GB)
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -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=false -Dsun.java.command=DorisBE -XX:-CriticalJNINatives -XX:+IgnoreUnrecognizedVMOptions -Darrow.enable_null_check_for_get=false --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 --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"
```
**内存配置说明**:
| 内存 | -Xmx/-Xms | -XX:MaxMetaspaceSize | -XX:MaxDirectMemorySize | GC 策略 |
|-----|-----------|---------------------|------------------------|---------|
| 500MB | 500m | 128m | 256m | UseSerialGC |
| 1GB | 1024m | 256m | 512m | UseG1GC |
| 2GB | 2048m | 512m | 1024m | UseG1GC |
| 8GB | 8192m | 1024m | 2048m | UseG1GC |
### 注册 BE 节点
**重要**:在启动 BE 之前,必须先在 FE 中注册该节点。
```bash
# 连接 FE
mysql -uroot -P9030 -h127.0.0.1
# 添加 BE 节点
ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";
# 退出
exit;
```
**说明**:
- `9050` 是 BE 的心跳端口
- 使用 `127.0.0.1` 或实际 IP
### 启动 BE
```bash
# 后台启动
be/bin/start_be.sh --daemon
# 查看日志
tail -f be/log/be.INFO
tail -f be/log/be.out
```
**预期日志输出**:
```
2026-03-24 20:05:00.000 INFO [main] o.a.d.b.Bootstrap.start():185 - Backend started successfully
```
### 验证 BE 状态
```bash
# 检查进程
ps aux | grep doris_be
# 检查端口
# 9050: 心跳端口
# 9060: BE 端口
# 8040: HTTP 端口
# 8060: BRPC 端口
sudo netstat -tlnp | grep doris_be
```
### 在 FE 中检查 BE 状态
```bash
mysql -uroot -P9030 -h127.0.0.1
# 查看 BE 状态
SHOW PROC '/backends'\G
# 预期输出(Alive: true)
# *************************** 1. row ***************************
# BackendId: 1770282089686
# Host: localhost
# HeartbeatPort: 9050
# BePort: 9060
# HttpPort: 8040
# BrpcPort: 8060
# LastStartTime: 2026-03-24 20:05:00
# LastHeartbeat: 2026-03-24 20:06:14
# Alive: true
```
**关键字段**:
- `Alive: true`:BE 节点正常
- `Status`:最后心跳时间正常
- 如果 `Alive: false`,检查日志和配置
---
## 用户权限配置
### 创建管理员用户
```sql
-- 连接 FE
mysql -uroot -P9030 -h127.0.0.1
-- 1. 修改 root 密码(可选)
SET PASSWORD = PASSWORD('Aa123456');
-- 2. 创建管理员用户
CREATE USER 'dba'@'%' IDENTIFIED BY 'Aa123456';
-- 3. 授予管理员权限
GRANT ADMIN_PRIV ON *.* TO 'dba'@'%';
-- 4. 授予授权权限(可授权给其他人)
GRANT GRANT_PRIV ON *.* TO 'dba'@'%';
-- 5. 授予资源权限
GRANT USAGE_PRIV ON RESOURCE *.* TO 'dba'@'%';
```
### 创建数据库和授权
```sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS aisql;
-- 授予数据库所有权限
GRANT ALL ON aisql.* TO 'dba'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
exit;
```
### 使用新用户连接
```bash
mysql -udba -P9030 -h127.0.0.1 -pAa123456
-- 验证
SELECT USER();
SHOW DATABASES;
```
---
## 启动停止操作
### 启动顺序
```bash
# 1. 启动 FE
/opt/app/doris/apache-doris-3.1.4-bin-x64/fe/bin/start_fe.sh --daemon
# 2. 等待 FE 启动完成(约 10-30 秒)
tail -f /opt/app/doris/apache-doris-3.1.4-bin-x64/fe/log/fe.out
# 3. 注册 BE(首次启动)
mysql -uroot -P9030 -h127.0.0.1 -e "ALTER SYSTEM ADD BACKEND '127.0.0.1:9050';"
# 4. 启动 BE
/opt/app/doris/apache-doris-3.1.4-bin-x64/be/bin/start_be.sh --daemon
# 5. 验证 BE 状态
mysql -uroot -P9030 -h127.0.0.1 -e "SHOW PROC '/backends'\G"
```
### 停止顺序
```bash
# 1. 停止 BE
/opt/app/doris/apache-doris-3.1.4-bin-x64/be/bin/stop_be.sh
# 2. 停止 FE
/opt/app/doris/apache-doris-3.1.4-bin-x64/fe/bin/stop_fe.sh
```
### 重启服务
```bash
# 完整重启
/opt/app/doris/apache-doris-3.1.4-bin-x64/be/bin/stop_be.sh
/opt/app/doris/apache-doris-3.1.4-bin-x64/fe/bin/stop_fe.sh
sleep 10
/opt/app/doris/apache-doris-3.1.4-bin-x64/fe/bin/start_fe.sh --daemon
sleep 20
/opt/app/doris/apache-doris-3.1.4-bin-x64/be/bin/start_be.sh --daemon
# 验证
sleep 5
mysql -uroot -P9030 -h127.0.0.1 -e "SHOW PROC '/backends'\G"
```
### 查看服务状态
```bash
# FE 状态
ps aux | grep doris_fe
sudo netstat -tlnp | grep 9030
# BE 状态
ps aux | grep doris_be
sudo netstat -tlnp | grep 9050
# 日志
tail -100 fe/log/fe.out
tail -100 be/log/be.out
```
---
## 连接验证
### MySQL 客户端连接
```bash
# root 用户连接
mysql -uroot -P9030 -h127.0.0.1
# dba 用户连接
mysql -udba -P9030 -h127.0.0.1 -pAa123456
# 远程连接
mysql -udba -P9030 -h<服务器IP> -pAa123456
```
### 基本操作验证
```sql
-- 1. 查看版本
SHOW VARIABLES LIKE 'version';
-- 2. 查看集群状态
SHOW FRONTENDS\G
SHOW BACKENDS\G
-- 3. 创建数据库
CREATE DATABASE test_db;
-- 4. 使用数据库
USE test_db;
-- 5. 创建表
CREATE TABLE test_table (
id INT,
name VARCHAR(50),
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES ("replication_num" = "1");
-- 6. 插入数据
INSERT INTO test_table VALUES (1, 'Alice', 25);
INSERT INTO test_table VALUES (2, 'Bob', 30);
-- 7. 查询数据
SELECT * FROM test_table;
-- 8. 删除测试数据
DROP DATABASE test_db;
```
### Web UI 访问
Doris FE 提供 Web UI 界面:
- **地址**:`http://
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
超简安装:将doris_all.tar.gz解压到/opt/app目录下
doris_all.tar.gz包含以下内容:
```
(base) xt@VM-8-13-ubuntu:/opt/app$ ls
doris jdk-17 mysql os_check.sh
```
```
(base) xt@VM-8-13-ubuntu:/opt/app$ cd doris/
(base) xt@VM-8-13-ubuntu:/opt/app/doris$ ls
be check_doris.sh extensions fe hs_err_pid3845619.log kill_doris.sh ms start_doris.sh stop_doris.sh tools
```
- 其中doris目录为doris的安装目录,
- check_doris.sh为状态检查脚本,
- start_doris.sh为启动脚本,
- stop_doris.sh为停止脚本,
- kill_doris.sh为强制停止脚本。
环境变量
```
export JAVA_HOME=/opt/app/jdk-17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=/opt/app/mysql/bin:$PATH
```
doris相关的环境变量在start_doris.sh脚本中设置,确保在执行脚本前已经设置了JAVA_HOME和PATH环境变量。
```
(base) xt@VM-8-13-ubuntu:/opt/app/doris$ cat start_doris.sh
#!/bin/bash
# start_doris.sh - Doris 数据库启动脚本
# 执行顺序: 系统设置 -> FE -> BE
DORIS_HOME="/opt/app/doris"
FE_HOME="$DORIS_HOME/fe"
BE_HOME="$DORIS_HOME/be"
JAVA_HOME="/opt/app/jdk-17"
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
netstat -tlnp | grep 9060 # 检查BE端口是否在监听
# 查看BE日志文件,通常在be/log/目录下
tail -100f be/log/be.INFO
```
esh], load mem: 0, memtable writers num: 0, active: 0, queue: 0, flush: 0
I20260206 14:18:42.979235 4142491 memtable_memory_limiter.cpp:256] reached hard limit, process memory used 557.47 MB(= 714.29 MB[vm/rss] - 156.83 MB[tc/jemalloc_cache] + 0[reserved] + 0B[waiting_refresh]), load mem: 0, memtable writers num: 0, active: 0, queue: 0, flush: 0
I20260206 14:18:43.032717 4141119 storage_engine.cpp:1214] start to delete unused rowset, size: 0, unused delete bitmap size: 0
I20260206 14:18:43.032776 4141119 storage_engine.cpp:1279] collected 0 unused rowsets to remove, skipped 0 rowsets due to use count > 1, skipped 0 rowsets due to don't need to delete file, skipped 0 rowsets due to delayed expired timestamp. left 0 unused delete bitmap.
I20260206 14:18:43.032784 4141119 storage_engine.cpp:1304] removed all collected unused rowsets
I20260206 14:18:43.647766 4142490 daemon.cpp:351] [MemoryGC] start minor GC, process memory used 721.96 MB exceed soft limit 2.69 GB or sys available memory 313.81 MB less than warning water mark 339.99 MB..
I20260206 14:18:43.647869 4142490 memory_reclamation.cpp:244] [MemoryGC] start GC work load group that enable overcommit, number of group: 1, request_free_memory:160429363, total_exceeded_memory:0, request more than exceeded, try free size = (group used - group limit).
I20260206 14:18:43.647886 4142490 mem_tracker_limiter.cpp:556] [MemoryGC] GC free process top memory overcommit query, , start seek all query, running query and load num: 0
I20260206 14:18:43.648008 4142490 mem_tracker_limiter.cpp:596] [MemoryGC] GC free process top memory overcommit query, seek finished, seek 0 tasks. among them, 0 tasks can be canceled; 0 small tasks that were skipped; 0 tasks is being canceled and has not been completed yet;
I20260206 14:18:43.648020 4142490 mem_tracker_limiter.cpp:604] [MemoryGC] GC free process top memory overcommit query, finished, no task need be canceled.
I20260206 14:18:43.648036 4142490 memory_reclamation.cpp:43] [MemoryGC] end minor GC, free memory 0. cost(us): 224, details: :
FreeTopOvercommitMemoryQuery:
WorkloadGroup:
I20260206 14:18:43.768565 4142490 daemon.cpp:336] [MemoryGC] start full GC, process memory used 865.31 MB exceed limit 2.99 GB or sys available memory 168.84 MB less than low water mark 170.00 MB.
I20260206 14:18:43.768682 4142490 memory_reclamation.cpp:244] [MemoryGC] start GC work load group that enable overcommit, number of group: 1, request_free_memory:320858726, total_exceeded_memory:0, request more than exceeded, try free size = (group used - group limit).
I20260206 14:18:43.769376 4142490 mem_tracker_limiter.cpp:433] [MemoryGC] GC free process top memory used query, , start seek all query, running query and load num: 0
I20260206 14:18:43.769502 4142490 mem_tracker_limiter.cpp:486] [MemoryGC] GC free process top memory used query, seek finished, seek 0 tasks. among them, 0 tasks will be canceled, 0 memory size prepare free; 0 tasks is being canceled and has not been completed yet;
I20260206 14:18:43.769529 4142490 mem_tracker_limiter.cpp:516] [MemoryGC] GC free process top memory used query, cancel finished, 0 tasks canceled, memory size being freed: 0, consist of:
I20260206 14:18:43.770747 4142490 mem_tracker_limiter.cpp:556] [MemoryGC] GC free process top memory overcommit load, , start seek all load, running query and load num: 0
I20260206 14:18:43.770869 4142490 mem_tracker_limiter.cpp:596] [MemoryGC] GC free process top memory overcommit load, seek finished, seek 1 tasks. among them, 0 tasks can be canceled; 1 small tasks that were skipped; 0 tasks is being canceled and has not been completed yet;
I20260206 14:18:43.770880 4142490 mem_tracker_limiter.cpp:604] [MemoryGC] GC free process top memory overcommit load, finished, no task need be canceled.
I20260206 14:18:43.770895 4142490 mem_tracker_limiter.cpp:433] [MemoryGC] GC free process top memory used load, , start seek all load, running query and load num: 0
I20260206 14:18:43.770941 4142490 mem_tracker_limiter.cpp:486] [MemoryGC] GC free process top memory used load, seek finished, seek 1 tasks. among them, 0 tasks will be canceled, 0 memory size prepare free; 0 tasks is being canceled and has not been completed yet;
I20260206 14:18:43.770961 4142490 mem_tracker_limiter.cpp:516] [MemoryGC] GC free process top memory used load, cancel finished, 0 tasks canceled, memory size being freed: 0, consist of:
I20260206 14:18:43.771013 4142490 memory_reclamation.cpp:93] [MemoryGC] end full GC, free Memory 0. cost(us): 2386, details: :
```
# 清理系统缓存(临时解决方案)
sync && echo 3 > /proc/sys/vm/drop_caches
# 查看内存占用最高的进程
top -o %MEM
# 查看详细内存信息
free -m
cat /proc/meminfo
调整BE内存配置
修改 be/conf/be.conf:
# 降低BE内存限制(根据实际物理内存调整)
mem_limit = 2G # 从3.32G降低到2G或更低
# 调整GC相关参数
memory_maintenance_sleep_time_s = 10
tc_use_memory_min = 1073741824 # 1G
# 调整写入内存限制
write_buffer_size = 104857600 # 100MB
长期建议
# 在be.conf中添加更多优化配置
# 限制查询内存
load_process_max_memory_limit_bytes = 1073741824 # 1G
load_process_max_memory_limit_percent = 30
# 启用swap(如果物理内存确实不足)
swap_space_size_limit = 2G
|
|
|
|
|
|
|
|
|
|
|
|
|
|