从零搭建高可用Doris集群:关键配置与实战部署指南

张开发
2026/4/21 19:29:01 15 分钟阅读

分享文章

从零搭建高可用Doris集群:关键配置与实战部署指南
1. 为什么需要高可用Doris集群第一次接触Doris时我天真地以为单节点部署就能满足生产需求。直到某天凌晨3点被报警电话吵醒——唯一的FE节点宕机导致整个数据分析平台瘫痪。这次惨痛教训让我明白高可用不是可选项而是生产环境的必选项。Doris作为MPP架构的分析型数据库其高可用性主要体现在两个层面FEFrontend节点和BEBackend节点。FE负责元数据管理和查询协调BE负责数据存储和计算。想象一下FE就像机场的塔台BE就像跑道和停机坪。如果塔台瘫痪单FE节点故障即使跑道完好BE正常所有航班查询请求也会陷入混乱。典型的高可用架构需要满足FE节点采用奇数个Follower组成选举集群推荐3个BE节点配置多副本存储通常3副本所有节点分布在不同的物理服务器关键服务具备自动故障转移能力我曾见过一个客户为了省钱只用2个FE节点结果网络分区时出现脑裂现象两个FE都认为自己是Master导致数据不一致。这就是为什么一定要用奇数节点——它能在网络分区时通过多数派选举保证集群一致性。2. 部署前的关键准备工作2.1 硬件配置黄金法则在给某电商平台部署Doris时我们发现同样的配置SSD机器比HDD机器查询速度快8倍。硬件选型直接影响集群性能组件最低配置生产推荐配置说明FE节点4C8G8C16G元数据全内存操作需要足够HeapBE节点8C16G16C64G计算密集型建议配备SSD存储HDDSSD/NVMe随机读写性能差10倍以上网络1Gbps10GbpsBE间数据传输带宽敏感特别提醒BE节点要预留30%内存给操作系统。有次我们给BE分配了60GB内存总64GB结果频繁OOM原因是没给系统留够缓冲。2.2 系统调优实战命令原始文章提到的关闭swap、大页压缩等操作还不够全面这里分享我的完整调优清单# 内核参数优化所有节点执行 cat /etc/sysctl.d/doris.conf EOF # 减少TCP连接保持时间 net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_keepalive_intvl 30 net.ipv4.tcp_keepalive_probes 10 # 内存与swap控制 vm.swappiness 0 vm.overcommit_memory 1 # 文件描述符限制 fs.file-max 655350 fs.nr_open 655350 # 网络相关 net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 EOF sysctl -p /etc/sysctl.d/doris.conf # 资源限制配置所有节点 echo * soft nofile 655350 /etc/security/limits.conf echo * hard nofile 655350 /etc/security/limits.conf echo * soft nproc 655350 /etc/security/limits.conf避坑指南曾遇到ulimit不生效的情况原因是systemd服务默认会覆盖限制。需要在FE/BE的systemd服务文件中单独配置LimitNOFILE参数。3. FE集群部署的魔鬼细节3.1 元数据目录的生死抉择原始文章建议元数据目录放在独立磁盘但没说明为什么。我用血泪史告诉你原因有次服务器磁盘故障Doris安装目录所在盘损坏连带元数据一起丢失。元数据目录必须满足使用xfs或ext4文件系统避免btrfs等COW文件系统单独挂载点如/data/doris-meta预留20%空间元数据膨胀可能很快# 正确做法示例 mkdir -p /data/doris-meta chown -R doris:doris /data/doris-meta ln -sf /data/doris-meta /opt/doris/fe/doris-meta3.2 集群初始化的致命陷阱第一次搭建集群时我犯了个低级错误先启动了所有FE节点再执行ALTER SYSTEM ADD FOLLOWER。结果集群陷入混乱状态。正确顺序应该是启动第一个FE自动成为Master通过MySQL客户端连接并添加其他FE在其他节点以--helper参数启动-- 在Master FE执行注意端口是edit_log_port ALTER SYSTEM ADD FOLLOWER doris02:9010; ALTER SYSTEM ADD FOLLOWER doris03:9010;关键检查点执行SHOW FRONTENDS命令时必须确保所有节点的Alive、Join和IsHelper都为true。有次部署发现一个FE始终无法Join查了3小时才发现是防火墙没开9010端口。4. BE部署中的数据分布艺术4.1 存储路径的智能配置原始文章只简单提到了storage_root_path配置其实这里面大有学问。我们给某视频网站做的优化案例# 多磁盘利用SSDHDD混合部署 storage_root_path /ssd1/doris,medium:ssd;/ssd2/doris,medium:ssd;/hdd1/doris,medium:hdd # 冷热数据自动分层 enable_storage_medium_migrate true storage_cooldown_second 604800 # 7天后冷数据降级效果对比全HDD平均查询延迟 2.3sSSDHDD分层平均延迟 0.4s成本仅增加15%性能提升5倍4.2 副本策略的黄金比例Doris默认采用3副本但在实际场景中需要灵活调整-- 创建表时指定副本分布 CREATE TABLE user_behavior ( user_id BIGINT, item_id BIGINT ) DISTRIBUTED BY HASH(user_id) BUCKETS 32 PROPERTIES ( replication_num 3, replication_allocation tag.location.zone1:1, tag.location.zone2:2 );实战经验跨机房部署时让多数副本在主机房减少跨机房写入延迟对重要表增加副本数如用户画像表用5副本临时分析表可降为2副本节省空间5. 高可用验证与故障演练5.1 模拟FE主节点宕机纸上得来终觉浅我坚持在每个集群上线前做故障演练# 在Master FE节点执行 ./bin/stop_fe.sh # 观察集群自动切换应在30秒内完成 mysql -h doris02 -P 9030 -uroot -e SHOW FRONTENDS典型问题排查切换超时检查FE间网络延迟应100ms脑裂现象确认使用了奇数节点数据不一致检查元数据同步日志5.2 BE节点下线操作直接kill BE进程是危险操作正确做法-- 先设置节点为decommission状态 ALTER SYSTEM DECOMMISSION BACKEND be_host:heartbeat_port; -- 检查进度TabletNum应逐渐减少 SHOW BACKENDS\G -- 确认无数据后下线 ALTER SYSTEM DROP BACKEND be_host:heartbeat_port;血泪教训有次直接拔盘导致副本修复耗时6小时。后来我们养成了先decommission再维护的好习惯。6. 性能调优实战技巧6.1 查询内存控制遇到过最棘手的OOM问题原来是并发查询内存失控# 在fe.conf中添加 query_mem_limit 8589934592 # 单查询内存限制8GB parallel_fragment_exec_instance_num 4 # 并发执行实例数监控指标doris_fe_query_mem_limit内存限制命中率doris_be_mem_usageBE内存水位6.2 压缩算法选型通过ab测试对比不同压缩算法效果算法压缩率查询速度CPU消耗适用场景LZ43.2x最快低实时导入ZSTD5.1x快中通用场景SNAPPY2.8x快最低冷数据-- 建表时指定压缩算法 CREATE TABLE clickstream ( dt DATETIME, user_id BIGINT ) PROPERTIES ( compression zstd );7. 日常运维的自动化之道7.1 健康检查脚本这是我每天必跑的检查脚本#!/bin/bash # 检查FE状态 mysql -h doris01 -P 9030 -uroot -e SHOW FRONTENDS; SHOW PROC /frontends\G # 检查BE状态 mysql -h doris01 -P 9030 -uroot -e SHOW BACKENDS; SHOW PROC /backends\G # 检查表健康度 mysql -h doris01 -P 9030 -uroot -e SHOW PROC /statistic\G7.2 备份恢复方案别等数据丢失才想起备份我们的策略每日元数据快照curl http://fe_host:8030/api/backup关键表定期导出EXPORT TABLE db1.tbl1 TO hdfs://backup/path使用BOS/S3插件做异地备份-- 创建远程存储仓库 CREATE REPOSITORY remote_backup WITH BROKER broker_name ON LOCATION bos://your-bucket/path PROPERTIES ( bos_endpoint http://bj.bcebos.com, bos_accesskey your_ak, bos_secret_accesskey your_sk ); -- 执行备份 BACKUP SNAPSHOT db1.backup_20240501 TO remote_backup ON (db1.tbl1, db1.tbl2);8. 常见故障应急手册8.1 BE节点磁盘故障现象BE日志出现Bad channel错误监控显示磁盘IO错误处理步骤立即将该BE标记为decommission更换磁盘后重建数据目录重新添加BE节点# 紧急情况下快速隔离节点 mysql -h doris01 -P 9030 -uroot -e ALTER SYSTEM DECOMMISSION BACKEND \failed_be:9050\8.2 FE元数据损坏现象FE启动失败日志报Missing edits file恢复方案使用最近元数据备份恢复若没有备份尝试从其他FE同步# 从健康FE同步元数据 ./bin/start_fe.sh --helper healthy_fe:9010 --daemon最后建议每个Doris集群都应该配备监控系统重点监控FE/BE进程存活状态节点磁盘使用率查询延迟百分位副本健康度

更多文章