【Doris入门】Doris存算一体集群部署详解:从架构原理到部署实践

目录

1 Doris简介与部署概述

1.1 Doris存算一体架构解析

2 部署前系统检查清单

2.1 关键系统配置详解

2.1.1 关闭swap分区:保障内存性能

2.1.2 关闭透明大页(THP) :稳定内存访问

2.1.3 调整虚拟内存区域:支撑大数据量

2.1.4 网络优化配置

2.2 系统资源与安全配置

2.2.1 端口与防火墙设置

2.2.2 文件句柄数调整

2.2.3 NTP时间同步:确保集群一致性

3 JDK环境与mysql-client安装

3.1 JDK环境:独立于操作系统的JDK环境

3.2 安装mysql-client

4 详细部署步骤

4.1 部署FE Master节点

4.1.1 创建元数据目录

4.1.2 修改FE配置文件(fe.conf)

4.1.3 启动FE进程

4.1.4 检查FE启动状态

4.2 部署FE集群(高可用)

4.2.1 部署FE Follower节点

4.2.2 验证FE集群

4.3 部署BE节点

4.3.1 创建数据目录

4.3.2 修改BE配置文件(be.conf)

4.3.3 注册并启动BE

4.3.4 验证BE状态

5 集群验证

5.1 基本功能验证

6 修改集群密码

7 常见问题与解决方案

7.1 FE启动失败

7.2 BE注册失败

7.3 数据均衡问题

8 总结


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数据库,在实时数据分析、用户行为分析、日志分析等场景都有出色表现。掌握其部署和运维技能,将大大提升企业数据分析和决策的效率。
### 部署 Apache Doris 存储计算分离集群 #### 准备工作 为了成功部署存储计算分离模式下的 Apache Doris,需先准备好必要的软硬件资源。具体来说,在开始之前应确保有足够的服务器用于部署各个组件,并确认这些服务器之间网络互通良好。 #### 基础设施搭建 基础设施部分主要涉及操作系统初始化配置、安装 JDK17 及其他可能需要用到的基础软件包。这部分操作不依赖于具体的 Doris 版本或其编译产物,因此可以在任何时间提前准备就绪[^1]。 #### 数据库服务设置 紧接着要做的就是部署 FoundationDB 来作为元数据管理的服务端。FoundationDB 是一个高性能的 NoSQL 键值数据库,它能够很好地支持多版本并发控制等功能特性,非常适合用来承载像 Doris 这样的分析型应用系统的元数据信息。值得注意的是,一旦完成了 FoundationDB 的部署,则可以直接在其之上启动 Meta Service 和 Recycler 组件来进一步完善整个架构体系。 #### 计算节点与存储节点分开布置 对于想要实现真正意义上的存算分离而言,FE (Frontend) 负责处理查询请求并协调各 BE (Backend) 执行实际的数据读写任务;而 BE 则专注于提供高效的列式存储能力给前端调用者使用。两者之间的协作机制使得即使是在大规模分布式环境下也能保持良好的性能表现。此外,由于采用了冷热数据分层的设计理念,所以相比于传统方式能更灵活地应对不同类型的工作负载需求[^2]。 #### 单机或多节点测试环境快速建立指南 如果只是出于学习目的或者是希望尽快验证某些概念性功能的话,那么可以通过官方提供的 Docker 工具链来进行简易版的单机或者伪分布式的集群模拟实验。这种方式不仅简单易懂而且还能有效节省前期准备工作的时间成本。通过编写合适的 `Dockerfile` 文件定义镜像内容,再利用 `docker-compose.yml` 描述容器间的关系,最终就能得到一个相对完整的开发调试平台了[^3]。 ```yaml version: '3' services: fdb: image: foundationdb/foundationdb:latest ports: - "4500:4500" meta-service: build: ./meta_service/ depends_on: - fdb recycler: build: ./recycler/ depends_on: - fdb fe: build: ./fe/ environment: METASERVICE_HOSTS: "meta-service:9030" be: build: ./be/ volumes: - /path/to/data:/var/lib/doris/be/storage ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值