TiKV详解
作为一个分布式事务型的键值数据库,TiKV提供了满足ACID约束的分布式事务接口,并通过Raft协议保证了多副本数据一致性以及高可用。TiKV是TiDB的存储层,提供了数据持久化以及读写服务,同时存储了TiDB的统计信息数据。

RocksDB详解
RocksDB是TiKV的核心存储引擎,用于存储Raft日志以及用户数据。每个TiKV实例中有两个RocksDB实例,其中一个用于存储Raft日志,另一个用于存储用户数据以及MVCC信息。
在RocksDB中,每个TiKV实例有四个ColumnFamily:raft、lock、default和write,其中raft列用于存储各个Region的元信息,用户无需关注。lock列用于存储悲观锁以及分布式事务的Prewrite锁,在数据提交后会被快速删除。write列用于存储用户真实的写入数据以及MVCC信息,而default列用于存储超过长度阈值的数据。
Region与Raft协议
Region与副本之间通过Raft协议来维护数据一致性。任何写请求都只能在Leader上写入,并且需要写入多数副本后才会返回客户端写入成功,其中多数副本的默认配置为3副本。
当某个Region的大小超过一定限制后,TiKV会将其分裂为两个或更多个Region。当某个Region因为大量的删除请求导致大小变小时,TiKV会将其与相邻的比较小的Region合并为一个。当PD需要将某个Region的某个副本调度到另一台TiKV节点上时,会先为这个RaftGroup在目标节点上增加一个Learner副本,直到追上Leader副本的进度后再进行调度。
数据读写机制
数据的读写都是向PD请求一个时间戳。当需要读取某表时,如果该表正在进行写操作而被锁定,则数据库会等待并获取当前的时间戳,直到时刻大于等于存在写事件的开始时间时,读任务才会进行读操作,避免读取到脏数据。
数据写入TiKV时,每个数据都会至少存在三个Region副本。写入时会先写入Raft日志,然后由TiKV根据raft列的日志信息将数据写入到该表所存在的每个Region中。待大部分Region副本数据的写入都完成,保证数据不会丢失,才算一次写入操作完成。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6549.html
