TiDB ——TiKV

TiDB ——TiKV

TiKV持久化

  • TiKV架构和作用
  • TiKV数据持久化和读取
  • TiKV如何提供MVCC和分布式事务支持
  • TiKV基于Raft算法的分布式一致性
  • TiKV的coprocessor

TiKV架构和作用

  • 数据持久化
  • 分布式一致性
  • MVCC
  • 分步式事务
  • Coprocessor

image-20221116190626613

RocksDB

单机持久化引擎,单机key-value的哈希表

image-20221116190836917

写入先会保存在MemTable当中,批量写入磁盘,合并。

image-20221116191301886

WAL:用来保证事务的原子性和持久性。

会先写到磁盘中,在写到内存中。可以实现故障恢复。

Sync_log=true

MemTable:调表和搜索保证有序性。

流控write stall=5

image-20221116202746775

compaction查找:有序,使用二分查找。

删除:操作memTable,写入一个delete

image-20221116203453355

Block Cache:存最近最常读取的,找不到就去找下一个。

最新的数据永远在老数据上面,

bloom Filter:判断集合中的元素,它说元素不在就是不在,在可能不在。

image-20221116205459135

分布式事务

乐观锁。

分布式事务

在内存中修改事务

image-20221121085957154

只给事务的第一行加一把主锁。

修改是检查lock里面有没有锁,如果有则先不修改,起到了阻塞的作用。事务会从PD获取事务开始的时间。

锁信息的清理:不是删除,是加入一条新的锁信息。

事务有三个阶段:

开始获取一个时间戳,一旦做了提交以后,进入两个阶段。

  1. 第一阶段将修改的数据和锁信息,写入default列簇当中,锁信息写入lock列簇当中
  2. 第二阶段commit,获取事务结束时间,在write当中写入提交时间,清除lock信息。从write当中去default当中去找信息。

注意事项

write不单单是写提交信息,当用户写入了一行小于255字节,那么会存储在write列中,否则会被存入default列中。

default:存储的都是大于255字节的数据。

主锁:别的锁会存一个对主锁的指向。只给第一行数据加一把主锁,其他只加一个指向。

如果发生宕机,就看主锁有没有信息,进行一个恢复。

MVCC 多并发版本控制

实现:生成一个副本,读副本,用时间戳,取最新的。

悲观事务/悲观锁:要能感知到锁的存在。其他的事务是可以感知到的。写不阻塞读。

image-20221121100822061

  1. 如果当前读id=1,TSO=120,可以发现最近的一条信息结束TSO是110,开始TSO是100,找到id=1,发现可以读出Jack,但是在lock当中有一条锁信息,所以不能进行写,
  2. 如果当前读id=2,TSO=120,可以发现,和1同理可以读出Candy,但是lock没有锁,所以也可以进行写。
  3. 如果当前读id=4,TSO=120,可以发现,可以读出Tony,但是lock存在锁信息,指向1的主锁,所以也不能进行写入。

TiKV-Raft

Raft与Multi Raft

读写只走leader。

region超过96MB就会另起一个单元,插入是连续的。每一个副本的ky-value都是一样的。区间是左闭右开。

一个region多副本组成一个raft group。

Raft日志复制

  1. propose,会将请求变成一个写入日志。
  2. append,将Raft日志存储到本地的专门存raft日志的rocks DB中。
  3. Replicate,复制 ,分发其他副本的所在的节点当中,持久化
  4. Commited,副本返回一个响应值收到并存起来了,多数节点丢不了
  5. Apply 将Raft日志应用,存到rocksdb KV当中

image-20221121105940427

image-20221121113502817

Raft Leader 选举

term:在稳定的关系的一段时期

election timeout:150ms~300ms没有心跳,没有leader。变成下一段关系。

image-20221122101850055

发起投票,term+1,谁的term大,谁就会变成leader

Heartbeat time interval:每隔一段时间给follower发心跳信息,没有收到心跳信息就会发起选举。如果多次时间相同,可能发起多次选举。会让一个区间的follwer都进入选举。

image-20221122102858301

raft-election-timeout-ticks不能小于raft-heartbeat-ticks

TiKV 读写

数据的写入

image-20221122103950393

两个线程池

  1. propose:raftstore pool将写请求转化成raft log
  2. Append,raftstore pool将日志存储、持久化到rocksdb raft中
  3. Replicate,复制,复制给其他副本节点。保证持久化,大多数返回成功,就进入下一个状态
  4. commited,指日志被大多数副本接受并持久化,接受到信息,不是指用户的commited

apply pool 应用到rocksdb kv才算成功。commited才返回。

读到数据,数据一定应用到rocksdb kv中。

数据的读取

TiDB Server收到读取请求,会先去PD查,这个key在哪一个node的哪一个region当中。

readIndex:读一定在写之后,读取保证在修改之后,在读之写都应该commited掉,apply。保证读一定可以到修改之后的值。

image-20221122151213295

Lease Read:在election timeout 之内leader都不会改变

Follower Read:比leader读的更快由于apply的速度。

Coprocessor 协同处理器

image-20221122153330361

TiDB将就计算分发给TiKV的Coprocessor计算,降低TiDB Server的压力。

  1. 物理算子,sql的中间结果
  2. 分析数据,统计信息,对表进行校验
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TiDB(“ Ti”代表Titanium)是一个开源的NewSQL数据库,它支持混合事务处理和分析处理(HTAP)工作负载。它与MySQL兼容,具有水平可伸缩性,强一致性和高可用性。 TiDB特点: 水平可伸缩性 TiDB只需添加新节点即可扩展SQL处理和存储。与仅纵向扩展的传统关系数据库相比,这使基础架构容量规划既简单又更具成本效益。 MySQL兼容语法 TiDB就像它是应用程序的MySQL 5.7服务器一样。您可以继续使用所有现有的MySQL客户端库,并且在许多情况下,您无需在应用程序中更改任何代码行。因为TiDB是从头开始构建的,而不是MySQL分支,所以请查看已知兼容性差异列表。 具有高度一致性的分布式事务 TiDB在内部将表分片为基于范围的小块,我们将其称为“区域”。每个区域的默认大小约为100MiB,并且TiDB在内部使用两阶段提交以确保以事务一致的方式维护区域。 云原生 TiDB旨在在公共,私有或混合云中工作,从而简化了部署,供应,操作和维护。 TiDB的存储层,称为TiKV,成为一个云计算原住民基金会在2018年会员项目TiDB平台的架构还允许SQL处理和存储在一个非常云友好的方式相互独立的缩放。 最小化ETL TiDB旨在支持事务处理(OLTP)和分析处理(OLAP)工作负载。这意味着,尽管您可能传统上已经在MySQL上进行了事务处理,然后将提取,转换和加载(ETL)数据提取到列存储中进行分析处理,但不再需要此步骤。 高可用性 TiDB使用Raft共识算法来确保数据高度可用,并在Raft组中的整个存储中安全地进行复制。如果发生故障,Raft组将自动为故障成员选出新的领导者,并自动修复TiDB集群,而无需任何手动干预。失败和自我修复操作对应用程序也是透明的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万伏小太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值