LSM Tree 底层设计理念

  • 场景:设计一个海量读写的的kv数据库,优先保证写入速度,但是读取速度也不能很慢
    • 因为海量数据存储,不能使用内存,得存到文件里。
  • Q:对已经落盘的文件,怎么根据key修改value
    • A:读取文件找到指定的key,修改指定的值
  • Q:需要随机磁盘io,磁头、磁道、扇区三者合一,然后进行io操作,慢
    • A:追加写:不找之前的了,直接写新的key-value(顺序io),新的key代替老的key
  • Q:查询的时候一个key对应多个value,还需要排序过滤,慢
    • A:异步compaction:新建一个文件(SSTable)接受新的写入数据,写到一定数量后关闭,然后创建一个新的SSTable,对关闭的SSTable进行异步的合并,根据key+版本删除旧版本数据
  • Q:文件中检索指定的key 有什么方案
    • A:同一个SSTable中,key按顺序排列
    • A:创建若干索引文件
    • A:每个SSTable,记录其 kmax,kmin
    • A:对SSTable切分,分出若干segement并记录kmax,kmin
    • A:每个segement添加一个bloomfilter,用于快速过滤
  • Q:为了key在SSTable中按序排列,那写SSTable的过程也是随机io
    • A:创建一个内存中的memtable,写入过程统一写入memtable,在内存中使key有序,而且同一个memtable写入相同的key,直接就可以在memtable中进行合并,一定大小后,溢写到磁盘形成SSTable,这样SSTable就是 key有序且唯一的数据结构,溢出过程也是顺序io
  • Q:写入过程和溢写磁盘过程有冲突
    • A:当一个memtable满足溢出条件后就停止写入,创建一个新的memtable,并将前一个memtable 改成 immutable memtable(不可变更的内存表)同时将 immutable memtable溢写磁盘
  • Q:内存有序的memtable,用什么数据结构实现?
    • A:跳表、红黑树,跳表合适并发比较好、实现更简单(不一定,lsm只是一个架构,怎么实现无所谓)
  • Q:内存写磁盘的操作不够健壮,万一写的过程失败了怎么办
    • A:采用预写日志机制WAL,将数据先写入日志中,然后写入memtable(该过程是原子性的),如果immutable memtable溢写形成(该过程是原子性的)SSTable的过程失败,可以将WAL数据重放,形成memtable,然后重试
  • Q:每个sstable内部主键唯一且有序,但是多个之间还是会有冲突啊
    • A:没错由immutable memtable形成的SSTable确实会有这个问题,我们得想办法把他们合并起来
    • A:由immutable memtable形成的SSTable我们给他起个名字叫Level0层,假设0层的数据最多存10MB,如果一旦超出10MB我们就把它放到Level1层,而且在放的时候我们要根据Key进行合并,每个SSTable都有key区间(比如从a-e),在放到Level1层的时候,我们先根据key区间找到会受到合并影响的Level1的SSTable(比如SSTable1[a,c],SSTable2[d,e]),然后让他们三个SSTable 做一个排队按高矮个排序的动作,咋排呢?
    • 先都站到一起,根据Key排序小的在前,大的在后,相同的key后来的替代先来的,这样之后三个SSTable的key就合并成了一个不重复且有序的大SSTable,但是也不能太大,按照大小限制,再切分成多个SSTable(上述假设可能最后会形成 [a,c],[d,e]两个SSTable)
    • 这样从Level1层开始,一个key多个值的问题我们解决了,SSTable之间的key也是全局有序。有序且唯一
  • Q:Level0层的SSTable合并到Level1时,万一某个SSTable包含了Level2的最小Key和最大Key,这样就覆盖到了Level1整层,那Level1中所有的SSTable都要进行一次排序啊
    • A:确实会有这个问题,因为level0中的SSTable key的范围没法控制,那得继续往下分层(这就是分层原因),Level0层存10M,那Level1层就存100M(10倍),Level1层满了就往Level2进行合并,level1中的SSTable key的范围肯定不会出现[Minkey,MaxKey],因为是有序的,而且每个SSTable的数据量均等。
    • A:为了防止数据量过大依然导致这种问题,我们多分几层(默认7层),假设L0 10M 那7层 10*10^7,能存很多了。
  • Q:那分这么多层,找的范围也多啊
    • A:不是的,数据是从上往下流转的,新来了一个a=1,那我先找memtable,再找L0 SSTable、L1 SSTable。。,找到之后就不往下找了,自动就完成了冷热数据分离,热数据在上边,冷数据在下边
  • Q:那万一我查一个最冷的Key呢?
    • A:那就是最长寻址过程了:
      • 1、memtable 内存快速查询
        • 2、immutable memtable 内存快速查询
          • 3、Level0,根据索引文件,获取到可能包含这个Key的所有SSTable,每一个SSTable都得读一遍,看看是否存在,但是可以倒序读,先读新的SSTable,再读老的
            • 4、Level1-Levelk,每一层都要,根据索引文件,直接定位到包含这个key的SSTable segement,如果有,只会有一个SSTable,因为每一层内部都是有序的
              • 5、最长就是到Levelk层,找到那个唯一的SSTable
                • 6、所有的segement,进行bloom过滤,判断是否存在
                  • 7、bloom如果存在,判断是否为bloom假命中,最后给出value的值

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

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

