资讯专栏INFORMATION COLUMN

TIDB中TiKV详解

IT那活儿 / 945人阅读
TIDB中TiKV详解

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


TiKV简介

TiKV 是一个分布式事务型的键值数据库,提供了满足 ACID 约束的分布式事务接口,并且通过 Raft 协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层,为用户写入 TiDB 的数据提供了持久化以及读写服务,同时还存储了 TiDB 的统计信息数据,其内部是有RocksDB构成。
与传统的整节点备份方式不同,TiKV 将数据按照 key 的范围划分成大致相等的切片统称为Region,每一个切片会有多个副本(通常是 3 个),其中一个副本是 Leader,提供读写服务。
TiKV 通过 PD 对这些 Region 以及副本进行调度,以保证数据和读写负载都均匀地分散在各个 TiKV 上,这样的设计保证了整个集群资源的充分利用并且可以随着机器数量的增加水平扩展。


RocksDB详解

RocksDB 作为 TiKV 的核心存储引擎,用于存储 Raft 日志以及用户数据。每个 TiKV 实例中有两个 RocksDB 实例,一个用于存储 Raft 日志(通常被称为 raftdb),另一个用于存储用户数据以及 MVCC 信息,有四个 ColumnFamily:raft、lock、default 和 write:
  • raft 列:用于存储各个 Region 的元信息。仅占极少量空间,用户可以不必关注。
  • lock 列:用于存储悲观事务的悲观锁以及分布式事务的一阶段 Prewrite 锁。当用户的事务提交之后,lock cf 中对应的数据会很快删除掉,因此大部分情况下 lock cf 中的数据也很少(少于 1GB)。如果 lock cf 中的数据大量增加,说明有大量事务等待提交,系统出现了 bug 或者故障。
  • write 列:用于存储用户真实的写入数据以及 MVCC 信息(该数据所属事务的开始时间以及提交时间)。当用户写入了一行数据时,如果该行数据长度小于 255 字节,那么会被存储 write 列中,否则的话该行数据会被存入到 default 列中。由于 TiDB 的非 unique 索引存储的 value 为空,unique 索引存储的 value 为主键索引,因此二级索引只会占用 writecf 的空间。
  • default 列:用于存储超过 255 字节长度的数据。


Region与Raft协议

Region 与副本之间通过 Raft 协议来维持数据一致性,任何写请求都只能在 Leader 上写入,并且需要写入多数副本后(默认配置为 3 副本,即所有请求必须至少写入两个副本成功)才会返回客户端写入成功。
当某个 Region 的大小超过一定限制(默认是 144MB)后,TiKV 会将它分裂为两个或者更多个 Region,以保证各个 Region 的大小是大致接近的,这样更有利于 PD 进行调度决策。同样,当某个 Region 因为大量的删除请求导致 Region 的大小变得更小时,TiKV 会将比较小的两个相邻 Region 合并为一个。
当 PD 需要把某个 Region 的一个副本从一个 TiKV 节点调度到另一个上面时,PD 会先为这个 Raft Group 在目标节点上增加一个 Learner 副本(虽然会复制 Leader 的数据,但是不会计入写请求的多数副本中)。当这个 Learner 副本的进度大致追上 Leader 副本时,Leader 会将它变更为 Follower,之后再移除操作节点的 Follower 副本,这样就完成了 Region 副本的一次调度。

Leader 副本的调度原理也类似,不过需要在目标节点的 Learner 副本变为 Follower 副本后,再执行一次 Leader Transfer,让该 Follower 主动发起一次选举成为新 Leader,之后新 Leader 负责删除旧 Leader 这个副本。


数据读机制

数据的读写都是会想向PD请求一个时间戳,当需要读到某表时,发现该表正在进行写操作表被锁,这时数据库会获取当前时时间戳并等待,待获取到存在有写事件的开始时间大于等于该时间戳时,读任务会再进行读操作,从而避免读取到脏数据。


数据写机制

TIDB数据写入进TiKV中时,每个数据都会至少存在3个副本Region,写入时首先写入Raft日志,再由TiKV根据raft列的日志信息将数据写入到该表所存在的每个Region中,待大部分region数据写入都完成后确保数据不会丢失,则一次的写入操作才算完成。



本文作者:李孝林(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129211.html

相关文章

  • 天真贝叶斯学习机 | TiDB Hackathon 优秀项目分享

    摘要:我们非常希望本届诞生的优秀项目能够在社区中延续下去,感兴趣的小伙伴们可以加入进来哦本文作者是来自团队的杨文同学,他们的项目天真贝叶斯学习机在本届中获得了三等奖最佳创意奖。比赛前一日从广州南站出发,次日抵达北京西站。 Ti Hack 系列 TiDB Hackathon 2018 共评选出六组优秀项目,本系列文章将由这六组项目的成员主笔,分享他们的参赛经验和成果。我们非常希望本届 Hack...

    Anshiii 评论0 收藏0
  • TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

    摘要:本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目在本届中获得了二等奖。用户在平台上进行第一章部署的学习,了解到可以通过进行部署。收到事件后,更新。由于位置是由属性给出的,因此为其加上,即可实 本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观...

    asoren 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<