TiDB学习3:TiKV

目录

1. TiKV架构和作用

2. RocksDB

2.1 写入

2.2 查询

2.3 Column Families列簇

3. 分布式事务

3.1 事务流程

3.2 分布式事务流程 

3.3 MVCC

4. Raft与Multi Raft

4.1 Raft日志复制

4.2 Raft Leader选举

5. TiKV- 读写

5.1 数据的写入

5.2 数据的读取ReadIndex Read

5.3 数据的读取Lease Read

 5.4 数据的读取 Follower Read

6. Coprocessor

7. 小结


1. TiKV架构和作用

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

2. RocksDB

RocksDB 针对 Flash 存储进行优化,延迟极小,使用 LSM 存储引擎

  • 高性能的 Key-Value 数据库
  • 完善的持久化机制,同时保证性能和安全性
  • 良好的支持范围查询
  • 为需要存储 TB 级别数据到本地 FLASH 或者 RAM 的应用服务器设计
  • 针对存储在高速设备的中小键值进行优化一可以存储在 FLASH 或者直接存储在内存
  • 性能随 CPU 数量线性提升,对多核系统友好

2.1 写入

         假如插入(1,tom)这条数据,首先做WAL(Write Ahead Log,保证事务的原子性和持久性),写到磁盘中的日志文件中(sync_log=True),不经过操作系统缓存,再把(1,tom)写到MemTable内存中,当写入的大小达到write_buffer_size的值时,把数据刷到immutable MemTable中(固定内存,不能修改了,防止写阻塞),然后RocksDB重新开辟一个MemTable,immutable MemTable中的数据会刷到磁盘SST文件中,当写入速度太快,immutable MemTable个数太多还没来得及写入磁盘,这时候就会限制写入IO,日志中会产生write stall信息,当MemTable中的数据落盘了,wal日志文件中的数据就可以被覆盖了

        Level 0是immutable MemTable的复刻,当Level 0文件默认达到4个的时候,就会compaction压缩到Level 1文件并把Key排好序,当Level 1达到256M继续向下一级合并并排好序,当Level 2达到2.5G时再向下一级合并以此类推

2.2 查询

        最近最常读取的数据在Block Cache中读取速度就很快,如果读取的数据不在Block Cache中,则相继去MemTable、immutable MemTable、Level 0、Level 1等等中去找,当在SST文件中查找时,有个Bloom Filter过滤器,意思就是要查找的值一定不在该文件中那就真不在该文件中,要查找的值在该文件中,那该值可能在该文件中

2.3 Column Families列簇

        写的时候可以指定列簇,可以存放同一类的数据(一张表或者几张表的键值对),没有指定列簇的话,就会放在一个默认default中,一个RocksDB可以有多个列簇,每个列簇可以对应一张表或者几张表,每个列簇有自己的Mem Table和SST文件,列簇之间共享一份WAL日志,其实就是RocksDB的分片技术

3. 分布式事务

3.1 事务流程

        在TiDB中begin一个事务,会先从PD中获取一个时间戳start timestamp(start_ts)表示事务的开始时间,然后把要修改的数据读取到内存中,在内存中进行修改,commit后就进入两阶段提交,首先进行prewrite,将修改的数据和锁信息写到TiKV节点中(三个列簇,一个存修改的数据Default,一个存锁信息Lock(第一行主锁),一个存提交信息Write),然后commit,commit的时候会向PD获取一个事务的结束时间commit_ts,同时产生一个提交信息,把锁信息标记为D删除状态,表示事务结束。

        在事务中,如果有其他查询来读取,首先查看write列簇,有信息就直接读取该事务中已经修改过的数据,如果write中没有信息,能看到锁信息表示不能从这个地方读,则从其他地方读取。

  • Write 列:当用户写入了一行数据时,如果该行数据长度小于 255 字节,那么会被存储 write 列中,否则的话该行数据会被存入到 default 列中。
  • Default 列:用于存储超过 255 字节长度的数据

3.2 分布式事务流程 

        当还未写入TiKV Node 2中的Write的时候,发生了宕机,此时2节点Lock中就没有删除锁的信息,那就会顺着<W,@1>这条锁信息去找1节点中的锁信息,发现1节点的锁信息是删除了,那么2节点会补上一个删除锁的信息。

