目录
1 Doris简介与部署概述
Apache Doris(原百度Palo)是一款现代化的MPP(大规模并行处理)分析型数据库,以其高性能、实时分析和易用性著称。它能够支持实时数据分析、离线批处理和多维分析等多种业务场景。在进行Doris部署前,合理的系统配置是确保其稳定高效运行的基础。它具有以下核心特点:
- 实时分析:支持实时数据导入和低延迟查询
- 高并发:可支持数千QPS的高并发查询
- 易用性:兼容MySQL协议,标准SQL语法
- 分布式:支持水平扩展,数据自动分片和负载均衡
- 高可用:多副本机制保证数据安全
1.1 Doris存算一体架构解析
存算一体架构(Storage-Compute Integrated Architecture)是指将数据存储和计算能力紧密集成在同一组节点中的设计模式。与传统大数据架构(如Hadoop的存储与计算分离)相比,存算一体架构具有以下核心优势:
- 低延迟:数据本地化处理,避免网络传输开销
- 高吞吐:计算直接访问本地存储,减少I/O瓶颈
- 简化运维:无需维护独立的存储和计算集群
- 资源利用率高:同一节点同时承担存储和计算任务

组件说明:
- FE:接收用户请求、查询解析和规划、元数据管理以及节点管理
- Master:元数据读写
- Follower:可故障切换
- Observer:只读扩展
- BE:承担数据存储和执行查询计划计算
- 数据存储与计算
- 自动分片(Tablet)
- 多副本机制
架构步骤描述:
- 用户请求首先发送到Frontend (FE)。
- FE接收请求后,进行查询解析和规划、元数据管理以及节点管理等操作
- FE中的Master节点负责元数据的读写,其元数据变更会通过BDB JE协议同步给Follower或 Observer节点
- Follower节点负责元数据读取,当Master节点发生故障时,可选取一个Follower节点作为新的Master节点
- Observer节点负责元数据读取,主要用于增加集群的查询并发能力,不参与选主
- FE将相关任务分配给Backend (BE),BE负责数据存储(数据以分片多副本方式存储)和查询计划的执行计算
2 部署前系统检查清单

