LSM树

磁盘

在这里插入图片描述

扇区 和 磁道

下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)

在这里插入图片描述

柱面

硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。 如下图

在这里插入图片描述

块(多个扇区)

简单的说扇区是对硬盘而言,块是对文件系统而言。
文件系统不是一个扇区一个扇区的来读数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的,block才是文件存取的最小单位。,一个块有多个扇区

块与页的关系:操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位

磁盘读写(顺序读写很快)

磁盘读写时涉及到磁盘上数据查找,地址一般由柱面号、盘面号和块号三者构成。也就是说移动臂先根据柱面号移动到指定柱面,然后根据盘面号确定盘面的磁道,最后根据块号将指定的磁道段移动到磁头下,便可开始读写。
在这里插入图片描述

LSM树(日志结构合并树(Log-Structured Merge-Tree))

原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。

适用场景:
	插入比查询多。代表数据库:nessDB、leveldb、hbase等
特点:	
	它牺牲了部分读性能,用来大幅提高写性能,适合
03-30
### LSM据结构及其实现原理 #### 什么是LSMLSM(Log-Structured Merge Tree)是一种高效处理海量据读写的存储引擎设计模式。其核心目标是通过减少随机写入操作的量,从而显著提升写入性能[^3]。 --- #### LSM的核心组件 1. **内存部分 (MemTable)** 写入请求首先被记录到一个称为 MemTable 的内存据结构中。通常是一个有序的键值对集合,在内存中按顺序排列以便快速查找和插入。当 MemTable 达到一定大小时,会被冻结并持久化到磁盘上作为 SSTable 文件的一部分[^1]。 2. **磁盘部分 (SSTable)** 当 MemTable 被刷写到磁盘时,它会转换成不可变的文件形式,即 SSTable(Sorted String Table)。这些文件按照键值范围分片存储,并且内部按键排序。每次新的 SSTable 创建后,都会触发后台线程执行合并过程以优化整体查询效率。 3. **WAL 日志 (Write-Ahead Log)** 为了防止系统崩溃导致未保存至 MemTable 或 SSTable 中的据丢失,所有的修改操作还会同步追加到 Write-Ahead Log (预写日志)里。这样即使发生意外宕机也能恢复最近的操作记录。 --- #### 工作流程概述 以下是 LSM 的主要工作阶段: 1. **写入路径** - 用户发起写请求时,新条目直接存放到 MemTable 并同时追加到 WAL。 - 如果 MemTable 填满,则将其内容转储为一个新的 SSTable 文件并刷新到硬盘上。 2. **读取路径** - 对于每一次读取请求,系统依次检查多个位置:首先是当前活跃的 MemTable;其次是尚未完成合并的老版本 SSTables 和最新生成的新版 SSTables。 - 查询过程中可能涉及多层不同时间戳下的副本比较,最终返回最新的有效结果[^2]. 3. **Compaction 合并机制** 随着时间推移,会产生越来越多的小型 SSTable 文件。为了避免过多碎片化的索引影响检索速度,周期性的 Compaction 进程负责将若干个小表合并成为一个更大的全局一致视图。此步骤不仅能够消除重复项或者标记已删除项目,还能重新整理物理布局使得后续访问更加紧凑连续。 --- #### 性能特点分析 - **优势** - 提高了大批量持续写入场景下的吞吐能力,因为大部分实际改动都发生在易失性 RAM 缓冲区内而不是昂贵缓慢的传统机械硬盘介质之上; - 减少了因频繁覆盖造成的额外开销,特别是在 SSD 上表现尤为明显由于减少了擦除次延长使用寿命; - 支持动态调整参比如压缩比率、扇区尺寸等满足特定应用需求. - **劣势** - 可能带来较高的延迟波动尤其是对于单个事务而言如果正好赶上正在进行的大规模 compactions 操作期间; - 相较传统 B+Trees 来说初始构建成本较高并且维护复杂度也有所增加. ```python class LSMTNode: def __init__(self, key=None, value=None): self.key = key self.value = value def write_to_memtable(memtable, key, value): memtable[key] = value def flush_memtable_to_disk(memtable): sstable_file = [] sorted_items = dict(sorted(memtable.items())) for k,v in sorted_items.items(): sstable_file.append((k,v)) return sstable_file mem_table = {} write_to_memtable(mem_table,"key1","value1") # Simulate writing to memory table. flushed_data = flush_memtable_to_disk(mem_table) # Flush data when full or triggered by policy. print(flushed_data) ``` 上述代码片段展示了如何模拟向 MemTable 插入一条记录以及之后如何把整个表格的内容导出成为 SSTable 形式的列表对象。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值