3.3 MVCC

        事务1提交了,事务2未提交,假设此时TSO=120,要读取1和4,会去查看write最近提交信息的TSO版本,查到了就去Default里面找数据,如果此时要修改1和4,则还要查看Lock中的信息,有锁就不能修改,如果此时去读2,也是先查看write提交信息最近的TSO版本,然后去Default里面把数据读出来,修改2的话,则查找了Write的提交信息还要去查看Lock中的锁,此时没有2的锁信息,则可以修改2,这就是MVCC的实现

4. Raft与Multi Raft

  • Leader:所有的读写流量都走Leader,通过心跳与Follower通信,并通过日志把数据同步给Follower
  • Follower:不参与读写,长时间收不到Leader消息,会变成候选者发起投票
  • region:左闭又开的存放数据,一个region初始默认大小96M,达到96M后生成一个新region,类似于存[1,1000),[1000,2000),如果后面有修改,并且修改后比原来大,达到144M后会分裂,如果修改后的数据比原来小,还可以合并region,多个TiKV的同一个region构成一个raft group

4.1 Raft日志复制

  1. propose ,Leader接收到数据,写入本地raft log,命名为region号+日志序号
  2. append,将raft log存入本地RocksDB
  3. replicate,Leader通过raft算法将raft日志一条条给Follower做复制(replicate),Follower收到日志写入本地raft log的RocksDB中持久化,返回一个消息给Leader
  4. committed,当大多数节点(超过一半)返回成功的消息后,Leader就认为该条修改的数据修改成功
  5. apply,将数据写入KV的RocksDB中

  • Propose
  • Append
  • Replicate
    • Append
  • Committed
  • Apply 

4.2 Raft Leader选举

        每个region有一个计时器,election_timeout为10s(raft-election-timeout-ticks=10),集群建立初始状态,都不是Leader,如果Follower10S都没有Leader的消息,Follower就会认为集群中没有Leader ,就会变为condidate发起投票,term时间大于其他节点,大多数其他节点投票给该节点,该节点就成为Leader。

        有一种情况就是几个节点同时发出选举,term时间一样,这样就选不出Leader,会发生重复选举,把每个TiKV的elaction_timeout设置为随机值,比如100ms~300ms之间,这样每个TiKV的elaction_timeout值不一样,重复选举的概率就大大降低

        集群运行一段时间后,heartbeat time interval为5s(raft-heartbeat-ticks=5),当Leader节点挂了,有其他节点5s都未接收到Leader消息,则发起投票

  • Election timeout:raft-election-timeout-ticks
  • Heartbeat time interval:raft-heartbeat-ticks
  • raft-heartbeat-ticks *raft-base-tick-interval
  • raft-election-timeout-ticks  *raft-base-tick-interval

        意思就是 Election timeout是由参数raft-election-timeout-ticks的值决定,Heartbeat time interval是由raft-heartbeat-ticks参数值决定,这两个参数的值乘以raft-base-tick-interval(默认1S)的值就是得到实际的秒数,raft-election-timeout-ticks>=raft-heartbeat-ticks

5. TiKV- 读写

5.1 数据的写入

        Leader的raftstore pool写入raft RocksDB,并且其他副本也写好后,apply pool解析raft日志写入RocksDB kv,此时用户的commit才算完成

5.2 数据的读取ReadIndex Read

        能保证读取的TiKV是Leader角色吗?读的时候Leader向Follower发心跳,我是Leader,你是不是Follower ,没错你是我们的Leader,我们是Follower。

        保证线性一致性?当用户在10:00时插入一个值(1,jack),用户commit后,此时raft log为1_95,目前RocksDB KV还在1_92,另一个用户在10:05读取(1,jack),此时apply在1_93,apply还没到1_95,raft commit在1_97,这时就记录该值(1_97),该值就叫readindex,read的时候会等待,一直等待到1_97apply后,(1,jack)就能读取。

5.3 数据的读取Lease Read

        10:00的时候Leader发了一个心跳,heartbeat time interval为10秒,那么在10秒内TiKV node 2一直是Leader,如果心跳成功收到回复,那么下一个时间间隔(heartbeat time interval)继续发心跳,如果10秒内其他节点未收到心跳,其他节点会认为集群是无主状态,并且时间超过了election timeout,则其他节点发起投票重新选举,从10:00到election timeout的这段时间该Leader会一直是Leader,读取就叫lease read。lease read又叫local read。

 5.4 数据的读取 Follower Read

