003、体系结构之TiKV持久化

news2024/11/19 1:53:31

在这里插入图片描述

TiKV架构和作用

在这里插入图片描述

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

coprocessor : 协同处理器。 可以将一些SQL计算交给TiKV处理。不需要将TiKV所有数据通过网络发送给TiDB Server

RocksDB

任何持久化的存储引擎,数据终归要保存在磁盘上,TiKV 也不例外。但是 TiKV 没有选择直接向磁盘上写数据,⽽是把数据保存在 RocksDB 中,具体的数据落地由RocksDB 负责。这个选择的原因是开发⼀个单机存储引擎⼯作量很⼤,特别是要做⼀个⾼性能的单机引擎,需要做各种细致的优化,⽽ RocksDB 是由 Facebook 开源的⼀个⾮常优秀的单机 KV 存储引擎,可以满⾜ TiKV 对单机引擎的各种要求。这⾥可以简单的认为 RocksDB 是⼀个单机的持久化 Key-Value Map。

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

Key-Value Pairs(键值对)

作为保存数据的系统,⾸先要决定的是数据的存储模型,也就是数据以什么样的形式保存下来。TiKV 的选择是 Key-Value 模型,并且提供有序遍历⽅法。

TiKV 数据存储的两个关键点:

  • 这是⼀个巨⼤的 Map,也就是存储的是 Key-Value Pairs(键值对)
  • 这个 Map 中的 Key-Value pair 按照 Key 的⼆进制顺序有序,也就是可以 Seek 到某⼀个 Key 的位置,然后不断地调⽤ Next ⽅法以递增的顺序获取⽐这个 Key ⼤ 的 Key-Value。

RocksDB写⼊

它可做到一个类似顺序写的效果
在这里插入图片描述

  • wal日志是会持久化到disk上的。
  • 是数据的put(新增),数据写到memTable(类似sga) ,然后数据转存到到immutable memtable(例如memTable满了),当memtable里的数据追加达到write_buffer_size大小,然后再根据一定机制刷新到磁盘。,就转存到immutable (不能动,不能改的意思)。 然后重新开辟MemTable。. 这样可以避免memTable 同步到磁盘io的瓶颈。 因为它是同步到immutable memTable(内存中)。 当然也有可能 immutable memTable这个因为memTable 太频繁导致限流。
  • 读和写,它都是优先从MemTable,因为是最新的。
  • immutable 就是同步到文件的区域。 它的作用其实就是 减少 memtable 同步唰到磁盘的io。 减少客户端的阻塞。防止写阻塞。

注意:
immutable一个满了就会往磁盘写。当同步磁盘速度太慢,例如达到5个就会做流控。
如果写入的速度太快(客户端到memtable),而刷盘的速度相对较慢的时候(immutable到磁盘),它会进行限速的动作(write stall),限制写入的速度。

压缩合并

在这里插入图片描述
在磁盘当中,会有压缩算法。 数据是有等级之分。
其中level 0 就是immutable复制。 RockDB 对于写的非常友好。
当有4份immutable MemTable 进行入level 0之后.然后将它们压缩之后的数据放到Level 1中。 如果再有4份,继续合并压缩到level 1中。依次类推
然后level 1中的数据超过256M,则这个层级数据压缩合并到level 2中.
依次类推,下面的等级

RocksDB查询

在这里插入图片描述
查找顺序就是:

  • 先从block cache找,没有就从memtable ->immutable memTable -> level 0 -> level 1…

为了提升查询性能,在每个level 设置了key的范围 。如果不在范围,就找更高级别。这个插叙操作,相较于B+树就会慢一点。

最新的数据 根据箭头来。 读到了最新数据,就没必要读之前的数据了。

key 按照最小值和最大值进行排序的集合。
为了加速还有个布隆过滤器,为每个文件都安装了这个,它的作用就是判断这个集合当中的元素,如果布隆过滤器说这个元素在这个集合当中,有可能不在,有误判的概率,但如果说这个元素不在这个集合当中,则百分百一定不会在。

列簇Column Families

不同的列簇可以用来存储不同的数据,在数据的存储、管理、读写上都可以将数据进行分开。
列簇可以方便对数据进行分片,存储数据时指定列簇,数据可以在内存、磁盘中分开存放。默认列簇是default。
在这里插入图片描述
cf1 : (cf1,id,name,age)
cf2 : (cf1,id,addr,tel)
在这里插入图片描述
RockDB还有个作用,数据分片。 列簇(CF) : 作用是数据分片的作用。

  • 写的时候,可以指定列簇来进行写入。
  • rocksDB,有个默认的列簇,default。当不指定的时候,都写入到这。
  • 列簇可以指定一张表或多张表的键值对,它们有自己对应的memory 区域,但它们共用相同的wal文件。

TiDB 在 TiKV 提供的分布式存储能⼒基础上,构建了兼具优异的交易处理能⼒与良好的数据分析能⼒的计算引擎。
对于计算层依赖的存储⽅案,这⾥只介绍基于 TiKV 的⾏存储结构。针对分析型业务的特点,TiDB 推出了作为 TiKV 扩展的列存储⽅案TiFlash。

