2. etcd 架构解析:Raft 共识算法与存储引擎

etcd 是一个高可用的分布式键值存储系统,其核心架构围绕 Raft 共识算法 和 BoltDB 存储引擎 构建。理解这两个组件是掌握 etcd 增量备份与灾备自动化的基础。本章将深入解析 Raft 的 Leader 选举、日志复制流程,以及 BoltDB 的底层存储机制。

2.1 Raft 共识算法原理

Raft 是一种用于管理复制日志的共识算法,它通过 Leader 选举 和 日志复制 两个核心过程,确保集群中所有节点状态一致。etcd 使用 Raft 来保证数据的一致性和高可用性。

核心概念: Raft 将节点分为三种角色:Leader(领导者)、Follower(跟随者)和 Candidate(候选者)。正常运行时,只有一个 Leader,其余为 Follower。
Raft 节点角色状态机 Follower 被动响应请求 Candidate 发起选举投票 Leader 处理所有写请求 选举超时 获得多数票 发现更高任期 Leader 或网络分区 选举失败或收到更高任期请求 Follower Candidate Leader

2.2 Leader 选举机制

Leader 选举是 Raft 保证集群可用性的关键。当 Leader 故障或网络分区发生时,Follower 会触发选举流程。

阶段 触发条件 关键行为 结果
选举超时 Follower 在随机超时时间(150-300ms)内未收到 Leader 心跳 增加任期号(term),转换为 Candidate 开始新一轮选举
请求投票 Candidate 向所有节点发送 RequestVote RPC 包含自己的 lastLogIndex 和 lastLogTerm 等待其他节点响应
投票决策 Follower 收到投票请求 比较日志新旧程度,每个任期只能投一票 投票给日志更新的 Candidate
当选 Leader Candidate 获得超过半数(N/2+1)投票 立即发送心跳(AppendEntries)确立权威 开始处理客户端请求
避坑指南: 选举超时时间应设置为随机值,避免多个 Follower 同时成为 Candidate 导致选票分裂。etcd 默认超时范围为 150ms-300ms。

2.3 日志复制流程

所有写操作必须通过 Leader 处理。Leader 将操作封装为日志条目,复制到所有 Follower,确保日志一致后提交。

Raft 日志复制流程 Client Leader 接收写请求 追加日志条目 Follower 1 接收日志复制 追加到本地日志 Follower 2 接收日志复制 追加到本地日志 写请求 AppendEntries AppendEntries 成功响应 成功响应 提交并应用 收到多数响应后
日志复制关键步骤:
  1. 追加日志: Leader 将客户端请求追加到本地日志,状态为 未提交。
  2. 并行复制: Leader 通过 AppendEntries RPC 将日志条目发送给所有 Follower。
  3. 等待多数响应: Leader 等待超过半数 Follower 成功追加日志。
  4. 提交日志: Leader 将日志标记为 已提交,应用到状态机,并通知 Follower 提交。

2.4 存储引擎:BoltDB

etcd 使用 BoltDB 作为底层持久化存储引擎。BoltDB 是一个基于 B+ 树 的嵌入式键值数据库,提供事务性读写能力。

特性 说明 对备份的影响
B+ 树结构 所有数据存储在 B+ 树中,支持范围查询和顺序遍历 增量备份可基于 B+ 树节点版本号实现
事务支持 支持 ACID 事务,读写事务可并发执行 备份时需使用只读事务,避免阻塞写操作
MVCC 多版本并发控制,每个事务看到一致的数据快照 支持基于时间点的增量备份
文件存储 所有数据存储在一个 .db 文件中 备份时直接复制文件可能导致数据不一致
重要提示: BoltDB 不支持热备份(直接复制文件)。etcd 提供了 etcdctl snapshot save 命令创建一致性快照,该命令通过 Raft 层确保数据一致性。

2.5 Raft 与 BoltDB 的协作关系

etcd 的整体架构中,Raft 层负责共识和日志复制,BoltDB 负责持久化存储。两者通过以下方式协作:

  • 日志持久化: Raft 日志条目先写入 BoltDB 的 WAL(Write-Ahead Log)文件,确保崩溃恢复。
  • 状态机应用: 提交的日志条目应用到 BoltDB 的 B+ 树中,形成最终数据。
  • 快照机制: 当 Raft 日志过大时,etcd 会创建 BoltDB 快照,压缩日志并释放磁盘空间。
etcd 存储架构:Raft + BoltDB 协作 Raft 共识层 Leader 选举 日志复制 BoltDB 存储层 B+ 树索引 事务管理 文件系统 .db 文件 WAL 文件 提交日志 持久化 备份关键点 etcdctl snapshot save 通过 Raft 层创建一致性快照,BoltDB 负责持久化存储
备份实践: 理解 Raft 和 BoltDB 的协作关系后,可以设计更高效的备份策略。例如,利用 BoltDB 的 MVCC 特性,在只读事务中获取一致性快照,避免阻塞写操作。