原理和indexread类似 

        10:00的时候(1,tom)修改为(1,jack),用户commit后,此时Leader raft log为1-95,然后10:05的时候,用户去Follower读取(1,jack),此时Follower的raft commit为1-97,1-97就是readindex,要等待Follower1-97 apply后才能读取到(1,jack),10:08的时候Leader的1-95apply成功(相当于用户commit成功了),实际上在Follower上还是读不到(1,jack),要到到Follower上的1-97apply后才能读取,所以在10:10时,Follower上apply了1-97,此时Follower上就能读取(1,jack)

Leader

 Follower

        有可能在Follower中读取的新值比在Leader中要快,也就是说Leader中未读取到的值,在Follower中已经有了,Follower在10:06的时候1-97已经apply了,而Leader在10:06后1-97才apply成功,此时在Follower中就先读取到(1,jack),比在Leader中快,原因就在于Follower apply的速度比Leader要快。

6. Coprocessor

当用户发送语句select count(*) from T; 如果把数据都读到TiDB上,网络开销比较大,cpu负载比较高。

        当用户发送语句select count(*) from T;把count(*)计算下推到TiKV中做,TiKV中的coprocessor分别在几个节点计算完,然后汇聚在TiDB中,TiDB在收到数据后进行二次整理(3+3+3=9),这样TiDB压力就减轻了很多。

TiKV coprocesstor大多数都在执行物理算子,为sql计算出中间结果,减少TiDB的计算。

下推的物理算子包括

  • table scan
  • index scan
  • selection过滤
  • limit
  • 聚合
  • 采样分析数据统计信息
  • 对表进行校验

7. 小结

  • TiKV 的结构与作用
  • TiVK 的持久化的数据读取原理
  • TiKV 对于分布式事务和 MVCC 的支持
  • TiKV 基于 Raft 算法的分布式一致性保证
  • TiKV 的 coprocessor

来自TiDB官方资料 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

教育大模型的发展现状、创新架构及应用展望

引言 从通用大模型到教育领域的专用大模型&#xff0c;是人工智能大模型技术深化发展的必然趋势。教育大模型不是在通用大模型基础上的微调和优化&#xff0c;而是以重构未来教育图景为目标、以开放算法模型架构为基础、以创新教育应用场景为核心的系统性变革。如何厘清教育大…

Linux汉化Jupyter Notebook

要在Linux系统中使Jupyter Notebook汉化&#xff0c;可以通过安装jupyterlab-language-pack-zh-CN扩展来实现。以下是具体步骤和示例代码&#xff1a; 打开终端。 执行以下命令以安装Jupyter Notebook的中文语言包&#xff1a; pip install jupyterlab-language-pack-zh-CN …

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况&#xff0c;那如何让UI显示在最前面呢&#xff0c;先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的&#xff0c;排序在下就越后显示&#xff0c;所以按照这个理论&#xff0c;当我们鼠标指到UI的时候把层级设置到最下层就好…

香橙派 AIpro开发体验:使用YOLOV8对USB摄像头画面进行目标检测

香橙派 AIpro开发体验&#xff1a;使用YOLOV8对USB摄像头画面进行目标检测 前言一、香橙派AIpro硬件准备二、连接香橙派AIpro1. 通过网线连接路由器和香橙派AIpro2. 通过wifi连接香橙派AIpro3. 使用vscode 通过ssh连接香橙派AIpro 三、USB摄像头测试1. 配置ipynb远程开发环境1.…

超越连接:ZL-450边缘网关全面评测与应用案例

前言 在现代工业自动化和智能设备管理的背景下&#xff0c;对实时数据通信与设备监控的需求日益增加。ZL450边缘网关作为一款先进的串口通信解决方案&#xff0c;不仅满足了这些要求&#xff0c;还通过其多样的连接性和高效的数据处理能力&#xff0c;为企业带来了显著的效率提…

添加、修改和删除字典元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于字典是可变序列&#xff0c;所以可以随时在字典中添加“键-值对”。向字典中添加元素的语法格式如下&#xff1a; dictionary[key] value 参数…

为什么短剧突然爆火?背后究竟谁在为流量买单?

为什么短剧突然爆火&#xff1f;背后究竟谁在为流量买单&#xff1f; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 今年很多朋友交流的更多的商业热门话题就是“短剧”&#xff0c;目前我国拥有超10亿的短视频用户&a…