相关文章

Debezium日常分享系列之:Debezium Engine

Debezium日常分享系列之:Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行,并配置一个或多个连接器来监视上游…

MongoDB分片集群搭建及扩容

分片集群搭建及扩容 整体架构 环境准备 3台Linux虚拟机,准备MongoDB环境,配置环境变量。一定要版本一致(重点),当前使用 version4.4.9 配置域名解析 在3台虚拟机上执行以下命令,注意替换实际 IP 地址 e…

Pynsist 打包应用 和 PyWebIO 构建Web 应用

Pynsist:一键打包Python 应用代码为Windows 安装程序。 项目地址: https://github.com/takluyver/pynsist PyWebIO:为Python 开发者提供了一种快速、简洁的方式来创建Web 应用,无需学习前端技术 项目地址:https://g…

【HarmonyOS】层级轮播卡片效果

【HarmonyOS】层级轮播卡片效果 一、功能效果: 1.上下堆叠由大到小的卡片层叠效果。 2.上层卡片可手势左右滑动,自动左滑动。 3.三层卡片随滑动,内容进行依次切换。 二、开发思路 【完整代码见章节三】 1.最上层使用swiper进行轮播效果…

Python_Flask02

所有人都不许学Java了,都来学Python! 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy,安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform,里面定义了两种操作,一个是将图像转换为Tensor,一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集,这个函数有四个常见的…

区块链概念 Web 3.0 实操

1. Web 3.0 概述 1.1 定义与背景 Web 3.0,也称为第三代互联网,是一个新兴的概念,它代表着互联网的未来发展和演进方向。Web 3.0的核心理念是去中心化、用户主权和智能化。这一概念的提出,旨在解决Web 2.0时代中用户数据隐私泄露…

linux下使用gdb运行程序,查看程序崩溃原因

1.什么是gdb? gdb 是 GNU Debugger 的缩写,是一个功能强大的用于调试程序的开源调试器工具。它可以帮助开发人员诊断和解决程序中的错误、跟踪程序执行过程、查看变量的值等。gdb 支持多种编程语言,包括 C、C、Objective-C、Fortran 等,并可…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候,也想看一下一个方法到底是哪里调用的,工程太大,断点太麻烦,可以加堆栈日志。 在你的方法中加上这两句,就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制,特别是在需要从索引中检索大量数据时。通常情况下,Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…

【漏洞复现】网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 @TOC 一、漏洞概述 1.1漏洞简介 漏洞名称:网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞漏洞编号:无漏洞类型:信息泄露漏洞威胁等级:高危影…

掌握小程序地理位置服务插件,让用户体验再升级

在小程序开发中,地理位置服务插件扮演着至关重要的角色,它们不仅能够帮助开发者轻松获取用户的地理位置信息,还能够基于位置数据提供丰富的功能,如地图展示、周边搜索、路径规划等。 一、插件的基本概念与引入 插件定义&#xf…

IDE如何安装插件实现Go to Definition

项目背景 框架:Cucumber Cypress 语言:Javascript IDE:vscode 需求 项目根目录cypress-automation的cypress/integration是测试用例的存放路径,按照不同模块不同功能创建了很多子目录,cucumber测试用例.feature文…

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中,您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”,它们可以在系统启动时自动加载并开始运行,有时甚至在后台默默工作。虽然一些启动项可能是必要的(如杀毒软件)&a…

探索自然语言处理奥秘(NLP)

摘要 自然语言处理(NLP)是人工智能领域的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。这项技术让机器能够阅读文本、听懂语音,并与人类进行基本的对话交流。 通俗理解 自然语言处理(NLP&#xff09…

html ul li 首页渲染多条数据 但只展示八条,其余的数据全部隐藏,通过icon图标 进行展示

<div style"float: left;" id"showMore"> 展开 </div> <div style"float: left;“id"hideLess"> 收起 </div> var data document.querySelectorAll(.allbox .item h3 a); const list document.querySelectorAl…

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤&#xff1a; 1 三次握手建立连接; 2 开始通信&#xff0c;进行数据交换; 3 四次挥手断开连接&#xff1b; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好&#xff0c;套接字B。我这儿有数据要传给你&#xff0c;建立连接吧。" 【第二次…

力扣--543.二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 /** Definition for a binary tree node.public…

报错 JSON.parse: expected property name or ‘}‘,JSON数据中对象的key值不为字符串

报错 JSON.parse: expected property name or ‘}’ 原因 多是因为数据转换时出错&#xff0c;可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题&#xff08;后端给的JSON数据里&#xff0c;对象key值不为string&#xff09; 现在后端转换JSON数据大多…

在ensp进行IS-IS网络架构配置

一、实验目的 1. 理解IS-IS协议的工作原理 2. 熟练ensp路由连接配置 二、实验要求 需求&#xff1a; 路由器可以互相ping通 实验设备&#xff1a; 路由器router6台 使用ensp搭建实验坏境&#xff0c;结构如图所示 三、实验内容 R1 u t m sys undo info en sys R1 #设…