TiDB数据库的存储

概述

本节主要介绍TiKV的核心概念和一些设计思想。

Key-Value pairs

TiKV的数据模型使用Key-Value结构,并且key按照其二进制形式排序,也就是说,用户可以使用方法next来得到比当前Key值大的下一个元素。

注:本文讨论的Key-Value模型和SQL的table无关,本文不讨论有关SQL的任何概念,且仅仅关注如何去实现一个高性能、高可靠性和分布式的Key-Value存储。

Local storage(RocksDB)

  • TiKV作为一个可持久化的存储系统,数据最后也是存储在磁盘上。但是TiKV不直接将数据写在磁盘上,而是将数据存放在RocksDB上,之后再由RocksDB负责数据的存储。
  • 为什么使用RocksDB?因为开发一个独立的存储引擎,尤其是一个高可用的存储引擎需要消耗很大的精力。而RocksDB是由Facebook提供的一个独立的开源存储引擎,且该引擎性能较好。
  • 在TiDB中,你可以把RocksDB当做一个已经持久化的Key-Value Map。

Raft 协议

当一个节点宕机时,存在该节点上的数据怎么办?一种方法是将该节点上的数据备份至多台节点上,因此,当一台节点宕机时,别的节点上的数据还是可用的。也就是说,需要有一种数据备份模式,该模式是可靠的,高效的并且可以解决其中一台节点备份数据丢失的情况。这些,正是Raft协议提供的数据备份模式。

Raft是一个一致性算法,本文仅仅简单介绍一下Rafta,想要了解更多,可参考网站In Search of an Understandable Consensus Algorithm

Raft具有如下特性:

  • Leader选举
  • 成员变化(例如增加副本,删除副本,转移领导权等)
  • 日志备份

TiKV使用Raft来做数据的备份。每个数据变化都会被记录为一个Raft log,通过Raft log备份,数据被安全和可靠的备份至Raft group的多个节点上。同时,Raft协议也规定,当且仅当数据被备份至大多数节点时,本次修改才算成功。
数据修改与备份
数据落盘流程如上图所示:

  1. 写入raft。
  2. 写入RocksDB。

Region

对于Key-Value的分布式系统,Key被分配在哪个机器上有两种方法:

  1. Hash,给定一个Key,将其Hash至对应节点上。
  2. Range,将Key的区间划分,不同区间对应不同的节点。

TiKV使用Range的方法,一个Region对应一个Key的区间:[StartKey, EndKey)
Region
在将数据分给指定的Region后,TiKV将做两个重要的工作:

  • 将数据分发至各个节点上并且使用Region作为基本单位。尽自己最大努力使得每个节点上的Region数量大致相同。
    1. 数据根据其Key值被分配至各个Region中,且当前只保留一份数据。
    2. PD将Region尽可能均匀的分配在各个不同的节点上。这样做的好处主要有两点:首先,整个集群的存储容量是可以水平扩展的(当新增节点时,会进行Region的重新分配,使得所有节点的Region数量尽可能均匀);其次,系统实现了负载均衡(不会出现一个节点很多数据而其它节点很多数据。)
    3. PD上记录了特定的Key所在的Node位置,该措施也便于用户请求的快速定位。
  • 在Region中执行Raft备份和成员关系管理。
    1. 每个Region都被备份至不同的节点上形成该Region的Raft Group。
    Raft_group

MVCC

MVCC(multi-version concurrency control)是指多版本并发控制。想象这样的场景:当两个客户端想同时更改某个数据时,如果没有MVCC,在分布式场景下,可能会出现数据死锁或者写数据性能降低的情况。

TiKV的MVCC实现方式为,每次更改给Key增加一个版本号。在不增加版本号时,TiKV的数据看起来是:

Key1 -> Value
Key2 -> Value
......
KeyN -> Value

使用MVCC后,数据变为:

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
……

注意是按版本号降序排列。

分布式ACID事务

TiKV的事务采用了Google在BigTable中使用的模型:Percolator.,并做了很多优化。详情参见transaction overview

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值