TiDB学习3:TiKV

news2024/9/20 18:47:51

目录

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官方资料 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正邦科技(day1)

1&#xff1a;充电桩工作了两个半小时&#xff0c;已用电量13度电&#xff08;一般的话是一个小时7度电&#xff09; 2&#xff1a;火线&#xff08;红色&#xff0c;棕色&#xff09;&#xff0c;零线&#xff08;蓝色&#xff09; 3&#xff1a;充电桩工作了两个半小时&#…

Vue3骨架屏(Skeleton)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传animated是否展示动画效果booleantruefalsebutton是否使用按钮占位图boolean | SkeletonButtonPropsfalsefalseavatar是否显示头像占位图boolean | SkeletonAvatarPropsfalsefalseinput是否使用输入框占位图boolea…

FPGA之tcp/udp

在调试以太网的过程中&#xff0c;考虑了vivado IP配置(管脚、reset等)&#xff0c;SDK中PHY芯片的配置(芯片地址、自适应速率配置等)&#xff0c;但是&#xff0c;唯独忽略了tcp/udp协议&#xff0c;所以在ping通之后仍无法连接。 所以现在来学习一下tcp与udp的区别 ---- 为什…

FTP协议——LightFTP安装(Linux)

1、简介 LightFTP是一个轻量级的FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;客户端软件。FTP是一种用于在网络上传输文件的标准协议&#xff0c;允许用户通过TCP/IP网络&#xff08;如互联网&#xff09;在计算机之间进行文件传输。 2、步骤…

sqlserver——查询(四)——连接查询

目录 一.连接查询 分类&#xff1a; 内连接&#xff1a; 1. select ... from A&#xff0c;B &#xff1b; 2. select ..from A&#xff0c;B where ..&#xff1b; 3.select ...,... from A join B on... 4. where 与 join...on 的区别 5. where位置的先后 导语&#xff1…

统计计算四|蒙特卡罗方法(Monte Carlo Method)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念&#xff08;一&#xff09;估算 π \pi π&#xff08;二&…

antd(react) ProFormUploadDragger(Upload)上传组件上传图片及省略图模糊展示

antd&#xff08;react&#xff09; ProFormUploadDragger&#xff08;Upload&#xff09;上传组件上传图片及省略图模糊展示 本文基于reactantdProComponents 需求&#xff1a;图片模糊展示&#xff08;数据脱敏&#xff09; 像营业执照、身份证这种&#xff0c;可能用户不希…

信息学奥赛初赛天天练-13-数论-素数的判定

更多资源请关注纽扣编程微信公众号 1 素数 质数又称素数&#xff0c;有无限个。一个大于1的自然数&#xff0c;除了1和它本身外&#xff0c;不能被其他自然数整除&#xff0c;就是该数除了1和它本身以外不再有其他的因数;否则称为合数 1 既非素数也非合数 2 是唯一的偶素数。…

全局查询筛选器适用场景 以及各场景示例

EF Core中的全局查询筛选器&#xff08;Global Query Filters&#xff09;是一种强大的功能&#xff0c;可以在实体框架的DbContext级别为特定的EntityType设置默认的过滤条件。这些筛选器自动应用于所有涉及到相关实体的LINQ查询中&#xff0c;无论是直接查询还是通过Include或…

深入解读 ChatGPT 的基本原理(个人总结版)

引言 背景 人工智能&#xff08;AI&#xff09;技术自20世纪中期诞生以来&#xff0c;经历了多次革新和进步。从最早的图灵测试&#xff0c;到20世纪末的深蓝计算机击败国际象棋冠军&#xff0c;再到21世纪初谷歌AlphaGo击败围棋冠军&#xff0c;AI技术的飞速发展改变了人们的…

4,八种GPIO模式

资料来源:【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 仅作个人自学笔记&#xff0c;如有冒犯&#xf…

STM32Cube系列教程10:STM32CubeIDE工程创建+串口DMA+IDLE+printf重定向+软中断处理串口数据+非阻塞延时任务

文章目录 工程配置配置时钟配置Debug接口配置串口外设配置时钟树生成代码 配置串口重定向printf配置串口&#xff0c;开启IDLE&#xff0c;开启软中断 配置非阻塞延时任务调度函数编写任务调度函数延时任务创建 编译&#xff0c;下载与测试编译下载测试 前两天收到了ST社区的NU…

C数据结构:二叉树

目录 二叉树的数据结构 前序遍历 中序遍历 后序遍历 二叉树的创建 二叉树的销毁 二叉树的节点个数 二叉树叶子节点个数 二叉树第K层节点个数 二叉树的查找 层序遍历 判断二叉树是否为完全二叉树 完整代码 二叉树的数据结构 typedef char BTDataType; typedef str…

Golang的内存关系

1.Page Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,默认的Page为8KB 2.mSpan 多个连续的Page称之为是一个Span&#xff0c;其定义含义有操作系统的管理的页表相似 3.Size Class Size Class: 相当于 一个等级和刻度, 比如 第二等级 就代表 一个Pag…

【C++ ——— 多态】笔记

文章目录 一、多态概念二、多态的定义即实现2.1 多态的构成条件2.2 虚函数2.3虚函数的重写1.虚函数中析构函数的重写2.重载、重写&#xff08;覆盖&#xff09;、重定义&#xff08;隐藏&#xff09;的区别 2.4 C11 override 和 final 三、抽象类3.1抽象类概念3.2 接口继承和实…

中断处理过程介绍

概念 中断 中断源 分类 中断处理过程 中断请求 实现器件 中断判优 软件判优 过程 器件实现 程序实现 硬件判优 链路判优 器件实现 控制器判优 中断响应 中断服务 中断返回

C语言作为计算机行业的基础之一,是否制约了行业本身的发展?

c不是计算机行业的基础啦&#xff0c;你想&#xff0c;c语言出现时已经有一套成熟的计算机体系&#xff0c;有基于内存地址的寻找指令、数据的工作方式&#xff0c;有汇编语言&#xff0c;那搞出c这种高级语言就很正常啊&#xff01;刚好我有一些资料&#xff0c;是我根据网友给…

代码随想录算法训练营第20天 |● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录 前言654.最大二叉树思路方法一 递归法方法一2 老师的优化递归法 617.合并二叉树思路方法一 递归法方法二 迭代法 700.二叉搜索树中的搜索思路方法一 递归法方法二 迭代法 98.验证二叉搜索树思路方法一 使用数组方法二 不使用数组代码注意点&#xff1a; 方法二 使用双…

【Linux】Linux的基本指令_3

文章目录 二、基本指令15. date16. cal16. find17. grep18. zip 和 unzip19. tar20. uname 未完待续 二、基本指令 15. date date 命令可以显示当前时间。 常用标记列表&#xff1a; %H : 小时(00…23) %M : 分钟(00…59) %S : 秒(00…61) %X : 相当于 %H:%M:%S %d : 日 (01……