Android:将时间戳转换为本地时间格式

一、效果图 图1&#xff0c;中国的时间格式 图2&#xff0c;美国的时间格式 二、StringUtil.kt代码 import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* object StringUtil {fun formatTimestamp(currentTime: Long): String {var sdf Si…

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是乐观锁和悲观锁? 1、乐观锁&#xff1a; 就像它的名字一样&#xff0c;对于并发间操作产生的线程安全问题持乐观状态&#xff0c; 乐观锁认为竞争…

在没有足够测试数据的请情况下,如何验证前端页面的分页展示和渲染情况

问题描述&#xff1a;测试过程中&#xff0c;为了验证前端页面的展示效果及分页组件的展示情况&#xff0c;测试人员一般都会选择在数据库造数据&#xff0c;但遇到表格管理逻辑特别复杂的情况&#xff0c;可能会耗费大量的时间&#xff0c;此时我们可以选择使用工具模拟返回值…

【quarkus系列】构建可执行文件native image

目录 序言为什么选择 Quarkus Native Image&#xff1f;性能优势便捷的云原生部署 搭建项目构建可执行文件方式一&#xff1a;配置GraalVM方式二&#xff1a;容器运行错误示例构建过程分析 创建docker镜像基于可执行文件命令式构建基于dockerfile构建方式一&#xff1a;构建mic…

Geometry-Aware Attenuation Field Learning for Sparse-View CBCT Reconstruction

摘要&#xff1a; 锥形束CT&#xff08;Cone Beam Computed Tomography&#xff0c;CBCT&#xff09;是目前口腔医学中应用最广泛的一种成像方法&#xff0c;要重建一幅高质量的CBCT图像&#xff0c;需要进行数百次的X线投影&#xff08;即&#xff0c;衰减场&#xff09;在传…

三分钟“手撕”顺序表与ArrayList

前言&#xff1a; 实现顺序表的代码放开头&#xff0c;供大家更好的查阅&#xff0c;每个方法都有代码的实现。 其次我会讲解Java自带的ArrayList的实例&#xff0c;扩容机制ArrayList使用方法&#xff0c;遍历以及它的优缺点。 目录 一、自己实现的顺序表 二、Java的ArrayLi…

基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码

第一步&#xff1a;准备数据 17种猴子动物数据&#xff1a; self.class_indict ["白头卷尾猴", "弥猴", "山魈", "松鼠猴", "叶猴", "银色绒猴", "印度乌叶猴", "疣猴", "侏绒"…

Delphi 开发Android Service四种模式初探

前言&#xff1a; 本篇文章正经来说&#xff0c;其实算是我的学习履历&#xff0c;是我在不断的摸索过程中&#xff0c;总结的经验&#xff0c;不能算是一篇正经的学术文章。现在DELPHI的学习资料太少了&#xff0c;就算是有也都是基于老版本DELPHI&#xff0c;或VCL相关的内容…

AI芯片软件定义硬件架构

软件定义硬件架构 AI 应用正促使芯片制造商和 OEM 重新审视重新配置硬件的可能性。 摩尔定律放缓&#xff0c;软件应用复杂性和规模激增&#xff0c;x86架构CPU运行通用软件的传统方法已无法满足嵌入式和AI应用的高效需求。 在当前x86架构主导的环境中&#xff0c;软硬件间差…

三丰云免费虚拟主机和免费云服务器评测

三丰云是一家专业的云服务提供商&#xff0c;为用户提供免费虚拟主机和免费云服务器服务。通过对三丰云的使用体验&#xff0c;我对他们的服务进行了评测。首先&#xff0c;三丰云的免费虚拟主机性能稳定&#xff0c;网站加载速度快&#xff0c;给用户提供了良好的访问体验。其…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

数据集005:螺丝螺母目标检测数据集(含数据集下载链接)

数据集简介 背景干净的目标检测数据集。 里面仅仅包含螺丝和螺母两种类别的目标&#xff0c;背景为干净的培养皿。图片数量约420张&#xff0c;train.txt 文件描述每个图片中的目标&#xff0c;label_list 文件描述类别 另附一个验证集合&#xff0c;有10张图片&#xff0c;e…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组&#xff0c;我们在利用单调栈模板的基础上还需要将给定数组扩大一倍&#xff0c;但实际上我们只需要利用取余的操作模拟扩大数组即可&#xff08;具体操作看代码。在解决有…