Lesson 03—TiKV

一、TiKV 持久化

TiKV 数据持久化靠RocksDB实现。
RocksDB介绍:

RocksDB写操作:

RocksDB写入磁盘的操作:
先把WAL直接写入磁盘日志中,MemTable中追加到最大值后,就开始转存到immutable MemTable。RocksDB重新开辟一个MemTable。
immutable Mentable 是刷入磁盘的中间状态,防止写入阻塞。immutable Mentable 达到5个以后,会限速。

Level 0 是 immutable MemTable 的复刻,内容一样。达到4个以后,会向下一层走,这个过程叫做 compaction
删除操作:只写入Delete语句,不去真正删除。更新操作同理。
RocksDB 查询操作:

查询操作:只查询最新的值。
最近最常用的数据在Block Cache中,不在的话,就去MemTable,再去immutable MemTable,最后再去磁盘。
在SST文件中对文件进行排序,采用二分查找法。
bloom Filter:判定在的话可能在,不在的话肯定不在。
RocksDB 列簇(CF):

共用日志文件。
二、分布式事务

两阶段提交:
第一阶段,prewrite 修改数据(TiKV 节点用三个列簇来保存)和锁信息,写入TiKV节点中。
第二阶段,commit 到PD中去要时间,也就是结束时间。
在写入之前,别人感知不到,叫做 乐观锁;提前将锁写入TiKV节点中,叫做悲观锁。
第一行加主锁,之后都是追随主锁。

Default:放修改数据
Lock:放锁信息
Write:放提交信息和小于255字节的修改信息。

只为分布式事务的第一行加锁。
三、MVCC




查询的话先到Write中找最近的值,再去Default中找到。
写数据的话,先Write ,再Lock,有锁就写不了,没锁就可以写。
四、TiKV-Raft
日志复制:

Region是一个逻辑概念。Region 默认初始大小96M,涨到144M时会分裂。





-
Propose:外面的客户端写入raft log。
-
Append:写到本地RocksDB log 中,。
-
Replicate:将 Leader 中的日志分发到其它 follower 中。
append:其它节点也持久化到RocksDB 中。
-
committed:返回一个响应值,当大多数(超过一半)follower region反馈提交成功。Raft 日志的commited,而不是用户的commited。
-
Apply:将 Raft log 写入RocksDB KV中,这时候返回用户的Commited。
Leader 选举:

term :时间段,没有固定长度。
每一个 Region 有一个计时器,election timeout = 10s,可自行设置。
收到候选者的请求后,如果term大于自己,就会投一票。

heartbeat time interval = 10 s
在时间内,收不到心跳信息,就会判定leader挂了,然后发起一个选举。

election timeout + random。

Election timeout:多少个ticks之后发起选举。
Heartbeat timeinterval: 发送心跳间隔时间,默认1s。
五、数据写入和读取
数据写入:

raftstore pool:日志线程池
apply pool:日志解析线程池


- 先去PD查数据存放位置
- 读的时候发心跳确认是否为Leader。
数据读取:

增加 readindex 用来记录当前 commit 的位置。
增加 Applyindex 用来记录当前 apply 的位置。



Leader:

Follower:

六、Coprocessor
Coprocessor——协同处理器

算子下推:
- 物理计算
- 分析数据
- 统计信息

七、跳转链接
下面是我的笔记链接:




