返回

TiKV 源码剖析(十):探究 Snapshot 的发送与接收

见解分享

TiKV 凭借 Raft 算法的加持,打造出高可用且强一致性的存储服务。Raft 中的 Snapshot,即 State Machine 数据的完整快照,在以下场景中尤为重要:

  • leader 与 follower/learner 之间进行数据同步
  • 节点宕机后的数据恢复
  • 集群扩容时的新节点加入

Snapshot 的生成

Snapshot 的生成是一个复杂的过程,涉及到以下步骤:

  1. 申请 Snapshot: leader 向需要 Snapshot 的节点(follower 或 learner)发送 Snapshot 请求。
  2. 准备 Snapshot: 接收请求的节点停止所有正在进行的写操作,并开始生成 Snapshot。
  3. 发送 Snapshot: Snapshot 生成完成后,节点向 leader 发送 Snapshot 数据。

Snapshot 的发送

leader 接收 Snapshot 后,会将其存储在本地,并通过 Raft 协议将 Snapshot 发送给其他节点。Snapshot 的发送方式与 Raft 日志项的发送类似,它被封装在 Raft 消息中并通过网络发送。

Snapshot 的接收

接收 Snapshot 的节点会对其进行验证,以确保数据的完整性。验证通过后,节点将 Snapshot 应用到本地 State Machine,并从 Snapshot 中恢复数据。

Snapshot 的优化

TiKV 对 Snapshot 进行了优化,以提高其性能:

  • 增量 Snapshot: 只有 State Machine 中发生变化的部分会被包含在 Snapshot 中。
  • 并行 Snapshot: 支持同时生成多个 Snapshot,以提高效率。
  • 分片 Snapshot: 将 Snapshot 分片,以便于并行发送和接收。

深入示例

为了更深入地了解 Snapshot 的发送和接收,我们以一个示例来说明:

假设 leader 节点收到 follower 节点的 Snapshot 请求。leader 将向 follower 发送一个 Snapshot 请求消息。follower 接收到请求后,停止所有写操作并生成 Snapshot。Snapshot 生成完成后,follower 将其发送给 leader。leader 验证 Snapshot 的完整性后,将 Snapshot 存储在本地并通过 Raft 协议发送给其他节点。其他节点接收到 Snapshot 后,进行验证并将其应用到本地 State Machine。

结论

Snapshot 在 TiKV 中扮演着至关重要的角色,为 Raft 算法提供数据同步和故障恢复的基础。通过对 Snapshot 的深入理解,我们不仅能够更好地掌握 TiKV 的底层原理,还能在系统优化和故障排除中发挥更大的作用。