表数据与 Key-Value 的映射关系

这⾥的数据主要包括以下两个⽅⾯:

  • 表中每⼀⾏的数据,以下简称表数据
  • 表中所有索引的数据,以下简称索引数据

表数据与 Key-Value 的映射关系

在关系型数据库中,⼀个表可能有很多列。要将⼀⾏中各列数据映射成⼀个 (Key,Value) 键值对,需要考虑如何构造 Key。⾸先,OLTP 场景下有⼤量针对单⾏或者多⾏的增、删、改、查等操作,要求数据库具备快速读取⼀⾏数据的能⼒。因此,对应的 Key 最好有⼀个唯⼀ ID(显示或隐式的 ID),以⽅便快速定位。其次,很多OLAP 型查询需要进⾏全表扫描。如果能够将⼀个表中所有⾏的 Key 编码到⼀个区间内,就可以通过范围查询⾼效完成全表扫描的任务。

基于上述考虑,TiDB 中的表数据与 Key-Value 的映射关系作了如下设计:

  • 为了保证同⼀个表的数据放在⼀起,⽅便查找,TiDB 会为每个表分配⼀个表ID,⽤ TableID 表示。表 ID 是⼀个整数,在整个集群内唯⼀。
  • TiDB 会为表中每⾏数据分配⼀个⾏ ID,⽤ RowID 表示。⾏ ID 也是⼀个整数,在表内唯⼀。对于⾏ ID,TiDB 做了⼀个⼩优化,如果某个表有整数型的主键,TiDB 会使⽤主键的值当做这⼀⾏数据的⾏ ID。

每⾏数据按照如下规则编码成 (Key, Value) 键值对:

Key: tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]

其中 tablePrefix 和 recordPrefixSep 都是特定的字符串常量,⽤于在 Key空间内区分其他数据。其具体值在后⾯的⼩结中给出。

索引数据和 Key-Value 的映射关系

TiDB 同时⽀持主键和⼆级索引(包括唯⼀索引和⾮唯⼀索引)。与表数据映射⽅案
类似,TiDB 为表中每个索引分配了⼀个索引 ID,⽤ IndexID 表示。

对于主键和唯⼀索引,需要根据键值快速定位到对应的 RowID,因此,按照如下规
则编码成 (Key, Value) 键值对:

Key: 
tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID

对于不需要满⾜唯⼀性约束的普通⼆级索引,⼀个键值可能对应多⾏,需要根据键
值范围查询对应的 RowID。因此,按照如下规则编码成 (Key, Value) 键值对:

Key: 
tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}
Value: null
# 对于二级索引,不能通过KV的形式找到某一行

元信息管理

TiDB 中每个 Database 和 Table 都有元信息,也就是其定义以及各项属性。这些信息也需要持久化,TiDB 将这些信息也存储在了 TiKV 中。

每个 Database / Table 都被分配了⼀个唯⼀的 ID,这个 ID 作为唯⼀标识,并且在编码为 Key-Value 时,这个 ID 都会编码到 Key 中,再加上 m_ 前缀。这样可以构造出⼀个 Key,Value 中存储的是序列化后的元信息。

除此之外,TiDB 还⽤⼀个专⻔的 (Key, Value) 键值对存储当前所有表结构信息的最新版本号。这个键值对是全局的,每次 DDL 操作的状态改变时其版本号都会加 1。⽬前,TiDB 把这个键值对持久化存储在 PD Server 中,其 Key 是"/tidb/ddl/global_schema_version",Value 是类型为 int64 的版本号值。TiDB 采⽤Online Schema 变更算法,有⼀个后台线程在不断地检查 PD Server 中存储的表结构信息的版本号是否发⽣变化,并且保证在⼀定时间内⼀定能够获取版本的变化。

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

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

相关文章

NeRF in the wild 论文解读与公式推导

NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections 论文:https://openaccess.thecvf.com/content/CVPR2021/papers/Martin-Brualla_NeRF_in_the_Wild_Neural_Radiance_Fields_for_Unconstrained_Photo_CVPR_2021_paper.pdfhttps://op…

不同等级的Pads工程师,薪资差距有多大?

作为一种广泛应用在PCB设计的EDA工具,Pads软件在中国的电子设计行业中有着重要地位,尤其是不同等级的Pads工程师,在薪资、工作范围等有很大的差异,本文将从中国出发,多方面分析对比不同等级的Pads工程师,希…

监控、审计和运行时安全

监控、审计和运行时安全 目录 文章目录 监控、审计和运行时安全目录1、分析容器系统调用:SysdigSysdig介绍安装sysdigsysdig常用参数sysdig常用命令Chisels(实用的工具箱)其它命令 2、监控容器运行时:FalcoFalco介绍Falco架构安装falco自定义扩展规则文件…

