阿里技面之LSM-Tree如何加速随机写

2024-01-20 23:32

本文主要是介绍阿里技面之LSM-Tree如何加速随机写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 面试还原
  • 什么是LSM-Tree
  • 写入操作
  • 读取操作
  • 读取优化
  • 删除操作

面试还原

技面第二轮面试题问到了LSM-Tree是如何实现加速随机写的。不是存储研发方向的童鞋们一看这个题可能会一脸懵逼,可能会疑惑什么是LSM-Tree啊,以前只听过红黑树、B+树。那么,这个数据结构又有什么特点,为什么能它用来对随机写进行加速。
LSM-Tree常被用于一些目前流行的key-Valuex型存储引擎,比如 Bigtable、Cassandra、HBase、RocksDB,它通过将大量的随机写转换为顺序写来达到数据写性能的提升,但是也带来了读取性能的下降。更适合写多读少的应用场景。

什么是LSM-Tree

LSM-Tree(Log Structured Merge Tree),它是一种分层、有序、面向磁盘的数据结构。主要利用了磁盘批量的顺序写性能远胜于随机写的特性,对数据的操作均采用追加方式,不进行删除和更新。但是该设计在大大提升了写性能的同时降低了读性能。
在这里插入图片描述

举个例子,我们要插入一条数据到LSM-Tree,那么执行 “put key1 bar”,该操作首先被写入磁盘的WAL日志中,该操作用于故障恢复,如果出现宕机就可以将内存中来不及写入磁盘的数据进行恢复从而确保了数据写入的可靠性。然后,将这个数据写入到内存中的MemTable,这个时候并不会去判断该key值是否已经存在,之后便可以回复用户写入成功。内存是有限的不可能不断写入,所以MemTable固定大小一般是32M,当MemTable写满之后,被转换为Immutable MemTable(只读MemTable),然后创建一个空的MemTable继续写入数据,为什么使用Immutable MemTable呢?因为这样可以避免MemTable中的内存序列化到磁盘阻塞写操作。这个时候,有一个后台线程会不停地将Immutable MemTable复制到磁盘中并释放内存,每个Immutable MemTable对应于磁盘中的SSTable,SSTable,全称是sorted string table。它拥有一种持久化、有序且不可变的键值存储结构。它的key和value都是任意的字节数组。它内部包含一系列可配置大小的Block(默认大小一般是64k)。Block的索引存储在尾部,当SSTable打开时,索引被加载到内存。然后根据key在导入内存里面再进行二分查找,找到key对应的offset之后,然后去磁盘把相应的数据块读出来。这些SSTable文件,虽然每个文件中的key是有序的,但是文件之间完全完全无序遭成还是无法查找。这里SSTable巧妙地采用了分层合并机制来解决乱序的问题。啥意思?
SSTable被分为很多了层,越往上层文件越少,越往底层文件越多。每一层的容量都有一个固定的上限值,一般来说,下一层的容量是上一层的10倍。当某一层写满了,就会触发后台线程往下一层合并,数据被合并到下一层之后,本层的SSTable文件就可以删除掉了。合并过程其实也是个排序过程,除了Level 0以外,每一层内的文件都是有序的,文件内的KV也是有序的,这样就便于查找了。
这个合并步骤叫做Major Compaction,这个阶段会真正地清除掉被标记删除掉的数据以及多版本数据的合并,从而避免浪费空间。由于SSTable都是有序的,可以直接采用Merge Sort进行高效合并。
所以,利用WAL确保数据写入的可靠性,只进行数据的追加不更新数据的特性,只要写入WAL和MemTable便认为数据已经写入成功,这样充分利用顺序写入提升了数据写入性能,同时又利用了分层合并机制提示了数据的查询性能。

写入操作

在这里插入图片描述
写入操作只需要在WAL文件中顺序写入当前操作,写入成功之后将该数据写入MemTable中即可认为写入成功。

读取操作

采用分层查找的方法。首先在内存中的MemTable和Immutable MemTable中查找,之后到磁盘的SSTable的每层进行查找,找到后直接返回。数据是根据这个路径追加的,因此按照这个路径就能查找到。这样的查找方式有可能由于需要多次进行内存和文件的查找才可以找到符合条件的key,但是这个分层结构越是被经常读写的热数据越靠上,对这样的key查找就很快。

读取优化

实际使用中,通常可以对读取操作进行下一步的优化,在内存中缓存SSTable文件的key,这样可以采用布隆过滤器进行加速查找。比如LevelDB中有个manifest文件,它记录了SSTable文件的一些关键信息,比如Level层数,文件名,最小key值,最大key值等,这个文件通常不大,完全可以放入内存。从而帮助快速定位要查询的SSTable文件。

删除操作

删除数据时并不是立即删除,而是记录下对这个key的操作操作做标记,只有当合并SSTable文件时才会真正地删除。

这篇关于阿里技面之LSM-Tree如何加速随机写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627702

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

阿里云服务器ces

允许公网通过 HTTP、HTTPS 等服务访问实例 https://help.aliyun.com/document_detail/25475.html?spm=5176.2020520101.0.0.3ca96b0b3KGTPq#allowHttp

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro