Region
前面提到,我们将 TiKV 看做一个巨大的有序的 KV Map,那么为了实现存储的水平扩展,我们需要将数据分散在多台机器上 。这里提到的数据分散在多台机器上和 Raft 的数据复制不是一个概念,在这一节我们先忘记 Raft,假设所有的数据都只有一个副本,这样更容易理解 。
对于一个 KV 系统,将数据分散在多台机器上有两种比较典型的方案:一种是按照 Key 做 Hash,根据 Hash 值选择对应的存储节点;另一种是分 Range,某一段连续的 Key 都保存在一个存储节点上 。TiKV 选择了第二种方式,将整个 Key-Value 空间分成很多段,每一段是一系列连续的 Key,我们将每一段叫做一个 Region,并且我们会尽量保持每个 Region 中保存的数据不超过一定的大小(这个大小可以配置,目前默认是 64MB) 。每一个 Region 都可以用 StartKey 到 EndKey 这样一个左闭右开区间来描述 。
?

文章插图

文章插图
??注意,这里的 Region 还是和 SQL 中的表没什么关系! 请各位继续忘记 SQL,只谈 KV 。
将数据划分成 Region 后,我们将会做两件重要的事情:
- 以 Region 为单位,将数据分散在集群中所有的节点上,并且尽量保证每个节点上服务的 Region 数量差不多
- 以 Region 为单位做 Raft 的复制和成员管理
先看第一点,数据按照 Key 切分成很多 Region,每个 Region 的数据只会保存在一个节点上面 。我们的系统会有一个组件来负责将 Region 尽可能均匀的散布在集群中所有的节点上,这样一方面实现了存储容量的水平扩展(增加新的节点后,会自动将其他节点上的 Region 调度过来),另一方面也实现了负载均衡(不会出现某个节点有很多数据,其他节点上没什么数据的情况) 。同时为了保证上层客户端能够访问所需要的数据,我们的系统中也会有一个组件记录 Region 在节点上面的分布情况,也就是通过任意一个 Key 就能查询到这个 Key 在哪个 Region 中,以及这个 Region 目前在哪个节点上 。至于是哪个组件负责这两项工作,会在后续介绍 。
对于第二点,TiKV 是以 Region 为单位做数据的复制,也就是一个 Region 的数据会保存多个副本,我们将每一个副本叫做一个 Replica 。Repica 之间是通过 Raft 来保持数据的一致(终于提到了 Raft),一个 Region 的多个 Replica 会保存在不同的节点上,构成一个 Raft Group 。其中一个 Replica 会作为这个 Group 的 Leader,其他的 Replica 作为 Follower 。所有的读和写都是通过 Leader 进行,再由 Leader 复制给 Follower 。
大家理解了 Region 之后,应该可以理解下面这张图:
?

文章插图

文章插图
??我们以 Region 为单位做数据的分散和复制,就有了一个分布式的具备一定容灾能力的 KeyValue 系统,不用再担心数据存不下,或者是磁盘故障丢失数据的问题 。这已经很 Cool,但是还不够完美,我们需要更多的功能 。
MVCC
很多数据库都会实现多版本控制(MVCC),TiKV 也不例外 。设想这样的场景,两个 Client 同时去修改一个 Key 的 Value,如果没有 MVCC,就需要对数据上锁,在分布式场景下,可能会带来性能以及死锁问题 。
TiKV 的 MVCC 实现是通过在 Key 后面添加 Version 来实现,简单来说,没有 MVCC 之前,可以把 TiKV 看做这样的:
Key1 -> Value
Key2 -> Value
……
KeyN -> Value
有了 MVCC 之后,TiKV 的 Key 排列是这样的:
Key1-Version3 -> Value
Key1-Version2 -> Value
Key1-Version1 -> Value
……
Key2-Version4 -> Value
Key2-Version3 -> Value
Key2-Version2 -> Value
Key2-Version1 -> Value
……
KeyN-Version2 -> Value
KeyN-Version1 -> Value
……
注意,对于同一个 Key 的多个版本,我们把版本号较大的放在前面,版本号小的放在后面(回忆一下 Key-Value 一节我们介绍过的 Key 是有序的排列),这样当用户通过一个 Key + Version 来获取 Value 的时候,可以将 Key 和 Version 构造出 MVCC 的 Key,也就是 Key-Version 。然后可以直接 Seek(Key-Version),定位到第一个大于等于这个 Key-Version 的位置 。
推荐阅读
- 软件架构、框架、模式、模块、组件、插件、中间件一文打尽
- 剖析架构师工作过程,解密解决方案架构师何以称为销售的军师
- AMD|四连击!AMD主动曝光下代GPU架构:APU史诗级变脸
- 网络架构设计和最佳实践
- 内生安全SD-WAN网络架构与关键设备方案研究
- vivo 全球商城:优惠券系统架构设计与实践
- 领域驱动设计DDD和CQRS架构模式落地实践
- ARM|对标Intel/AMD/苹果 高通自研全新架构PC处理器定了:2023年底见
- 6种事件驱动的架构模式
- 只需一个小故事就可以讲明白:微服务架构
