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

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.java | HA 接口 |
fe/fe-core/.../ha/BDBHA.java | BDBJE 选举实现 |
fe/fe-core/.../ha/FrontendNodeType.java | FE 角色枚举 (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.java | HaProtocol | HA 接口 |
fe/fe-core/.../ha/BDBHA.java | BDBHA | BDBJE 选举实现 |
fe/fe-core/.../ha/FrontendNodeType.java | MASTER, FOLLOWER, OBSERVER | FE 角色枚举 |
fe/fe-core/.../journal/EditLog.java | logEdit() | Journal 持久化 |
fe/fe-core/.../journal/bdbje/ | BDBJEJournal | BDBJE 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。

下一步
- BE 副本: doc-12-be-replica-repair.md——BE 端的副本管理