ElasticSearch(ES)介绍

前言 为什么学习ElasticSearch? 1、ElasticSearch具备非常强的大数据分析能力。虽然Hadoop也可以做大数据分析,但是ElasticSearch的分析能力非常高,具备Hadoop不具备的能力。比如有时候用Hadoop分析一个结果,可能等待的时间比较…

免费获取程序员好书,这个宝藏网站等你来挖!

今天给大家分享一个免费的程序员、IT、互联网资源的​免费书籍网站。​ 书籍类型涵盖了Vue、CSS、小程序等前端语言、框架;.NET、JAVA、Go等后端语言;Android、IOS、Flutter等移动语言;数据库、云计算大数据、网络系统运维、UI美工设计、游戏…

【CASA模型】生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用

查看原文>>>生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源&am…

Jmeter调用Oracle、pg、MySql 储存过程,实例,获取返回值

JDBC Request: 1、重要参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致   Query:填写的sql语句未尾不要加“;”   Parameter valus:参数…

统信UOS系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.11.2,并配置编译测试Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131182539 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

激光雷达安全系统:让世界变得更安全

基于3D激光雷达的安全系统具有更高的可靠性,减少了误报,因此具有更高级别的安全性。激光雷达在安全和监视应用中越来越受欢迎,由于其高可靠性、远程、厘米级精度以及对具有挑战性的天气和照明条件不敏感等特点,它很容易击败相机或雷达等同行。 01 基于激光雷达的安全系统 …

技术文章—基于SPAD / SiPM技术的激光雷达方案

激光雷达(LiDAR)是一种测距技术,近年来越来越多地用于汽车先进驾驶辅助系统(ADAS)、手势识别和3D映射等应用。尤其在汽车领域,随着传感器融合的趋势,LiDAR结合成像、超声波、毫米波雷达,互为补足,为汽车提供全方位感知,为迈向更安全的自动驾驶铺平道路。安森美半导体提供…

简历项目合集

基于Arduino的超声波悬浮装置 超声波悬浮原理 项目图片 概述 实验需要使用Arduino驱动换能器产生一个40KHz的方波,可以使用换能器组,也可以使用Arduino的超声波模块。但是仅仅使用Arduino输出的方波信号的功率,并不足以使得小物体悬浮&…

【AI人工智能】 iTab浏览器标签页中最强大的AI功能莫过于此了, 你不用真的太可惜了! 最后一步就这样干(3)

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

对windows自带EFS加解密的研究

0x00 前言 0x01 测试环境 windows7专业版SP1: 在虚拟机中运行,创建了快照,当前账户名和密码为jizong/123456 0x02 EFS加解密原理: EFS加密实际上综合了对称加密和不对称加密,具体流程如下: (1) 随机生…

关于 MsgWaitForMultipleObjects 的理解

你是否希望有一个 WaitMessageTimeout 函数能帮助你干些特别的活? 很抱歉,没有这东西。 但是,你可以借助另外一个函数 MsgWaitForMultipleObjects 来间接的实现它。怎么做呢?请看下文。 >> 请移步至 topomel.com 以查看图片…

电弧打火机方案,点烟器单片机开发方案

市面上的打火机除了明火之外,还有电热丝、电弧两种类型的点烟器。电热丝在使用过程中会变细并且烧断。宇凡微推出的电弧打火机方案,该点烟器芯片为宇凡微单片机YF系列,电弧点烟器IC性价比高。 一、电弧打火机方案的原理 电弧打火机使用的是电…

量子机器学习Variational Quantum Classifier (VQC)简介

变分量子分类器(Variational Quantum Classifier,简称VQC)是一种利用量子计算技术进行分类任务的机器学习算法。它属于量子机器学习算法家族,旨在利用量子计算机的计算能力,潜在地提升经典机器学习方法的性能。 VQC的…

【Python】一文带你了解并使用 Json 模块

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【历史上的今天】6 月 13 日:分组交换网路的“亲子纠纷”;博弈论创始人出生;交互式电视初现雏形

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 6 月 13 日,知名的 ENIAC 建造者约翰莫克利在历史上的这一天参观了 ABC 计算机,与 ABC 的设计者之一阿塔纳索夫会面。这次会面后来牵扯…

java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

文章目录 一:前台功能实现1.1 页面编写1.2 发送验证码——sendEmailCode1.2.1 远程调用发送接口1.2.1 接口防刷校验——60s内只能发送一次 二:获取QQ邮箱授权码2.1 登录QQ邮箱2.2 开启SMTP权限2.2.1 设置2.2.2 账户2.2.3 管理服务2.2.4 生成授权码2.2.5 …

新能源商用车:老玩家、新势力“争先恐后”

现如今,作为重要出行交通工具之一的汽车,已经在人们日常生活中扮演着愈发重要的角色。不仅如此,汽车行业也发生了不小的变化,新能源汽车的热度更是居高不下。除了各路玩家积极布局之外,新能源汽车的销量也是持续走高。…