返回

TiKV 源码解析系列文章(二十)Region Split 源码解析

前端

好的,我这就开始编写文章。

在学习了之前的几篇 raft-rs, raftstore 相关文章之后(如 Raft Propose 的 Commit 和 Apply 情景分析,Raftstore 概览等),raft-rs 以及 raftstore 的流程大家应该基本了解了。其中 raft-rs 解决的是单个…

Region Split 流程分析

现在,raft-rs 和 raftstore 已经将 Raft 协议实现了,一个分布式的 KV 系统的基本组件我们已经实现了,接下来需要解决的问题就是如何进行 key 的分布。在 TiKV 中,key 是分布在不同的 Region 中,当一个 Region 的数据量过大的时候,我们便需要将其进行 Split 操作。本篇文章便带大家对 Region Split 的源码进行解析。

Step 1:Region Scatter

当发现 Region 的数据量达到某个阀值时,便会触发 Scatter 操作。Scatter 操作主要是将 Region 中的数据随机打乱,打乱之后,再将 Region 一分为二。比如原先 Region 为 [a, z),经过 Scatter 之后,变为 [a, m), [n, z),然后将其分裂成两个子 Region。

Step 2:Peer 选举

将 Region 分裂之后,便需要为分裂后的两个子 Region 选举 Peer,需要注意的是,分裂后的两个子 Region 互为副本,也就是说是对方的 Peer。选举 Peer 的过程需要满足以下几个条件:

  • 每个子 Region 必须至少有一个 Peer
  • 每个 Peer 必须在不同的 Store 上
  • 每个 Store 上至多只能有一个 Peer

Step 3:Region 分裂

在为分裂后的两个子 Region 选举出 Peer 之后,就可以正式分裂 Region 了,分裂 Region 主要分为以下几步:

  • 将分裂前 Region 的数据复制到分裂后的两个子 Region 中
  • 将分裂前 Region 的 Raft Log 复制到分裂后的两个子 Region 中
  • 将分裂后的两个子 Region 的元信息更新到 meta 中

Step 4:Region Heartbeat

在 Region 分裂之后,需要将分裂后的两个子 Region 的信息发送给 TiKV 的各个组件,以便 TiKV 的各个组件能够感知到分裂后的两个子 Region。

结束语

本篇文章为大家讲解了 Region Split 的流程,在了解了 Region Split 的流程之后,我们对 TiKV 的整体架构又有了更深的了解。

如果大家对 TiKV 源码解析系列文章感兴趣,可以关注我的公众号「技术博客创作专家」,后续我将会为大家带来更多精彩的内容。

我公众号的内容都是独家原创,版权所有,转载请联系授权。