对于RocksDB和LSM Tree的一些理解

LSM Tree的读写过程

  • HBase、LevelDB,rocksDB(是一个引擎)底层的数据结构是LSM Tree
  • 适合写多读少的场景,都是追加写入内存中的MemTable,写入一条删除(或修改)标记,而不用去访问实际的数据,从而大大提高写的速度
  • 追加顺序写(innodb的页是随机的)
  • sst和memTable有序是为了compact,范围查询,key 的有序性可以让我们对sst其进行增量编码、indexblock的页目录

写操作

MemTable: 是一个内存缓冲区,跳表实现,数据有序,append操作到这个内存,默认大小64M,期间有预写操作,每次刷盘都会在 L0 层上产生一个新的 SST 文件(rocksDB中默认L0上有四个SST,超过就compact)
![[Pasted image 20250125221824.png]]

SST: 默认 SST 文件大小:64MB,其中有多个block(4k)存数据,有布隆过滤器和indexBlock,类比innodb中的页目录
![[Pasted image 20250125223209.png]]

因为sst中会有许多操作不同,但是key相同的数据,为了避免空间放大和读放大(读多个sst),有compact操作,就是某一层的sst数量超过阈值,和下一层有相同key范围的sst进行归并排序,通过 K 路归并算法逐步合并多个 SST 文件

读操作

以下是查找步骤:

检索 MemTable。
检索不可变 MemTables。
搜索最近 flush 过的 L0 层中的所有 SST 文件。
对于 L1 层及以下层级,首先找到可能包含该 key 的单个 SST 文件,然后在文件内进行搜索。

块索引在 SSTable 文件被打开时加载到内存。在查找时首先从内存中的索引二分查找找到块,然后一次磁盘寻道即可读取到相应的块。只加载索引,再找block

搜索 SST 文件涉及:
(可选)探测布隆过滤器。
查找 index 来找到可能包含这个 key 的 block 所在位置。
读取 block 文件并尝试在其中找到 key。

目前的实现

newSQL和NoSQL和传统sql

