rockdb

Lsm-tree比B+树更省空间,但不是一个数据结构,是一种存储方式,越热的数据越在上层。

需要的头文件

option用来调参。

数据首先会被写入到一个内存结构(如跳表),当这个结构达到一定大小时,它会被flush到磁盘上形成一个新的SSTable(Sorted String Table)。之后的写操作会继续写入新的内存结构中,而多个SSTable会在后台进行合并(compaction),以减少查询时需要搜索的文件数量

  1. 空间利用率:当内存中的MemTable达到一定的大小阈值时,它会被flush到磁盘上,形成一个新的SSTable。如果磁盘上的SSTable占用的空间超过了一定的阈值,就可能触发合并操作。

  2. 重叠范围:如果新生成的SSTable与已有的SSTable有重叠的键值范围,那么为了减少未来的查询成本,系统可能会决定合并这些重叠的SSTable。

  3. 读放大问题:随着更多SSTable的加入,查询时需要检查的SSTable数量增加,这会导致读放大(read amplification)问题,即每次查询都需要扫描更多的文件。为了避免这种情况,系统可能会定期合并SSTable,以减少每个查询需要访问的文件数。

  4. 写放大问题:在某些情况下,如果写操作频繁发生,那么频繁的合并也会导致写放大(write amplification),即每次写入都要涉及到多次磁盘I/O操作。因此,合并操作也需要考虑到写放大问题,避免过度合并。

Write-Ahead Log (WAL),也称为预写日志。WalesDB 使用 WAL 来增强数据的一致性和恢复能力。以下是 WAL 的主要用途:

数据持久性

WAL 确保数据的持久性。当 RocksDB 接收到写操作(如插入、更新或删除)时,它首先会将这些操作记录到 WAL 中,然后再应用到内存中的 MemTable。即使在写操作完成之后立即发生系统崩溃,也可以通过 WAL 文件恢复未持久化到磁盘的数据。如果有多个列簇,那么多个memtable对应一个wal,如果只有一个列簇,那么一个memtable对应一个wal。

WAL 文件通常被设计成顺序写入的方式,这比随机写入要快得多。顺序写入可以利用硬盘的连续写入性能,尤其是对于SSD来说,顺序写入的性能非常好

redis相当于aof,mysql相当于redolog

由于硬盘采用sortstringtable,是顺序存储,比B+树写的速度要快

MemTable 中的数据按照键的顺序插入,这有助于后续的数据合并和查询操作。当 MemTable 达到一定的大小阈值时,它会被标记为不可变(即变为 Immutable MemTable),然后一个新的空 MemTable 将被创建来接收新的写操作。就地存储,保证数据不重复

写入硬盘时,首先写入0级,即最热级,然后合并时会加入到l1级,合并继续往下,sstable会越来愈大,并越来越少。在合并时对于每个键,RocksDB 会检查所有 SSTable 文件中的对应键值对,并选择具有最大序列号

在读时,先读memtable,没有在读只读memtable,然后在le-0读,可能会读取多次,因为数据可能有重复的,一次没找到不代表下一次没找到,没有再去le-1读,不会重复读,然后依次往下

使用布隆过滤器优化,不会保存kv,只有一个位图。在插入时给通过hash给位图置为1,在查找时通过hash查找位图,只要有一个为0则一定不存在,全为1可能存在。使用的前提是不能使用删除操作。

BlockCache

自定义的缓存,可以用来保存布隆过滤器等,可以让读取数据库时不涉及系统内存,直接读取硬盘

LSM-Tree三大问题和解决

写放大

物理写入数据与逻辑写入之比。会有更多写入操作,占用空间和效率。可以减少和优化合并操作,压缩数据。

读放大

物理读数据与逻辑读之比。读放大会导致读取延迟增加。可以使用布隆过滤器,预加载数据。

 空间放大

空间放大是指在 LSM Tree 中,由于合并操作的存在,可能会导致存储空间的利用率降低。导致存储空间的浪费。可以使用增量合并策略,只合并必要的数据,压缩数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值