手把手教你:在无外网的生产服务器上部署Apache Doris 1.2.6(含AVX2兼容性避坑)
企业级内网环境下的Apache Doris深度部署指南从零构建高可用分析平台1. 离线部署的核心挑战与解决方案在金融、军工等安全敏感领域服务器通常运行在严格隔离的网络环境中。这种环境下部署Apache Doris这类分布式分析引擎面临着三大核心挑战依赖闭环问题所有软件包必须预先下载并完整传输到内网环境适配问题老旧硬件对现代指令集的支持不足运维可持续性缺乏外网访问时的长期维护方案以某省级金融机构的实际案例为例他们的生产环境采用Intel Xeon E5-2670 v1处理器无AVX2指令集操作系统为CentOS 7.9完全隔离互联网。部署过程中遇到了BE节点启动失败、Java环境缺失等典型问题。关键发现在测试环境中使用AVX2版本Doris的BE进程在老旧CPU上会直接崩溃而noAVX2版本则能稳定运行。这验证了指令集兼容性的重要性。2. 完整离线部署工具链准备2.1 依赖包全景清单构建离线部署工具链需要准备以下核心组件组件类别具体内容获取方式基础运行时JDK 8/11、GLIBC 2.17、SSH服务Oracle官网/OpenJDK镜像系统库libtinfo.so.5、libstdc.so.6、libjemalloc.so系统ISO或EPEL离线仓库Doris本体apache-doris-1.2.6-bin-x64-noavx2.tar.xzApache Doris官网辅助工具lsof、rsync、nc、telnetCentOS DVD或第三方可信源监控组件Prometheus exporter、Grafana仪表板模板GitHub官方仓库2.2 建立本地Yum仓库对于需要长期维护的环境建议搭建本地Yum源# 在可联网的跳板机上准备仓库 mkdir -p /var/www/html/repos/centos7 reposync -n -p /var/www/html/repos/centos7 --repoidbase --repoidextras --repoidupdates createrepo /var/www/html/repos/centos7/base createrepo /var/www/html/repos/centos7/extras createrepo /var/www/html/repos/centos7/updates # 打包后传输到内网服务器 tar czf centos7-repo.tar.gz -C /var/www/html/repos/centos7 . scp centos7-repo.tar.gz rootinternal-server:/opt内网服务器配置# 解压仓库文件 tar xzf centos7-repo.tar.gz -C /var/www/html/ # 创建本地repo文件 cat /etc/yum.repos.d/local.repo EOF [local-base] nameLocal CentOS Base baseurlfile:///var/www/html/base enabled1 gpgcheck0 [local-extras] nameLocal CentOS Extras baseurlfile:///var/www/html/extras enabled1 gpgcheck0 EOF3. 关键配置优化实践3.1 系统层调优生产环境必须进行以下系统级优化内核参数调整# 增加文件描述符限制 echo * soft nofile 65535 /etc/security/limits.conf echo * hard nofile 65535 /etc/security/limits.conf # 优化TCP协议栈 cat /etc/sysctl.conf EOF net.ipv4.tcp_max_syn_backlog 8192 net.core.somaxconn 32768 vm.swappiness 0 EOF sysctl -p透明大页禁用echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag3.2 Doris专属配置FE节点关键参数# fe.conf http_port 8030 rpc_port 9020 query_port 9030 priority_networks 192.168.1.0/24 meta_dir /data/doris/fe/meta log_dir /data/doris/fe/log # JVM调优 JAVA_OPTS-Xmx16g -Xms16g -XX:UseG1GC -XX:MaxGCPauseMillis500BE节点存储优化# be.conf storage_root_path /data1/storage;/data2/storage disable_storage_medium_check true enable_metric_calculator true # 压缩算法选择根据CPU能力 storage_format_version 2 disable_compaction false segment_compression_type lz44. 高可用架构设计4.1 多FE节点部署最小高可用配置需要3个FE节点1 Leader 2 Follower-- 在第一个FE节点启动后执行 ALTER SYSTEM ADD FOLLOWER fe2:9010; ALTER SYSTEM ADD FOLLOWER fe3:9010;关键检查点确保各节点edit_log_port配置一致时钟偏差不超过5秒建议部署NTP服务各节点JVM堆配置相同4.2 BE节点扩缩容添加BE节点ALTER SYSTEM ADD BACKEND be2:9050;安全下线节点-- 先标记为下线状态 ALTER SYSTEM DECOMMISSION BACKEND be1:9050; -- 检查下线进度 SHOW PROC /backends\G重要提示下线过程中确保集群有足够副本避免数据丢失。对于SSDHDD混合部署环境需额外设置存储策略。5. 典型问题深度排查5.1 BE启动失败排查流程当BE进程异常退出时按以下步骤诊断检查日志级别grep log4j.rootLogger be/conf/be.conf # 应设置为DEBUG级获取详细日志验证指令集支持cat /proc/cpuinfo | grep avx2 # 无输出则表示CPU不支持AVX2JNI加载问题ldd be/lib/doris_be | grep not found # 定位缺失的系统库5.2 查询性能调优慢查询分析工具的使用-- 查看最近10条慢查询 SELECT * FROM information_schema.slow_queries ORDER BY query_time DESC LIMIT 10; -- 获取查询执行计划 EXPLAIN SELECT * FROM large_table WHERE dt2023-01-01;常见优化手段对高频过滤字段建立Bloom Filter索引热点表配置动态分区大宽表启用列存压缩6. 安全加固实践6.1 网络隔离方案推荐架构[应用服务器] → [HAProxy] → [FE节点] → [BE节点] ↑ [管理网络]关键配置使用iptables限制9030/8030端口的访问源BE集群启用IP白名单# be.conf enable_ip_whitelist true ip_whitelist 192.168.1.0/24,10.0.0.0/86.2 审计日志配置启用完整操作审计-- 开启审计功能 SET GLOBAL enable_audit_plugin true; -- 查看审计日志 SHOW AUDIT LOG FROM 2023-01-01 TO 2023-01-02;7. 监控体系构建7.1 关键指标采集必须监控的核心指标包括指标类别具体项告警阈值集群健康BE节点存活数 副本数1查询性能99分位查询耗时 5s存储水位磁盘使用率 85%资源使用BE内存使用率 90%持续5分钟7.2 Prometheus集成采集配置示例# prometheus.yml scrape_configs: - job_name: doris static_configs: - targets: [fe1:8030, fe2:8030] labels: group: fe - targets: [be1:8040, be2:8040] labels: group: beGrafana仪表板应包含集群拓扑状态图查询QPS/耗时趋势压缩任务进度副本均衡状态8. 版本升级策略离线环境升级需要特别注意灰度发布流程先升级一个BE节点验证兼容性然后滚动升级剩余BE节点最后升级FE节点Observer先于Follower回退方案# 备份元数据 rsync -avz /data/doris/fe/meta /backup/meta-$(date %F) # 记录当前版本 mysqldump -h127.0.0.1 -P9030 -uroot --databases __internal_schema doris_meta.sql升级后验证-- 检查所有表状态 ADMIN SHOW REPLICA STATUS; -- 验证基础功能 CREATE DATABASE upgrade_test; USE upgrade_test; CREATE TABLE test(a INT) DISTRIBUTED BY HASH(a) BUCKETS 3; INSERT INTO test VALUES(1),(2),(3); SELECT * FROM test;