Doris 实战与架构

分析型数据库 / 源码阅读 / LESSON 11

FE 高可用与元数据复制

解释 FE Master/Follower/Observer、BDBJE 选举与 Journal 复制如何支撑高可用。

阅读时间
30 分钟 | **前置阅读**: [doc-00](doc-00-architecture-overview.md) §2 (FE拓扑), [doc-09](doc-09-catalog-journal.md) (Catalog)
学习路径
Doris 实战与架构
内容来源
Doris 深度笔记

预计阅读时间: 30 分钟 | 前置阅读: doc-00 §2 (FE拓扑), doc-09 (Catalog) 下一次阅读: doc-12 (BE副本)


FE 高可用与元数据复制 图 01

1. FE 角色与选举

三种角色

┌────────────┐   ┌──────────────┐  ┌──────────────┐
│ FE Master  │   │ FE Follower  │  │ FE Observer  │
│            │   │              │  │              │
│ ◄Read/Write│   │ ►Read-Only   │  │ ►Read-Only   │
│ 所有 DDL   │   │ 可升任 Master │  │ 不参与选举     │
│ 所有 Journal│   │ 接收 Journal  │  │ 接收 Journal  │
└────────────┘   └──────────────┘  └──────────────┘
      │                 │                 │
      └────────┬────────┴────────┬────────┘
               │                 │
        BDBJE Replicated Group (自带 Leader Election)

选举流程

1. Master FE 崩溃 (或被网络隔离)
2. BDBJE 检测到 Leader 丢失 (心跳超时)
3. BDBJE 从 Follower 中选举新 Leader
   → 候选人: 所有 Follower (按 BDBJE 规则)
   → 观察者: Observer 不参与选举
4. 新 Leader = 新 Master FE
5. 新 Master 开始接受 DDL 写入
6. 旧 Master 恢复后检测到新的 Leader → 降级为 Follower

源码

文件说明
fe/fe-core/.../ha/HaProtocol.javaHA 接口
fe/fe-core/.../ha/BDBHA.javaBDBJE 选举实现
fe/fe-core/.../ha/FrontendNodeType.javaFE 角色枚举 (MASTER/FOLLOWER/OBSERVER)

2. Master-Follower Journal 同步

Write-Ahead Log 模型

Master FE:
  1. DDL 操作 (CREATE TABLE)
  2. 写入 EditLog → BDBJE.put(logId, opLog)
  3. BDBJE 自动复制到 Follower(s) 的 Journal
  4. 所有 Follower 确认收到 (多数确认 = committed)
  5. Master 更新内存 Catalog
  6. 返回成功给客户端

Follower FE:
  1. 接收 BDBJE 复制 → Journal Entry
  2. 回放: apply(logId, opLog) → 更新本地 Catalog 内存
  3. 与 Master 保持同步 (通常延迟 < 100ms)

源码导航

文件关键类/方法职责
fe/fe-core/.../ha/HaProtocol.javaHaProtocolHA 接口
fe/fe-core/.../ha/BDBHA.javaBDBHABDBJE 选举实现
fe/fe-core/.../ha/FrontendNodeType.javaMASTER, FOLLOWER, OBSERVERFE 角色枚举
fe/fe-core/.../journal/EditLog.javalogEdit()Journal 持久化
fe/fe-core/.../journal/bdbje/BDBJEJournalBDBJE Replicated Environment

3. 非 Master 请求转发

ForwardToMaster

客户端 → Follower FE (写请求):
  → CREATE TABLE t (...)
  → Follower 检测: 这是写请求, 我不是 Master
  → ForwardToMaster: 将请求转发到 Master FE
  → Master 处理 → 返回结果 → Follower 中转给客户端

客户端 → Follower FE (读请求):
  → SELECT * FROM t
  → Follower 可直接处理 (本地 Catalog 有数据)
  → 不需要转发

关键: 读请求可负载均衡到 Follower/Observer; 写请求必须经过 Master。这是经典的主从架构。


4. FE 扩缩容

添加 Follower

1. 启动新 FE (配置 role=FOLLOWER)
2. 加入 BDBJE 复制组
3. 从 Master 拷贝 Image (全量快照)
4. 回放 Journal → 追上最新状态
5. 变为正常的 Follower (接收查询 + 接收 Journal)

添加 Observer

1. 启动新 FE (配置 role=OBSERVER)
2. 从 Master 同步 Image + Journal (同 Follower)
3. 变为 Observer (只接收查询, 不参与选举)

5. 常见问题 / 面试题

Q1: BDBJE Leader Election 是否支持脑裂保护? A: 支持。BDBJE 的选举要求多数确认 (majority), 且通过 Replica Ack Timeout 和 Election Quorum 保证不发生脑裂。如果网络分区导致 Master 与多数 Follower 失联, Master 将无法 commit 新写入 (等到承认失败后降级)。

Q2: Follower 落后 Master 太多会怎么处理? A: 如果 Journal 回放落后太多 (超过 metadata_failure_recovery 阈值), Follower 可能被标记为不健康, 此时 BDBJE 可能移除 Follower。Follower 需要重新同步 Image+Journal。


FE HA 选举 & Journal 同步

下一步