这是我参与「第四届青训营 」笔记创作活动的第3天 在完成分布式存储项目的过程中,我们希望我们的系统能尽可能的高效利用磁盘,并且在青训营的教学中,了解到了lsm这种数据结构,现记录一下,加油! lsm树既可以保证日志文件好的写性能,又要在一定程度上保证读性能。
lsm树全称叫Log-Structured Merge Tree,也即日志合并树,它支持增、删、读、改、顺序扫描操作。而且通过批量写入,溢出复制技术规避磁盘频繁写入以及随机写入问题。
lsm树的设计思想
lsm树(Log Structured Merge Tree,结构化合并树)的思想非常朴素,就是将对数据的修改存在内存中,达到指定的大小限制,比如memtable,后将这些修改操作批量写入磁盘(由此提升了写性能) ,是一种基于硬盘的数据结构,与B-tree相比,能显著地减少硬盘磁盘臂的开销。当然凡事有利有弊,LSM树和B+树(MySQL InnoDB底层存储数据组织方式)相比,LSM树牺牲了部分读性能,用来大幅提高写性能。
读取时需要合并磁盘中的历史数据和内存中最近的修改操作,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件(存储在磁盘中的是许多小批量数据,由此降低了部分读性能。但是磁盘中会定期做合并操作,以优化读性能)。lsm树的优势在于有效地规避了磁盘随机写入问题,但读取时可能需要访问磁盘,来找到具体的存储位置。 核心思想的核心就是放弃部分读能力,换取写入的最大化能力,放弃磁盘读性能来换取写的顺序性。
LSM操作
LSM树中数据的写操作(包括插入、修改、删除也是写,因为日志要记录)都在内存中进行,这是其快的主要原因。当然leveldb对其也做了优化,比如使用bloomfilter来加速对磁盘块的过滤。