2.1 关键系统配置详解
2.1.1 关闭swap分区:保障内存性能
原理说明:swap分区是当物理内存不足时,将部分内存数据转存到磁盘的空间。但对于Doris这类高性能数据库:
- 内核的swap策略无法感知Doris内存管理机制
- 频繁swap会导致性能急剧下降
- 可能引发不可预测的查询延迟
操作步骤:
- 临时关闭(立即生效,重启后失效):
swapoff -a
- 永久关闭:
sed -i '/swap/s/^/#/' /etc/fstab
# 注释swap行 swapoff -a
- 验证方法:
free -h | grep Swap
# 应显示Swap行全部为0
2.1.2 关闭透明大页(THP) :稳定内存访问
背景:透明大页是Linux内核将小页(4KB)合并为大页(通常2MB)的机制,但:
- Doris有专门的内存管理策略
- THP可能导致内存碎片和延迟波动
配置命令:
- 临时关闭:
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
- 永久关闭:
cat <<EOF | tee -a /etc/rc.local
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.local
- 检查状态:
cat /sys/kernel/mm/transparent_hugepage/enabled
# 应显示[madvise]为选中状态
2.1.3 调整虚拟内存区域:支撑大数据量
问题背景:Doris依赖内存映射文件处理数据,默认vm.max_map_count(通常65530)不足可能导致:
- "Too many open files"错误
- 查询失败或BE崩溃
- 优化配置:
echo "vm.max_map_count=2000000" | tee -a /etc/sysctl.conf
sysctl -p
- 验证设置:
sysctl vm.max_map_count
# 应显示vm.max_map_count = 2000000
2.1.4 网络优化配置
- 关键参数:
cat <<EOF | tee -a /etc/sysctl.conf
net.ipv4.tcp_abort_on_overflow=1 # 缓冲区溢出时立即重置连接
net.core.somaxconn=32768 # 提高连接队列长度
net.ipv4.tcp_max_syn_backlog=16384 # 增加SYN队列大小
EOF
sysctl -p
2.2 系统资源与安全配置
2.2.1 端口与防火墙设置
- Doris关键端口:
组件 | 默认端口 | 用途 |
FE | 8030 | HTTP服务 |
FE | 9020 | 内部通信 |
BE | 9060 | 内部通信 |
BE | 9070 | HTTP服务 |
- 关闭防火墙(测试环境):
systemctl stop firewalld
systemctl disable firewalld
- 生产环境建议:仅开放必要端口
firewall-cmd --permanent --add-port=8030/tcp
firewall-cmd --permanent --add-port=9020/tcp
firewall-cmd --reload
2.2.2 文件句柄数调整
为何重要:Doris管理大量数据文件,默认限制(通常1024)会导致:
- "Too many open files"错误
- BE进程崩溃
- 配置方法:
echo "* soft nofile 1000000" | tee -a /etc/security/limits.conf
echo "* hard nofile 1000000" | tee -a /etc/security/limits.conf
- 验证方法:
ulimit -n
# 需要重新登录后验证,应显示1000000
2.2.3 NTP时间同步:确保集群一致性
重要性:Doris元数据要求各节点时间偏差<5000ms,否则会导致:
- 元数据不一致
- 副本同步问题
- 查询结果异常
- 配置步骤:
apt install ntp # Ubuntu # 或 yum install ntp # CentOS systemctl start ntpd systemctl enable ntpd
- 检查同步状态:
ntpq -p
3 JDK环境与mysql-client安装
3.1 JDK环境:独立于操作系统的JDK环境
# 这里直接下载JDK 17并解压到目录/usr/local/下,后续在fe配置中直接指定JAVA_HOME即可
tar -zxvf jdk-17.0.15.tar.gz -C /usr/local
3.2 安装mysql-client
Apache Doris采用MySQL网络连接协议,兼容MySQL生态的命令行工具、JDBC/ODBC和各种可视化工具,从MySQL官方网站下载当前Doris主要兼容MySQL 5.7及其以上的客户端MySQL Client。
rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.44-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.44-1.el7.x86_64.rpm
4 详细部署步骤
4.1 部署FE Master节点
4.1.1 创建元数据目录
# 创建独立的元数据目录(建议在SSD上)
mkdir -p /data/doris/fe/meta
mkdir -p /data/doris/fe/log
mkdir -p /data/doris/fe/audit-log
4.1.2 修改FE配置文件(fe.conf)
cd /export/home/project/apache-doris-3.0.2-bin-x64
cp fe/conf/fe.conf fe/conf/fe.conf20250728
cat > fe/conf/fe.conf <<EOF
# 网络配置
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
priority_networks = 192.168.68.0/24
# 根据实际网络修改
# 元数据与日志
meta_dir = /data/doris/fe/meta
# 建议独立SSD存储
sys_log_dir = /data/doris/fe/log
audit_log_dir = /data/doris/fe/audit-log
# JAVA环境配置
JAVA_HOME = /usr/local/jdk-17.0.15
# JVM配置(根据机器内存调整)
# 修改JAVA_OPTS_JAVA_OPTS_FOR_JDK_17行(示例为8G内存机器)
JAVA_OPTS_FOR_JDK_17="-Xmx8g -Xms8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32m -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcE
nabled -XX:ConcGCThreads=4 -XX:ParallelGCThreads=8 -XX:InitiatingHeapOccupancyPercent=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/doris/fe/
dump.hprof"
# 查询优化
qe_max_connection = 4096
# 最大连接数
max_mysql_service_task_threads_num = 4096
query_queue_size = 2000
# 查询队列大小
# 元数据管理
metadata_failure_recovery = true
# 启用元数据恢复
enable_metric_calculator = true
# 启用指标计算
# 并行度控制
parallel_fragment_exec_instance_num = 8
# 每个查询的并行实例数
# 内存管理
mem_limit = 80%
# FE进程内存限制(物理内存百分比)
tablet_create_timeout_second = 10
# 表创建超时
# 统计信息
enable_collect_table_level_scan_stats = true
# 启用表级扫描统计
statistic_cache_columns = 200000
# 统计信息缓存列数
# 监控与诊断
enable_http_server_v2 = true
# 启用新版HTTP服务
http_api_force_base64 = false
# API响应优化
# 高可用配置(单机可不配)
follower_mgr_thread_num = 4
bdbje_heartbeat_timeout_second = 30
bdbje_lock_timeout_second = 1
# 日志级别系统配置
sys_log_level = INFO
sys_log_mode = ASYNC
# 表名大小写配置
lower_case_table_names = 2
EOF
4.1.3 启动FE进程
cd /export/home/project/apache-doris-3.0.2-bin-x64
./fe/bin/start_fe.sh --daemon
4.1.4 检查FE启动状态
# 使用MySQL客户端连接FE
mysql -uroot -P9030 -h192.168.68.10
# 查看FE状态
SHOW FRONTENDS\G
4.2 部署FE集群(高可用)
4.2.1 部署FE Follower节点
在第二个节点、第三个节点上执行:
- 创建元数据目录
# 创建独立的元数据目录(建议在SSD上)
mkdir -p /data/doris/fe/meta
mkdir -p /data/doris/fe/log
mkdir -p /data/doris/fe/audit-log
- 配置FE配置文件
cd /export/home/project/apache-doris-3.0.2-bin-x64
cp fe/conf/fe.conf fe/conf/fe.conf20250728
cat > fe/conf/fe.conf <<EOF
# 网络配置
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
priority_networks = 192.168.68.0/24
# 根据实际网络修改
# 元数据与日志
meta_dir = /data/doris/fe/meta
# 建议独立SSD存储
sys_log_dir = /data/doris/fe/log
audit_log_dir = /data/doris/fe/audit-log
# JAVA环境配置
JAVA_HOME = /usr/local/jdk-17.0.15
# JVM配置(根据机器内存调整)
# 修改JAVA_OPTS_JAVA_OPTS_FOR_JDK_17行(示例为8G内存机器)
JAVA_OPTS_FOR_JDK_17="-Xmx8g -Xms8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32m -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcE
nabled -XX:ConcGCThreads=4 -XX:ParallelGCThreads=8 -XX:InitiatingHeapOccupancyPercent=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/doris/fe/
dump.hprof"
# 查询优化
qe_max_connection = 4096
# 最大连接数
max_mysql_service_task_threads_num = 4096
query_queue_size = 2000
# 查询队列大小
# 元数据管理
metadata_failure_recovery = true
# 启用元数据恢复
enable_metric_calculator = true
# 启用指标计算
# 并行度控制
parallel_fragment_exec_instance_num = 8
# 每个查询的并行实例数
# 内存管理
mem_limit = 80%
# FE进程内存限制(物理内存百分比)
tablet_create_timeout_second = 10
# 表创建超时
# 统计信息
enable_collect_table_level_scan_stats = true
# 启用表级扫描统计
statistic_cache_columns = 200000
# 统计信息缓存列数
# 监控与诊断
enable_http_server_v2 = true
# 启用新版HTTP服务
http_api_force_base64 = false
# API响应优化
# 高可用配置(单机可不配)
follower_mgr_thread_num = 4
bdbje_heartbeat_timeout_second = 30
bdbje_lock_timeout_second = 1
# 日志级别系统配置
sys_log_level = INFO
sys_log_mode = ASYNC
# 表名大小写配置
lower_case_table_names = 2
EOF
- 启动FE节点(第二个及第三个FE在首次启动时需附加–helper参数)
# 启动Follower FE
bin/start_fe.sh --helper 192.168.68.10:9010 --daemon
- 注册FE Follower节点
# 在Master FE上添加Follower
mysql -uroot -P9030 -h192.168.68.10 -e "ALTER SYSTEM ADD FOLLOWER '192.168.68.11:9010'"
mysql -uroot -P9030 -h192.168.68.10 -e "ALTER SYSTEM ADD FOLLOWER '192.168.68.12:9010'"
4.2.2 验证FE集群
SHOW FRONTENDS\G
# 正常输出应显示3个FE节点,其中1个IsMaster为true,其他为false
4.3 部署BE节点
4.3.1 创建数据目录
# 在每个数据磁盘上创建存储目录
mkdir -p /export/home/{data01,data02,data03,data04,data05,data06}/doris/be
chown -R `whoami` /export/home
4.3.2 修改BE配置文件(be.conf)
cd /export/home/project/apache-doris-3.0.2-bin-x64
cp be/conf/be.conf be/conf/be.conf20250728
cat > be/conf/be.conf <<EOF
# 网络配置
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
priority_networks = 192.168.68.0/24
# 根据实际网络修改
# 存储路径(建议SSD)
storage_root_path = /export/home/data01/doris/be
# 多磁盘配置
storage_format_version = 2
# 使用新版存储格式
# JAVA环境配置
JAVA_HOME = /usr/local/jdk-17.0.15
# JVM配置(根据机器内存调整)
# 修改JAVA_OPTS_JAVA_OPTS_FOR_JDK_17行(示例为8G内存机器)
JAVA_OPTS_FOR_JDK_17="-Xmx8g -Xms8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32m -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcE
nabled -XX:ConcGCThreads=4 -XX:ParallelGCThreads=8 -XX:InitiatingHeapOccupancyPercent=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/doris/fe/
dump.hprof"
# 资源限制
mem_limit = 85%
# BE进程内存限制(物理内存百分比)
sys_log_dir = /export/home/data01/doris/be/log
# 查询执行
disable_storage_page_cache = false
# 启用PageCache
storage_page_cache_limit = 40%
# PageCache内存限制
# 线程池配置
brpc_num_threads = 64
# BRPC线程数
publish_version_worker_count = 8
# 版本发布线程数
tablet_worker_count = 12
# 表处理线程数
# 压缩与IO
disable_compression = false
# 启用压缩
compression_type = LZ4
# 压缩算法(LZ4/SNAPPY/ZSTD)
io_threads_num = 16
# IO线程数
# 查询执行优化
enable_vectorized_engine = true
# 启用向量化执行
vectorized_row_batch_size = 4096
# 向量化批大小
scan_queue_mem_limit = 2147483648
# 扫描队列内存限制(2GB)
# 内存管理
enable_system_metrics = true
# 启用系统指标
memory_maintenance_sleep_time_s = 10
# 内存维护间隔
# 列存优化
#segment_cache_capacity = 10737418240
# 10GB Segment缓存
enable_segment_cache = true
# compaction配置
base_compaction_num_threads_per_disk = 2
cumulative_compaction_num_threads_per_disk = 4
cumulative_compaction_check_interval_seconds = 5
# 冷热数据分层(SSD+HDD场景)
# enable_storage_medium_migration = true
# storage_medium_migration_interval_seconds = 3600
EOF
4.3.3 注册并启动BE
# 在FE上注册BE节点
mysql -uroot -P9030 -h192.168.68.10 -e "ALTER SYSTEM ADD BACKEND '192.168.68.10:9050'"
mysql -uroot -P9030 -h192.168.68.10 -e "ALTER SYSTEM ADD BACKEND '192.168.68.11:9050'"
# 启动BE
./be/bin/start_be.sh --daemon
4.3.4 验证BE状态
SHOW BACKENDS\G
关键指标检查:
- Alive: true
- SystemDecommissioned: false
- ClusterDecommissioned: false
- TabletNum: >0(表示数据分片正常)
5 集群验证
5.1 基本功能验证
# 登录
mysql -uroot -P9030 -h192.168.68.10
-- 创建测试数据库
CREATE DATABASE test_db;
-- 创建测试表
CREATE TABLE test_db.example_test (
user_id LARGEINT NOT NULL COMMENT "用户id",
date DATE NOT NULL COMMENT "数据灌入日期时间",
city VARCHAR(20) COMMENT "用户所在城市",
age SMALLINT COMMENT "用户年龄",
sex TINYINT COMMENT "用户性别",
last_visit_date DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
cost BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
max_dwell_time INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
min_dwell_time INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
ENGINE=olap
AGGREGATE KEY(user_id, date, city, age, sex)
DISTRIBUTED BY HASH(user_id) BUCKETS 32;
-- 插入测试数据
INSERT INTO test_db.example_tbl VALUES
(10000, '2025-07-28', '北京', 25, 1, '2025-07-28 10:00:00', 100, 30, 10),
(10001, '2025-07-29', '上海', 30, 2, '2025-07-29 11:00:00', 200, 45, 15);
-- 查询验证
SELECT * FROM test_db.example_test;
6 修改集群密码
# 登录
mysql -uroot -P9030 -h192.168.68.10
# 查看用户
select * from mysql.user\G
# 修改配置密码
SET PASSWORD = PASSWORD('doris_new_passwd');
7 常见问题与解决方案
7.1 FE启动失败
问题现象:fe.log中出现"Failed to load image"错误解决方案:
- 检查元数据目录权限
- 确保磁盘空间充足
- 检查JDK版本是否为1.8+(3.0及以上版本建议使用17)
7.2 BE注册失败
问题现象:SHOW BACKENDS显示Alive为false排查步骤:
- 检查BE日志log/be.INFO
- 验证网络连通性
- 检查端口是否冲突(特别是9050)
7.3 数据均衡问题
问题现象:Tablet分布不均匀解决方案:
-- 手动触发均衡
ADMIN SET FRONTEND CONFIG ('tablet_repair_delay_factor_second' = '60');
8 总结
通过本文的步骤操作,我们已经成功部署了一个Doris存算一体集群。在实际生产环境中,还需要根据业务特点进行相应的持续优化。Doris作为一款高性能的OLAP数据库,在实时数据分析、用户行为分析、日志分析等场景都有出色表现。掌握其部署和运维技能,将大大提升企业数据分析和决策的效率。