1. 前两个的出现
1. 都是为了解决传统sql的单机限制,如容量和自动恢复和分布式事务,如mycat中间件只能解决分片和容量,解决不了自动恢复,分布式事务还要引入seata
2. mysql支持的是异步和半同步复制,宕机的时候部分数据不一致
3. 刷盘上面,分为,mysql(传统)用的是B+树结构,即刷的是对应的页(磁盘的页和内存的页的格式相同),还有就是tidb是kv的追加------其实这么总结实际上是因为只了解innodb和rocksDB(这个只是区别,不是解决的问题

2. new和no的区别
nosql如mongoDB
NewSQL仍然采用关系型数据模型,如TiDB完全适配Mysql,在下层会把表结构转化为kv结构,即表格和数据行的模型。这意味着数据结构必须遵循预定义的表格模式和关系。而NoSQL则采用了不同的数据模型,如键值对、文档、列族和图形等。NoSQL的数据模型更加灵活,适应了不同类型和结构的数据存储需求。

NewSQL对数据一致性要求更高(但是实际上MongoDB后续也支持分布式事务),追求强一致性(ACID特性)。这意味着在数据写入与读取过程中,数据一定会达到一致的状态。然而,NoSQL对一致性要求相对较低,更注重可用性和性能,可能会出现数据在不同节点间的延迟和冲突。

TiDB架构(newSQL)

![[Pasted image 20250125113215.png]]

Raft如何参与TiDB的分布式存储

![[Pasted image 20250125113412.png]]

  • TiDB 的数据在 TiKV 中是按照 **Key 的范围(Range)划分的。每个 Region 负责存储 连续的一段 Key,大小96MB
  • 每一个region集群都是一个raft group,即有主节点提供写和写入时大部分节点的确认,选举也是发生在一个region集群里
  • 为了避免脑裂,region的个数一般是奇数,能保证总有一个区能选出leader,另一个区无效,否则偶数的话,正好平分,就两个区都不可用
  • 不同的leader在不同的节点,这样能负载写入的压力

参考:

https://cloud.tencent.com/developer/article/2329992 一文科普 RocksDB 工作原理

https://cloud.tencent.com/developer/article/2180532 LSM-tree 日志结构合并树详解

https://www.infoq.cn/news/how-to-build-a-distributed-database TiDB作者文章

https://zhuanlan.zhihu.com/p/491638316 理解raft文章

https://book.tidb.io/session4/chapter4/two-dc-raft.html 细节如何划分raft的数量

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

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

相关文章

枚举与模拟 练习

练习题基于《C/C程序设计竞赛真题实战特训教程(图解版)》 目录 1.1 卡片 题目描述 代码实现 题解笔记 总评 注意点 重点解释 1.2 回文日期 题目描述 输入描述 输出描述 代码实现 题解笔记 总评 注意点 重点解释 1.1 卡片 题目描述 小蓝…

Linux第103步_了解I2C总线框架

了解Linux中的I2C总线框架为后面做I2C实验做准备,学驱动,就是学习框架,了解是必须的。 1、了解Linux下的I2C子系统中的相关数据结构 struct i2c_adapter { struct module *owner; unsigned int class; /* classes to allow probing for …

AAAI2024论文合集解读|Physics-Informed Representation and Learning Control and Risk

论文标题 Physics-Informed Representation and Learning: Control and Risk Quantification 物理信息表征与学习:控制与风险量化 论文链接 Physics-Informed Representation and Learning: Control and Risk Quantification论文下载 论文作者 Zhuoyuan Wang, …

【JavaEE进阶】Spring留言板实现

目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机:Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用(CVE-2022-0944)3. 从Docker中提权4. 信息收集(michael用户)5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置,ansible工具功能配置。 ansible自身的配置文件…

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…

11 蚂蚁链技术特性

概览 蚂蚁链通过引入P2P网络、共识算法、虚拟机、智能合约、密码学、数据存储等技术特性&#xff0c;构建一个稳定、高效、安全的图灵完备智能合约执行环境&#xff0c;提供账户的基本操作以及面向智能合约的功能调用。 区块结构 一个区块包含区块头和区块体&#xff0c;区块…

【C++高并发服务器WebServer】-5:内存映射与进程通信

本文目录 一、内存映射与进程通信二、匿名映射与进程通信 一、内存映射与进程通信 内存映射Memory-mapped I/O指的是将磁盘文件的数据映射到内存&#xff0c;用户通过修改内存就能够修改磁盘文件&#xff0c;如下图所示&#xff08;进程地址空间指的是虚拟地址空间&#xff09…

使用vscode + Roo Code (prev. Roo Cline)+DeepSeek-R1使用一句话需求做了个实验

摘要 使用vscode、Roo Code和deepseek-reasoner进行了一个实验&#xff0c;尝试使用一句话需求来生成小红书封面图片。工具根据需求提供了详细的架构方案&#xff0c;包括技术栈选择、核心模块划分、目录结构建议等。然后&#xff0c;工具自动化地完成了开发和测试&#xff0c;…

C语言初阶牛客网刷题—— JZ11 旋转数组的最小数字【难度:简单】

1. 题目描述 牛客网在线OJ链接 有一个长度为 n 的非降序数组&#xff0c;比如 [1,2,3,4,5] &#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了 [3,4,5,1,2] &#xff0c;或者 [4,5,1,2,3…

如何解压7z文件?8种方法(Win/Mac/手机/网页端)

7z 文件是一种高效的压缩文件格式&#xff0c;由 7 - Zip 软件开发者所采用。它运用独特的压缩算法&#xff0c;能显著缩小文件体积&#xff0c;便于存储与传输各类数据&#xff0c;像软件安装包、大型资料集等。但要使用其中内容&#xff0c;就必须解压&#xff0c;因为处于压…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能

【1】原贴地址&#xff1a;eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下&#xff1a; 更新eclipse-24-09版本后之后&#xff0c;新的搜索功能&#xff08;CT…

macos的图标过大,这是因为有自己的设计规范

苹果官方链接&#xff1a;App 图标 | Apple Developer Documentation 这个在官方文档里有说明&#xff0c;并且提供了sketch 和 ps 的模板。 figma还提供了模板&#xff1a; Figma

C++异步future

&#x1f30e; C11异步futrue 文章目录&#xff1a; C11异步futrue future介绍     应用场景     future操作       std::async函数模版       std::packaged_task类模版       std::promise类模版 &#x1f680;future介绍 std::future是C11标准库…

洛谷 P2846 [USACO08NOV] Light Switching G C语言

题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of the larger toys is the lights in the barn. Each of the N(2≤N≤105) cow stalls conveniently numbered 1…N has a colorful light above it. At the beginnin…

批量创建ES索引

7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…

大厂案例——腾讯蓝鲸DevOps类应用的设计与实践

蓝鲸体系架构图 蓝鲸CICD应用功能架构 降低DEVOPS门槛—开发者中心 CICD应用需要的后台服务 系列阅读 12306亿级流量架构分析&#xff08;史上最全&#xff09;实现电商平台从业务到架构的治理体系基于主数据驱动的数据治理什么时候需要分表分库&#xff1f;-CSDN博客

React和Vue有什么区别,如何选择?

React和Vue有什么区别&#xff0c;如何选择&#xff1f; React 和 Vue 是当前最受欢迎的前端框架之一&#xff0c;两者在开发者中都有极高的声誉。它们都旨在帮助开发人员构建用户界面&#xff0c;但在实现方式和适用场景上有所不同。如果你正考虑在项目中选择 React 或 Vue&a…