本节摘要:Doris 的整体架构可以压缩成一句话:控制平面与数据平面分离,元数据走 Raft 式复制组,数据按 Tablet 散布在无共享的 BE 集群上,查询计划被切分成并行片段同时下发。本节从 MPP 执行模型讲到元数据服务机制,再到三方协同的全景图,为后面两节的深度拆解铺设框架。
阅读完本节,你应当能够:
分析查询的规模化难题在于"数据太大而算力太散"。MPP(大规模并行处理)的回答是把两个东西同时对齐:将逻辑表横向切成成千上万个 Tablet 物理分散到各节点;把 SQL 编译成的执行计划纵向切分成多个 Fragment(片段),每个片段对应一段算子流水线。调度时,FE 把Fragment 实例分发到持有相关数据分片的 BE 上并行执行,各实例只扫本地数据——这就是"计算找数据"而不是"数据找计算",网络传输量因此从全表规模降到聚合中间结果规模。
一个常被忽略的细节是数据倾斜在这个模型里的放大效应:Tablet 是调度的最小单位,某个热点分桶一旦过大,所有并行度调整都救不了那一个拖后腿的实例。这也提前预告了第 3 章的结论——分桶键的选择本质上是在给 MPP 划定公平的起跑线。
两阶段聚合是这个模型的另一块基石。局部节点先做预聚合(partial aggregation),把数亿行压成数十万行中间结果再走网络;最终归并阶段在同一批节点或另一层完成。你看执行计划时看到的 HASH_PARTITIONED 交换、AGGREGATE 出现两次,都是它的痕迹。
FE 集群内部是一个以 BDB JE(Berkeley DB Java Edition)为底的复制组,典型配置为三 Follower。写入操作(建表、导入登记、副本变更)只能由 Master 执行并序列化进日志,其余 Follower 回放日志保持一致;Leader 通过选举产生,宕机后秒级自动切换。Observer 角色订阅同样的数据流但不参与投票,专门用来横向扩展查询入口的承载能力。
这个设计的两个推论值得记住:

把组件图翻译成三个常见场景,架构的"协同性"就具体了。
场景一:夜间批量灌数。 Broker Load 任务由 FE 立项并生成作业计划,实际拉取远端文件的活由各 BE 分担,导入完成后副本状态经 FE 登记。瓶颈点通常不在网络而在目标表的版本堆积,原因见第 4 章。
场景二:白天的看板风暴。 几百个并发查询打到任意一台 FE(通常前面挂负载均衡),每条只携带几毫秒的计划时间。真正的扩展压力落在 BE 的扫描与合并算子上,所以容量评估看的是 BE 内存与磁盘 IO,FE 只要 CPU 不饱和就稳如裁判席。
场景三:一台 BE 宕机。 该节点上的 Tablet 少了一个副本,但查询并不中断——其他副本顶上,Master FE 在健康检查确认后触发自动克隆补齐副本。这背后的原则是任何单点的消失都不应改变系统的对外语义,代价只是短暂的重平衡流量。
⚠️ 常见坑:把三台 FE 里的 Observer 当成"灾备 Master"。Observer 不参与选举,它扩展的是读能力;想让故障转移生效,Follower 必须达到奇数多数派。
社区早期版本是标准 Shared-Nothing:BE 既管计算又管存储,副本即冗余。优势是无外部依赖、故障半径小;代价是弹性差——扩容要搬数据,缩容要等迁移完成。云原生方向的存算分离版本把存储下沉到对象存储,计算层变成无状态可秒级伸缩,代价则转移到网络往返与一致性缓存的设计复杂度上。
两条路线没有绝对优劣,判断依据回到你们的负载形状:数据增长平稳、追求极致本地性能,Shared-Nothing 更省心;流量潮汐剧烈、希望闲时释放算力成本,分离形态更划算。本册正文按经典两角色形态展开,涉及分离版本的差异处会单独标注。
值得补一个容量视角:两种形态的"加一台机器"语义不同。Shared-Nothing 加节点带来的是算力与存储的同步增量,容量规划要把两者绑在一起算;分离形态里算力与存储各自独立池化,白天扩查询算力、夜间收回去,存储按用量计费——灵活的代价是网络成了新的第一性资源,跨网络扫描的延迟预算要重新校准。选型时不妨先问一个财务问题:你们的算力利用率曲线是平的还是潮汐的,答案会替你选好路线。
问:FE 挂了查询会中断吗? 单台 FE 故障不影响——客户端连接串里的多台 FE 地址配合负载均衡会自动切到存活节点,已提交的查询不受影响;只有当投票多数派全部失联时元数据服务才不可用,这正是三台奇数起步的原因。给FE 配置进程级守护加多地址连接串,是两个成本极低的可用性投资。
问:元数据会丢吗? 元数据的可靠性由复制组的日志多数派保证,写入确认要求多数成员落盘成功。真正的风险点反而在 BE 侧的数据副本——副本数配二又恰逢双节点同时损坏时才有丢失可能,三副本加跨机架分布把这类概率压到可忽略。元数据丢与数据丢是两个独立的风险域,预案要分开写。
问:为什么不用 ZooKeeper 做协调? 早期架构试过外挂协调件,后来收敛进 FE 进程内部。外挂意味着多一套要运维、要监控、要版本对齐的活性组件,而 BDB JE 嵌入式复制把一致性协议收进同一进程,故障排查时少跨一个系统。这体现的是"轻量架构"哲学——易运维不是宣传词,是每个组件决策的筛选条件。
问:BE 节点配置可以一次到位买三年吗? 建议按十八个月的增长留余量即可。列存压缩率与硬件性价比都在持续改善,三年期的"一步到位"往往在第二年就被更优的机型价格击穿——扩容是在线能力,把容量规划做成滚动节奏比押注单次采购更经济。
下一节走进控制平面的心脏,看看 FE 如何在几十毫秒内把一条 SQL 变成一份可以分发的作战地图。