Apache Doris实战部署与运维指南
本文全面介绍了Apache Doris集群的部署配置、性能调优、故障排查和版本升级等核心运维实践。内容涵盖从集群架构规划、硬件配置、网络优化到监控告警、性能分析和数据迁移的完整解决方案,为生产环境提供高可用、高性能的部署指南和运维手册。
集群部署与配置最佳实践
Apache Doris作为一款高性能的MPP分析型数据库,其集群部署与配置直接关系到系统的稳定性、性能和可扩展性。本节将深入探讨Doris集群部署的最佳实践,涵盖硬件规划、网络配置、参数调优等关键方面。
集群架构规划
Apache Doris采用经典的FE(Frontend)和BE(Backend)分离架构,部署前需要合理规划集群规模:
FE节点部署策略
FE节点承担元数据管理和查询解析重任,建议采用以下部署方案:
| 节点类型 | 数量要求 | 硬件配置 | 主要职责 |
|---|---|---|---|
| FE Leader | 1个 | 16核CPU, 32GB内存, SSD存储 | 元数据读写、集群管理 |
| FE Follower | 2-3个 | 16核CPU, 32GB内存, SSD存储 | 元数据同步、故障切换 |
| FE Observer | 按需扩展 | 8核CPU, 16GB内存, SSD存储 | 只读查询负载分担 |
BE节点部署策略
BE节点负责数据存储和查询执行,配置建议如下:
| 数据规模 | BE节点数 | 单节点配置 | 存储规划 |
|---|---|---|---|
| < 10TB | 3-5个 | 32核CPU, 64GB内存 | 4-8块SSD |
| 10-100TB | 5-20个 | 48核CPU, 128GB内存 | 8-12块SSD/HDD混合 |
| > 100TB | 20+个 | 64核CPU, 256GB内存 | 12+块HDD为主 |
网络配置优化
网络是分布式系统的生命线,Doris集群网络配置需特别注意:
# 配置优先级网络(避免选择错误网卡)
priority_networks = 192.168.10.0/24
# 关键端口配置
be_port = 9060 # BE管理端口
webserver_port = 8040 # BE Web服务端口
heartbeat_service_port = 9050 # 心跳端口
brpc_port = 8060 # 高性能RPC端口
# FE端口配置
http_port = 8030 # FE HTTP服务
rpc_port = 9020 # FE RPC服务
query_port = 9030 # 查询服务端口
edit_log_port = 9010 # 元数据同步端口
存储配置最佳实践
存储配置直接影响数据性能和可靠性,推荐采用多路径存储策略:
# BE存储路径配置示例
storage_root_path = /data1/doris,medium:SSD;/data2/doris,medium:SSD;/data3/doris,medium:HDD
# 元数据存储配置(FE)
meta_dir = /opt/doris-meta # 建议使用高性能SSD
存储路径规划表:
| 存储类型 | 推荐介质 | 容量规划 | 适用场景 |
|---|---|---|---|
| 热数据 | SSD/NVMe | 总数据量20-30% | 频繁访问的表分区 |
| 温数据 | SSD/高速HDD | 总数据量30-50% | 定期访问的数据 |
| 冷数据 | HDD | 剩余容量 | 归档和历史数据 |
内存与JVM配置
根据节点角色合理配置内存资源:
# FE节点JVM配置(JDK 17)
JAVA_OPTS_FOR_JDK_17="-Xmx16g -Xms16g -XX:+HeapDumpOnOutOfMemoryError"
# BE节点JVM配置
JAVA_OPTS_FOR_JDK_17="-Xmx32g -Xms32g -XX:+UseG1GC"
# 内存分配比例建议
# BE节点:60-70%给JVM,30-40%给操作系统缓存
# FE节点:80%给JVM,20%系统预留
集群高可用配置
确保集群的高可用性和故障恢复能力:
-- 设置副本数(建议3副本)
ALTER SYSTEM SET default_replication_num = 3;
-- 配置故障恢复策略
ALTER SYSTEM SET tablet_repair_delay_factor_second = 60;
ALTER SYSTEM SET tablet_checker_interval_second = 20;
高可用部署架构:
监控与运维配置
完善的监控是集群稳定运行的保障:
# 日志配置
sys_log_level = INFO
sys_log_roll_mode = SIZE-MB-1024
sys_log_roll_num = 10
audit_log_modules = slow_query, query
# 性能监控指标
enable_metric_calculator = true
metric_republish_interval_ms = 5000
关键监控指标表:
| 监控类别 | 关键指标 | 告警阈值 | 检查频率 |
|---|---|---|---|
| 节点状态 | 节点存活状态 | 任何节点宕机 | 30秒 |
| 磁盘使用 | 存储空间使用率 | >85% | 5分钟 |
| 查询性能 | 平均查询延迟 | >1秒 | 1分钟 |
| 内存使用 | JVM内存使用率 | >90% | 30秒 |
安全配置实践
加强集群安全防护:
# 启用HTTPS加密
enable_https = true
ssl_certificate_path = /path/to/cert.pem
ssl_private_key_path = /path/to/key.pem
# 网络访问控制
# 配置防火墙规则,只开放必要端口
版本升级与扩容
平滑的版本升级和集群扩容策略:
# 滚动升级步骤
1. 逐个升级FE Observer节点
2. 升级FE Follower节点
3. 最后升级FE Leader节点
4. 逐个升级BE节点
# 集群扩容流程
1. 新增BE节点并加入集群
2. 等待数据自动均衡
3. 验证新节点状态
4. 调整负载均衡策略
通过遵循这些最佳实践,可以构建出高性能、高可用的Apache Doris集群,为大数据分析业务提供稳定可靠的基础设施支撑。实际部署时还需根据具体业务需求和硬件环境进行适当调整。
性能调优与监控方案
Apache Doris作为一款高性能的MPP分析型数据库,提供了完善的性能监控和调优机制。通过系统化的监控指标、运行时性能分析和智能调优参数,用户可以全面掌握集群运行状态,快速定位性能瓶颈,并进行针对性的优化。
监控指标体系
Apache Doris构建了多层次、全方位的监控指标体系,涵盖系统资源、查询性能、存储引擎等关键维度。
系统资源监控
Doris通过SystemMetrics模块实时采集系统级指标:
// 系统指标采集配置
SystemMetrics(MetricRegistry* registry,
const std::set<std::string>& disk_devices,
const std::vector<std::string>& network_interfaces);
监控指标包括:
| 指标类别 | 具体指标 | 说明 |
|---|---|---|
| CPU指标 | cpu_user/cpu_system/cpu_idle | CPU使用率分布 |
| 内存指标 | memory_used/memory_available | 内存使用情况 |
| 磁盘指标 | disk_io_time/disk_read_bytes | 磁盘IO性能 |
| 网络指标 | network_send_bytes/network_receive_bytes | 网络吞吐量 |
| 文件描述符 | fd_used/fd_limit | 文件句柄使用情况 |
查询性能监控
Doris的查询统计模块(QueryStatistics)提供详细的查询执行指标:
class QueryStatistics {
public:
std::atomic<int64_t> scan_rows; // 扫描行数
std::atomic<int64_t> scan_bytes; // 扫描字节数
std::atomic<int64_t> cpu_nanos; // CPU耗时(纳秒)
std::atomic<int64_t> returned_rows; // 返回行数
std::atomic<int64_t> max_peak_memory_bytes; // 峰值内存使用
std::atomic<int64_t> current_used_memory_bytes; // 当前内存使用
};
运行时性能分析
Doris提供了强大的运行时性能分析功能,通过RuntimeProfile模块实现细粒度的性能剖析。
性能计数器体系
// 性能计数器定义示例
#define ADD_COUNTER(profile, name, type) (profile)->add_counter(name, type)
#define ADD_TIMER(profile, name) (profile)->add_counter(name, TUnit::TIME_NS)
#define SCOPED_TIMER(c) ScopedTimer<MonotonicStopWatch> timer(c)
// 在代码中使用性能计数器
RuntimeProfile* profile = new RuntimeProfile("QueryExecution");
auto scan_timer = ADD_TIMER(profile, "ScanTime");
auto rows_counter = ADD_COUNTER(profile, "ScanRows", TUnit::UNIT);
{
SCOPED_TIMER(scan_timer);
// 执行扫描操作
rows_counter->update(scan_result.num_rows());
}
性能分析流程图
Doris的性能分析数据流如下所示:
关键性能参数调优
内存配置优化
# BE配置文件(be.conf)内存相关参数
mem_limit=90% # BE进程内存限制
load_process_soft_mem_limit_percent=80 # 导入内存软限制
query_mem_limit=10737418240 # 单个查询内存限制(10GB)
# JVM内存配置
JAVA_OPTS="-Xmx1024m -Xloggc:$LOG_DIR/be.gc.log"
查询并行度调优
-- 会话级并行度设置
SET global parallel_fragment_exec_instance_num=16;
SET global max_scan_range_length=134217728; -- 128MB
-- 查询级Hint设置
SELECT /*+ SET_VAR(parallel_fragment_exec_instance_num=32) */
COUNT(*) FROM large_table;
资源组配置
-- 创建资源组进行资源隔离
CREATE RESOURCE GROUP etl_group
TO
(user='etl_user')
WITH
(
cpu_share=40,
memory_limit=30%,
concurrency_limit=20
);
监控工具与使用
内置Profile查看器
Doris提供了Web端的Profile查看功能,可以通过以下方式访问:
# 启用Profile功能
SET global enable_profile=true;
# 执行查询后查看Profile
SHOW PROFILE FOR QUERY "query_id";
性能分析脚本
Doris内置了profile_viewer.py工具,用于生成可视化的性能分析图:
# 使用profile查看器分析查询
python3 profile_viewer.py -qid "query_id" -t "性能分析"
# 生成性能分析流程图
dot query_profile.dot -T png -o query_profile.png
监控指标导出
Doris支持多种监控数据导出方式:
# 通过REST API获取监控指标
curl -X GET "http://fe_host:8030/api/metrics"
# 使用Prometheus采集指标
scrape_configs:
- job_name: 'doris'
static_configs:
- targets: ['be_host:8040']
常见性能问题排查
内存溢出排查
-- 查看当前内存使用情况
SHOW BACKENDS\G
-- 查看查询内存使用
SHOW PROC '/current_queries'
-- 终止内存占用过大的查询
KILL QUERY "query_id";
慢查询分析
-- 启用慢查询日志
SET global enable_slow_query_log=true;
SET global long_query_time=5; -- 5秒以上为慢查询
-- 分析慢查询模式
SELECT * FROM slow_query_log
WHERE query_time > 5000
ORDER BY query_time DESC
LIMIT 10;
磁盘IO瓶颈排查
# 查看BE磁盘使用情况
SHOW PROC '/backends'\\G
# 监控磁盘IO指标
SELECT * FROM information_schema.be_disk_io_stats
WHERE device_name = 'sdb1';
性能优化最佳实践
索引优化策略
-- 创建合适的索引
ALTER TABLE user_behavior
ADD INDEX idx_user_time (user_id, event_time)
USING BITMAP;
-- 使用前缀索引
ALTER TABLE logs
ADD INDEX idx_api_path (api_path(20));
-- 监控索引效果
ANALYZE TABLE user_behavior UPDATE HISTOGRAM ON user_id, event_time;
数据分布优化
-- 优化数据分布
ALTER TABLE sales
MODIFY PARTITION BY RANGE(sale_date)(
PARTITION p202301 VALUES LESS THAN ("2023-02-01"),
PARTITION p202302 VALUES LESS THAN ("2023-03-01")
) DISTRIBUTED BY HASH(product_id) BUCKETS 32;
-- 检查数据倾斜
SHOW DATA SKEW FROM sales;
查询重写优化
-- 原始查询
SELECT user_id, COUNT(*)
FROM user_behavior
WHERE DATE(event_time) = '2023-01-01'
GROUP BY user_id;
-- 优化后查询
SELECT user_id, COUNT(*)
FROM user_behavior
WHERE event_time >= '2023-01-01'
AND event_time < '2023-01-02'
GROUP BY user_id;
自动化监控告警
关键指标告警规则
# Prometheus告警规则示例
groups:
- name: doris_alerts
rules:
- alert: DorisHighCPUUsage
expr: rate(process_cpu_seconds_total[5m]) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Doris CPU使用率过高"
- alert: DorisHighMemoryUsage
expr: process_resident_memory_bytes / process_virtual_memory_bytes > 0.9
for: 3m
labels:
severity: critical
annotations:
summary: "Doris内存使用率超过90%"
健康检查脚本
#!/bin/bash
# Doris集群健康检查脚本
check_fe_health() {
curl -s "http://$FE_HOST:8030/api/health" | grep -q "OK"
return $?
}
check_be_health() {
local be_status=$(mysql -h$FE_HOST -P9030 -uroot -e "SHOW BACKENDS" | grep "$BE_HOST" | awk '{print $8}')
[ "$be_status" == "true" ]
return $?
}
# 执行健康检查
if check_fe_health && check_be_health; then
echo "Doris集群状态正常"
else
echo "Doris集群异常,请检查"
exit 1
fi
通过完善的性能监控体系和科学的调优策略,Apache Doris能够为企业级数据分析场景提供稳定高效的性能保障。建议用户根据实际业务特点,定期进行性能评估和调优,以确保系统始终处于最佳运行状态。
故障排查与恢复策略
Apache Doris作为一个高性能的MPP分析型数据库,在生产环境中需要面对各种故障场景。本节将详细介绍Doris的故障排查工具、监控手段以及数据恢复策略,帮助运维人员快速定位和解决系统问题。
日志系统与监控配置
Doris提供了完善的日志系统,通过合理的配置可以快速定位问题。主要配置文件包括:
BE节点配置 (be.conf):
# 日志级别配置,支持INFO、WARNING、ERROR、FATAL
sys_log_level = INFO
# 日志滚动模式,按大小滚动
sys_log_roll_mode = SIZE-MB-1024
# 日志文件保留数量
sys_log_roll_num = 10
# 指定详细日志模块
sys_log_verbose_modules = *
# 日志缓冲区级别
log_buffer_level = -1
FE节点配置 (fe.conf):
# 日志目录配置
LOG_DIR = ${DORIS_HOME}/log
# 系统日志级别
sys_log_level = INFO
# 日志模式:NORMAL, BRIEF, ASYNC
sys_log_mode = ASYNC
# 审计日志配置
audit_log_dir = $LOG_DIR
audit_log_modules = slow_query, query
核心故障排查工具
Doris提供了多种内置工具用于故障诊断和恢复:
1. Tablet恢复工具
restore_tablet_tool.sh 是用于从回收站恢复Tablet的关键工具:
# 单Tablet恢复模式
bash restore_tablet_tool.sh -b http://127.0.0.1:8040 -t 12345 -s 11111
# 批量恢复模式(通过文件)
bash restore_tablet_tool.sh -b http://127.0.0.1:8040 -f tablets.txt
批量恢复文件格式:
12345,11111
12346,11111
12347,11111
2. 查询错误分析工具
qerror.py 工具用于分析查询执行计划的误差:
# 配置FE连接
feHttp = "http://localhost:8030"
trace_url = feHttp + '/rest/v2/manager/query/trace_id/{}'
qerror_url = feHttp + '/rest/v2/manager/query/qerror/{}'
# 获取查询误差信息
def get_q_error(trace_id):
headers = {'Authorization': 'BASIC YWRtaW46'}
resp = requests.get(trace_url.format(trace_id), headers=headers)
query_id = json.loads(resp.text)["data"]
resp = requests.get(qerror_url.format(query_id), headers=headers)
return json.loads(resp.text)["qError"]
3. Segment状态监控工具
show_segment_status.py 用于监控表转换进度:
# 查看特定表的转换进度
python show_segment_status.py --table_name my_table
# 查看特定BE节点的转换进度
python show_segment_status.py --be_id 10003
输出示例:
==========SUMMARY(table=my_table)===========
rowset_count: 289845 / 289845
rowset_disk_size: 84627551189 / 84627551189
rowset_row_count: 1150899153 / 1150899153
===========================================
REST API故障恢复接口
Doris通过REST API提供故障恢复能力:
Tablet恢复API
class RestoreTabletAction : public HttpHandlerWithAuth {
public:
void handle(HttpRequest* req) override;
private:
Status _restore(const std::string& key, int64_t tablet_id, int32_t schema_hash);
Status _reload_tablet(const std::string& key, const std::string& shard_path,
int64_t tablet_id, int32_t schema_hash);
bool _get_latest_tablet_path_from_trash(int64_t tablet_id, int32_t schema_hash,
std::string* path);
};
API端点:POST /api/restore_tablet?tablet_id=12345&schema_hash=11111
常见故障场景处理
1. Tablet损坏恢复
2. 查询性能问题排查
监控指标与告警配置
关键监控指标表格:
| 指标类别 | 监控项 | 正常范围 | 告警阈值 |
|---|---|---|---|
| 查询性能 | 查询耗时 | < 1s | > 5s |
| 资源使用 | CPU使用率 | < 70% | > 85% |
| 存储状态 | Tablet健康度 | 100% | < 95% |
| 网络 | 节点间延迟 | < 10ms | > 50ms |
| 内存 | 查询内存使用 | < 80% | > 90% |
自动化恢复策略
Doris支持多种自动化恢复机制:
- 副本自动修复: 检测到副本缺失时自动从其他副本同步
- Tablet自动平衡: 根据负载情况自动调整Tablet分布
- 故障节点自动隔离: 检测到节点故障时自动路由到健康节点
配置示例:
# 启用自动修复
enable_tablet_auto_repair = true
# 设置修复并发度
tablet_repair_concurrency = 3
# 配置健康检查间隔
health_check_interval_seconds = 30
应急处理流程
当遇到严重故障时,建议按照以下流程处理:
- 立即隔离: 停止向故障节点发送请求
- 日志分析: 检查FE/BE日志定位问题根源
- 数据验证: 使用内置工具验证数据完整性
- 逐步恢复: 先恢复核心功能,再处理次要问题
- 事后复盘: 分析根本原因并优化监控策略
通过完善的监控体系、专业的排查工具和有效的恢复策略,Apache Doris能够保证在大规模生产环境中的高可用性和数据安全性。
版本升级与迁移方案
Apache Doris作为企业级MPP分析型数据库,在生产环境中需要确保版本升级和迁移过程的安全性和可靠性。本节将详细介绍Doris的版本升级策略、数据迁移方案以及最佳实践,帮助运维人员顺利完成版本迭代和数据迁移工作。
版本升级策略
Apache Doris支持平滑升级和滚动升级两种主要策略,根据业务需求和集群规模选择合适的方式。
平滑升级流程
平滑升级适用于小版本更新和补丁发布,确保服务不中断:
具体操作步骤:
-
前置检查
-- 检查集群状态 SHOW PROC '/backends'; SHOW PROC '/frontends'; -- 检查正在运行的任务 SHOW BACKUP; SHOW RESTORE; SHOW ALTER TABLE COLUMN; -
元数据备份
-- 创建备份仓库 CREATE REPOSITORY `backup_repo` WITH BROKER `broker_name` ON LOCATION "hdfs://backup/path" PROPERTIES ("username"="user", "password"="pass"); -- 执行全量备份 BACKUP SNAPSHOT db1.backup_2024 TO backup_repo ON (db1.tbl1, db1.tbl2) PROPERTIES ("type"="full"); -
FE节点升级
# 停止FE节点 ./bin/stop_fe.sh # 备份原有版本 cp -r fe fe_backup # 部署新版本 tar -xzf apache-doris-fe-2.1.4-bin.tar.gz cp fe_backup/conf/* fe/conf/ cp fe_backup/doris-meta/* fe/doris-meta/ # 启动FE节点 ./bin/start_fe.sh --daemon -
BE节点升级
# 停止BE节点 ./bin/stop_be.sh # 备份原有版本 cp -r be be_backup # 部署新版本 tar -xzf apache-doris-be-2.1.4-bin.tar.gz cp be_backup/conf/* be/conf/ cp -r be_backup/storage be/ # 启动BE节点 ./bin/start_be.sh --daemon
版本兼容性矩阵
| 当前版本 | 目标版本 | 升级方式 | 注意事项 |
|---|---|---|---|
| 1.2.x | 2.0.x | 全量升级 | 需要重建表分区 |
| 2.0.x | 2.1.x | 平滑升级 | 支持在线升级 |
| 2.1.x | 2.1.x+ | 滚动升级 | 补丁版本更新 |
数据迁移方案
跨版本数据迁移
对于大版本升级(如1.2到2.0),建议采用备份恢复方式进行数据迁移:
-- 在源集群创建备份
BACKUP SNAPSHOT mydb.snapshot_2024 TO repo_oss
ON (mydb.tbl1, mydb.tbl2)
PROPERTIES ("type"="full");
-- 在目标集群恢复数据
RESTORE SNAPSHOT mydb.snapshot_2024 FROM repo_oss
PROPERTIES (
"backup_timestamp"="2024-01-01-00-00-00",
"replication_num"="3"
);
异构数据源迁移
Apache Doris支持从多种数据源迁移数据:
-- 从Hive迁移数据
CREATE TABLE hive_tbl
PROPERTIES (
"external"="true",
"type"="hive",
"hive.metastore.uris"="thrift://hive-metastore:9083"
);
INSERT INTO doris_tbl SELECT * FROM hive_tbl;
-- 从MySQL迁移数据
CREATE TABLE mysql_tbl
PROPERTIES (
"external"="true",
"type"="mysql",
"mysql.host"="mysql-host",
"mysql.port"="3306",
"mysql.user"="user",
"mysql.password"="pass"
);
升级验证与回滚方案
升级后验证
升级完成后必须进行全面的功能验证:
-- 验证集群状态
SHOW PROC '/backends'\G
SHOW PROC '/frontends'\G
-- 验证数据一致性
SELECT COUNT(*) FROM important_table;
SELECT MAX(id) FROM important_table;
-- 验证查询功能
EXPLAIN SELECT * FROM table WHERE date = '2024-01-01';
-- 验证写入功能
INSERT INTO test_table VALUES (1, 'test');
回滚策略
如果升级失败,需要准备完善的回滚方案:
具体回滚操作:
-
FE节点回滚
# 停止当前FE ./bin/stop_fe.sh # 恢复备份版本 rm -rf fe cp -r fe_backup fe # 启动旧版本FE ./bin/start_fe.sh --daemon -
BE节点回滚
# 停止当前BE ./bin/stop_be.sh # 恢复备份版本 rm -rf be cp -r be_backup be # 启动旧版本BE ./bin/start_be.sh --daemon -
数据修复
-- 检查并修复表副本 ADMIN REPAIR TABLE db1.tbl1; -- 恢复备份数据(极端情况) RESTORE SNAPSHOT db1.backup_2024 FROM backup_repo;
最佳实践与注意事项
升级前准备
-
环境检查清单
- 磁盘空间充足(至少预留50%空间)
- 网络连通性正常
- 备份完成并验证可用
- 业务低峰期时间窗口确认
-
配置检查
# 检查重要配置项 grep -E "(version|meta|storage)" fe/conf/fe.conf grep -E "(version|storage|port)" be/conf/be.conf
升级过程监控
建立完善的监控体系,关键指标包括:
| 监控指标 | 正常范围 | 异常处理 |
|---|---|---|
| FE节点状态 | Active | 检查日志并重启 |
| BE节点状态 | Alive | 检查磁盘和网络 |
| 查询延迟 | < 1s | 优化查询或暂停业务 |
| 内存使用率 | < 80% | 增加内存或调整配置 |
版本升级常见问题处理
-
元数据兼容性问题
# 检查元数据版本 java -jar meta_tool.jar --db doris-meta --check # 修复元数据 java -jar meta_tool.jar --db doris-meta --upgrade -
数据副本不一致
-- 检查副本状态 SHOW TABLET FROM db1.tbl1 LIMIT 10; -- 触发副本修复 ADMIN REPAIR TABLE db1.tbl1; -
服务启动失败
# 查看详细错误日志 tail -n 100 fe/log/fe.warn.log tail -n 100 be/log/be.warn.log # 检查端口冲突 netstat -tlnp | grep 9030 netstat -tlnp | grep 8030
通过遵循上述版本升级与迁移方案,可以确保Apache Doris集群在版本迭代过程中的稳定性和数据安全性。建议在生产环境升级前,在测试环境充分验证升级流程和兼容性。
总结
Apache Doris的运维管理需要系统化的方法和完善的工具链支持。通过遵循本文提供的最佳实践,包括合理的集群规划、细致的性能调优、有效的故障排查策略以及安全的版本升级方案,可以构建稳定高效的数据分析平台。关键是要建立完善的监控体系,制定详细的应急预案,并在测试环境中充分验证所有变更操作,这样才能确保生产环境的高可用性和数据安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



