ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Apache Doris部署避坑指南:从单机集群到Presto接入报错排查

Apache Doris部署避坑指南:从单机集群到Presto接入报错排查 Apache Doris这个名字不少做数据仓库、搞OLAP分析的同学应该都听过。从百度内部开源出来到捐给Apache基金会Doris这两年版本迭代非常快用的人也是一拨接一拨。之前群里总有人问Doris的安装部署、集群配置还有人卡在Presto接入Doris上报missing错误这个坎上正好我这么多年折腾过单机、也搭过正式的Doris集群这篇就把从零部署到常见报错排查的完整路径一次性说清楚给正在入坑或者准备入坑的朋友做个参考。先说清楚这篇会覆盖什么Doris的核心架构认知、单机部署跑通、三节点集群搭建、Presto/Trino接入Doris时那个著名的missing报错排查以及N个我在生产环境里踩过的坑。无论你是第一天接触Doris还是已经部署到一半卡住了都能在里面找到能直接用的东西。1. 先搞清楚Doris是个什么家伙1.1 FE和BE两拨人怎么分工Doris能处但是你得先懂它的架构。它是个典型的MPPMassively Parallel Processing架构分析型数据库整个集群里主要干活的就两类进程FE和BE。FE全称Frontend负责SQL解析、查询规划、元数据管理、权限控制这些“大脑”层面的工作。BE全称Backend负责数据存储和实际的计算执行。你可以粗暴理解为FE是餐厅点单的服务员BE是后厨炒菜的师傅。服务员不掌勺后厨不点单但它俩少了谁这顿饭都吃不成。还有个不太起眼但生产环境里跑不掉的角色叫Broker它主要干外部数据导入的事比如从HDFS、S3读文件进来。小规模集群可以暂时不装Broker但是数据量一大导入任务一多Broker基本是标配。数据在BE里不是乱堆的。一张表会被按分区分桶拆成若干个tablet每个tablet有多个副本分散在不同BE节点上。这就是Doris能并行跑得快的地基。搞清楚这个逻辑后面你调分桶策略、加BE节点、看数据均衡思路就顺了。1.2 单机、集群、多集群怎么选部署形态这个东西很多人上来就问“生产环境到底要几台机器”。我的经验是先看业务再看机器别一上来就堆节点。单机版一个FE一个BE一般只适合开发测试、POC验证、跑个小演示。你要是拿它扛线上查询故障转移、并发能力、磁盘扩展都是问题。三节点起步的集群是绝大多数中小企业做数仓比较务实的起点。常见做法是3个FE1个Leader2个Follower3个或更多BE。FE节点管元数据需要高可用BE节点管数据需要横向扩容能力。这种配置扛住千万级、亿级数据量的日常分析查询问题不大。再往上走如果你的业务量大到查询并发上百、数据量到PB级那就得分业务拆多集群了比如数据加工集群和对外查询集群分离。这一步说起来简单做起来涉及跨集群复制、资源隔离很多事新手阶段不用急着上。2. 环境准备与版本选型2.1 硬件规划与操作系统要求Doris对操作系统不算挑CentOS、Ubuntu、麒麟这些主流Linux发行版都能跑。但有两个硬条件必须满足Java环境、网络互通。FE依赖Java版本用Java 8JDK 1.8或者Java 11都行我自己生产环境一直用JDK 8很稳。BE虽然不直接跑Java但整个集群管控链路还是需要JRE最好每台机器都统一装好。内存方面FE一般8G-16G起步BE建议不低于32G。Doris是内存型分析数据库查询热点数据都在内存里算你给BE塞16G内存跑大查询卡是必然的。磁盘强烈建议SSD尤其SSD盘做大表扫描和机械盘完全是两个体验。网卡千兆起步万兆更好BE之间的数据传输、副本同步都吃带宽。还有一个容易被忽略的每台机器的文件句柄数和虚拟内存参数。我见过太多Doris BE进程莫名其妙挂掉的案例最后查下来都是ulimit -n没调。2.2 版本下载与目录规划版本选择上我建议优先选Apache Doris官方Release里最新的稳定版而不是追beta版。Doris的二进制包解压就能用不用编译这一点对运维很友好。下载的时候一定注意CPU指令集架构别在ARM机器上下x86包跑起来核心不对会各种奇怪问题。目录规划建议用统一约定# 建议统一用户部署 sudo useradd -s /bin/bash doris sudo mkdir -p /data/doris sudo chown -R doris:doris /data/doris # 解压之后目录结构以2.x版本为例 /data/doris/apache-doris-2.1.0-bin-x86_64/fe /data/doris/apache-doris-2.1.0-bin-x86_64/be /data/doris/apache-doris-2.1.0-bin-x86_64/broker统一用户、统一目录看着是小事但集群一多这个规范能帮你省非常多的运维成本。我见过有人用root跑Doris出问题排查起来权限混乱得想骂人。3. 第一次部署单机版跑通3.1 配置FE并启动先把FE跑起来让Doris有个“大脑”。进入fe目录主要配置在conf/fe.conf。初次部署最小化的配置就改几个关键项# fe.conf 重点关注这些 meta_dir /data/doris/apache-doris-2.1.0-bin-x86_64/fe/meta http_port 8030 rpc_port 9020 query_port 9030 edit_log_port 9010 priority_networks 192.168.1.0/24前四个端口是FE对外和对内的主要入口。http_port8030是Doris的Web管理界面query_port9030是兼容MySQL协议的连接端口后面你用mysql客户端连Doris就是连这个rpc_port和edit_log_port是FE内部通信用的。priority_networks这个参数非常重要。服务器如果有多块网卡、多个IP不指定它Doris可能选出错误的IP做节点内部通信后面BE心跳不上、节点互相找不到八成都是这个原因。这里写你实际业务网段的CIDR格式。然后启动cd /data/doris/apache-doris-2.1.0-bin-x86_64/fe sh bin/start_fe.sh --daemon启动之后立刻看日志tail -100 /data/doris/apache-doris-2.1.0-bin-x86_64/fe/log/fe.log看到类似Fe start successfully的日志说明FE起来了。这时候浏览器打开http://你的IP:8030能看到Doris管控台登录页默认为空密码可直接登录。这个页面是纯前端展示不用装额外的组件方便得很。3.2 配置BE并注册FE起来之后接着把BE加上。BE的配置在be/conf/be.conf核心配置如下# be.conf 关键配置 storage_root_path /data/doris/data1 be_port 9060 webserver_port 8040 heartbeat_service_port 9050 brpc_port 8060 priority_networks 192.168.1.0/24storage_root_path是数据目录可以配置多个路径用分号隔开。生产库上建议至少挂一块专门的数据盘别把系统盘和Doris数据盘混在一起。一个比较隐蔽的坑数据目录不要有任何已有数据必须是空目录或者不存在的目录否则BE启动会报错。启动BE命令类似cd /data/doris/apache-doris-2.1.0-bin-x86_64/be sh bin/start_be.sh --daemon但注意BE启动起来不等于它已经加入Doris集群了。你还需要通过mysql协议连到Doris把BE节点注册进去mysql -h 127.0.0.1 -P 9030 -uroot ALTER SYSTEM ADD BACKEND 192.168.1.20:9050;这里的端口9050就是BE的heartbeat_service_port不是9060很多人都栽在这一步。注册完成后执行SHOW PROC /backends;或者新版直接用SHOW BACKENDS\G;看Alive字段如果是trueBE就算正式上岗了。3.3 建表与验证节点都活了最后做个快验证。用mysql客户端创建库表、插数据、查询CREATE DATABASE testdb; USE testdb; CREATE TABLE test_user ( id INT, name VARCHAR(50), dt DATE ) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 3 PROPERTIES (replication_num 1); INSERT INTO test_user VALUES (1, zhangsan, 2025-05-01); SELECT * FROM test_user;注意单机版只有一个BE建表属性里replication_num设成1就行副本数不能超过BE节点数这是新手很容易踩的坑。到这里一个能跑的Doris单机实例就齐活了。4. 三节点集群部署实操4.1 多个FE的高可用配置单机版跑通了但生产环境肯定不能这么玩。FE挂了整个集群就瘫了所以要上多FE的高可用。FE节点间用类Paxos协议选主官方推荐用奇数个FE节点1个Leader、2个Follower还能加Observer。Observer只同步元数据不参与选主适合集群规模大、查询并发高时扩展只读能力。假设我们有三台机器node1: 192.168.1.11 (第一个FE放Leader) node2: 192.168.1.12 (加入成Follower) node3: 192.168.1.13 (加入成Follower)第一台节点按单机的办法正常启动FE然后连上它执行ALTER SYSTEM ADD FOLLOWER 192.168.1.12:9010; ALTER SYSTEM ADD FOLLOWER 192.168.1.13:9010;注意这个端口是edit_log_port是FE之间同步元数据的通信端口。然后到node2和node3把fe.conf里的meta_dir指定一个新的空目录再执行cd /data/doris/apache-doris-2.1.0-bin-x86_64/fe sh bin/start_fe.sh --helper 192.168.1.11:9010 --daemon--helper参数告诉新FE去和已有的Leader节点握手把元数据拉到自己本地。这一步特别容易出错很多人新FE起不来就是因为没加helper参数或者helper端口写错了。验证方式SHOW PROC /frontends;可以看到Role字段和Alive字段。三个FE都Alive且有一个为leader高可用就成了。4.2 BE节点的加入与数据分片FE集群就位后三个节点各启动一个BE进程这台机器全跑就是正常的“计算存储一体”布局。每个BE的配置和单机一样storage_root_path改成你自己的数据盘路径然后依次注册ALTER SYSTEM ADD BACKEND 192.168.1.11:9050; ALTER SYSTEM ADD BACKEND 192.168.1.12:9050; ALTER SYSTEM ADD BACKEND 192.168.1.13:9050;注意BE心跳端口9050必须确保网络互通。注册后看SHOW BACKENDS三个都Alive就正常了。BE节点一多Doris会自动触发数据均衡把tablet往新节点上搬。这时候如果建表时replication_num1数据是没有冗余的任意一台BE挂掉就丢数据。集群环境务必将副本数设为2或3PROPERTIES (replication_num 2)如果已经建错表了也别慌用ALTER TABLE改副本数也是可以的。4.3 访问入口与负载均衡三节点FE的查询入口都是9030端口客户端到底连哪个IP生产上一般会在FE前面加一层负载均衡。你可以用HAProxy或Nginx把9030端口的MySQL协议转发到3个FE而后端检查健康就用8030的HTTP接口做health_check。我自己的习惯是客户端 - HAProxy (9030) - 多个FE (query_port9030)原因无他FE虽然支持高可用但客户端连接时还是需要一个稳定的虚拟入口。这一层如果不做每次FE切换你都要去改客户端配置等着被业务同学追着骂吧。5. Presto连Doris那个让无数人失眠的missing错误5.1 Presto通过JDBC连接Doris的原理Doris兼容MySQL协议这个设计给它带来了超强的生态兼容性。所以Presto连接Doris最通用的方式就是走JDBC。原理上Presto现在开源版本是Trino本身不存储数据它靠一堆connector插件把各类数据源抽象成统一的SQL接口。Doris没有原生的Presto connector天然做法是配置一个JDBC数据源连接器让Presto通过JDBC驱动转发SQL给Doris。简单说就是Presto当翻译官JDBC当电话线Doris才是真正的数据仓库。要接上你起码得有两样东西Doris的JDBC驱动JAR包、一份catalog配置。5.2 报错现场还原与逐项排查相信搜过“presto doris错误的missing”这类关键词的人大概率见过下面这个报错的变体Error opening session: Missing required configuration properties: connection-url 或者 Unable to create connection to database: Missing required configuration properties: connection-user我管这类错误叫“缺配置三兄弟”connection-url、connection-user、connection-password。它们本质是同一个问题——你的catalog配置文件里必要的属性没写全或者写错了名字Presto在启动catalog或建立会话的时候死活找不到对应键值。常见原因按概率排个序配置键名写错。比如把connection-url写成了connectionUrl或者connection_url多一个下划线、换一下大小写Presto直接不认。驱动类名不匹配。新版MySQL驱动类应该是com.mysql.cj.jdbc.Driver旧版是com.mysql.jdbc.Driver。如果你驱动版本是8.x却写旧类名或者反过来都会出问题。JDBC驱动JAR包没放到正确目录。放到plugin/jdbc而不是lib目录或者干脆没放连接的时候Presto根本找不到类。URL里没写完整库名或连接参数。比如jdbc:mysql://192.168.1.11:9030/这样结尾不带库名部分场景也会报错。排查这类问题我有个固定的三步法第一步确认catalog配置文件能被Presto正确加载。到Presto目录的etc/catalog/下用ls看看有没有你创建的doris.properties文件后缀必须是.properties否则Presto忽略它。第二步检查属性名和值cat /path/to/presto/etc/catalog/doris.properties重点核对键名大小写、连字符和下划线。Presto的JDBC连接器对键名是大小写敏感的这是测试中最常见的踩坑点。第三步确认JAR包ls /path/to/presto/plugin/jdbc/如果你用的是mysql-connector-java的jar它必须在这个目录里。建议下载的JAR版本不要过分追新选MySQL Connector/J 8.0.x普遍没问题。5.3 可以照抄的连接配置下面这份是实测能跑的DorisPresto配置模板以Trino/Presto近期版本为例我用的是标准JDBC连接器命名# /etc/catalog/doris.properties connector.namejdbc connection-urljdbc:mysql://192.168.1.11:9030/yourdb?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai connection-userroot connection-password你的密码 jdbc.driver-classcom.mysql.cj.jdbc.Driver配置好后重启Presto/Trino然后执行presto --server localhost:8080 --catalog doris --schema yourdb进去跑一句SHOW TABLES FROM doris.yourdb; SELECT * FROM doris.yourdb.test_user LIMIT 10;如果还是报missing但是上面键都对那就要检查Presto的日志里有没有更底层的异常比如ClassNotFound。日志里的根因永远比你眼前的报错信息诚实。另外提一个隐藏点尽量别让Presto的follower还是其他数据源连接同一个Doris FE节点因为FE的query_port自带连接数上限和管理逻辑Presto的连接池一般开得很大容易把FE连接数打满。稳妥做法是走统一的负载均衡入口不要直接怼到单一FE。6. 部署和接入常见问题速查6.1 部署期高频问题把所有节点部署过程中值得记的坑整理成这样一张表照着排查能省半天时间现象可能原因排查方式FE启动失败meta目录报错meta_dir非空或权限不对检查目录是否重复初始化切换doris用户后启动BE一直Alivefalse网络不通或priority_networks没配好telnet 心跳端口查看BE日志be.INFO、be.outBE注册报错注册端口误用了be_port确认注册端口是heartbeat_service_port9050BE进程起来又自动退数据目录不满足要求、磁盘不足查看be/log/be.out末尾报错两个FE无法选主edit_log_port网络不通、节点时间不同步确保三台机器ntp同步检查9010端口互通表查询非常慢分桶策略问题、副本数过高检查tablet分布优化分桶数客户端连接被拒query_port未开放安全组检查9030端口监听状态多网卡机器节点间失联没配priority_networksfe.conf和be.conf都加上该IP段部署期最重要的心得就一句话每启动一个组件第一件事不是继续下一步而是去看日志。Doris的日志体系算友好FE看fe/log/fe.logBE看be/log/be.out把日志看明白了也就没那么多玄学了。6.2 接入期高频问题接入阶段尤其是Presto、BI工具这些外部系统连Doris问题基本集中在协议兼容、连接参数、驱动版本上现象可能原因处理方式Presto报Missing required配置catalog属性名拼写错误核对connection-url、user、password键名Presto报ClassNotFound驱动JAR不在plugin/jdbc目录正确放置驱动包并重启PrestoBI工具连接后中文乱码URL缺少characterEncodingJDBC URL加上characterEncodingutf-8连接偶尔断掉负载均衡健康检查配置有问题用HTTP 8030做健康检查别只看TCP通不通JDBC驱动过旧导致查询报错驱动版本不匹配Doris新语法升级驱动到MySQL Connector/J 8.x查询超时Doris查询并发高、SQL没走分区裁剪用EXPLAIN看执行计划优化SQL6.3 几个降低事故率的运维习惯部署完不是终点日常维护才是大头。我习惯在Doris集群运维里固定做这几件事FE和BE的日志别等出事了再看准备个脚本每天轮转压缩。Doris默认日志滚动策略比较保守数据量大时日志增长很吓人磁盘被日志塞满的案例可不少。定期巡检SHOW PROC /cluster_balance/看数据均衡进度。新增BE节点后均衡可能要跑数小时甚至数天期间查询性能会有轻微的波动提前告知业务方是必要的。数据备份别依赖副本。Doris的副本机制是保证高可用不是备份。定期用BACKUP命令把数据快照备份到远端存储或者通过EXPORT导出到HDFS/对象存储。等真出事的时候你会感谢当时没偷懒。监控方面Doris社区提供的Grafana模板很实用把FE和BE的内存、CPU、磁盘IO、查询延迟都拉出来看。最好配上告警BE存活、磁盘使用率超过80%、FE主节点切换这三类告警优先级最高。最后分享两类我实际掉过的坑一个是BE扩容时的IP变化问题。Doris的BE注册信息里存了IP如果以后你因为迁移机房、调整网段改了BE的IP那Doris的元数据里还是旧IP节点会一直处于bad状态。正确的做法是先ALTER SYSTEM DECOMMISSION BACKEND把老节点下线再重新注册新IP。直接改IP让BE重启绝对是个噩梦。另一个关于Presto的查询性能。JDBC方式连Doris查询是实时下推的但Presto会把Doris当成一个黑盒子有时候两边同时做大JOIN性能会很难看。我的经验是Presto适合做跨源联邦查询或轻量分析真正重的明细报表和批量分析直接连Doris自己跑效率要高得多。架构选型时别把Presto放成核心路径它更适合当统一查询入口。Doris上手不难但生产环境稳定运行靠的是架构理解、配置细节和运维习惯。把今天这套从单机到集群、从部署到接Presto的路径走通一遍你基本就有底气往更大规模推进了。后面等你有几十个BE节点的时候恭喜你这已经是很多公司数仓小组一辈子碰不到的量级了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进