史上最全设计网站,重庆市工程建设信息网官网新域名,动画网站源码,2016最新wordpress模板在数据库领域#xff0c;B树拥有无可撼动的地位#xff0c;但是B树的缺点就是在写多读少的场景下#xff0c;需要进行大量随机的磁盘IO读写#xff0c;而这个性能是最差的。并且在删除和添加数据的时候#xff0c;会造成整个树进行递归的合并、分裂#xff0c;数据在磁盘…在数据库领域B树拥有无可撼动的地位但是B树的缺点就是在写多读少的场景下需要进行大量随机的磁盘IO读写而这个性能是最差的。并且在删除和添加数据的时候会造成整个树进行递归的合并、分裂数据在磁盘上也不是连续的。所以会不断的随机写入操作。
所以针对这个问题如何在写多读少的场景下提升性能LSM就是为了解决这个问题。 LSMLog Structure Merge Tree比B树更适合写多读少的场景。 主要原理LSM通过批量的合并写数据减少磁盘旬道的开销。
早期LSM Tree
C0-tree 是存储在内存中而C1-tree是存储在磁盘中。 核心流程是先将数据写入到C0-tree当C0-tree数据写入到一定的阈值时然后开始批量将数据合并和覆写因为可以批量写入所以写入磁盘可以进行顺序写入避免单次的随机写操作。
现代的LSM-tree也是通过内存维护有序结构然后延迟写入磁盘的时机通过合并多次随机写操作。降低磁盘移动的开销。 所以在写多读少的场景下比B树能获得更多的性能。
现代 LSM Tree
包含三部分memtable、immutable memtable、SSTable前两个在内存中后一个在磁盘中。先将数据写入到memtable、然后在合适的时机写入到SSTbale中。 其实仔细一想如果数据都在内存中那么一旦出现断电或者机器宕机那么内存中的数据就会丢失LSM如何来防止出现数据丢失呢 很简单其实就是利用WAL机制也就是同步写入到内存中的时候同步写入到磁盘中一份因为是是以追加append Only的方式存储所以可以在一定程度提写数据的性能。
1.Memtable memtable存储的是近期最新的数据记录一般使用跳表或者哈希等实现。可以快速的删除和查找。 2.Immutable Table 在memtable达到一定的量级之后然后会进行数据的合并好处是一个可以快速的进行顺序写入磁盘中另一个通过数据副本的方式memtable可以继续提供服务。 3.SSTable 包含两部分一个是索引文件另一个就是数据文件。 写入数据的时候会按照一个segment为一段直接将最新的数据追加。那样的话从尾部查询最后一条数据就是最新的数据。但是这样极端情况下可能多个数据存储多次造成磁盘的浪费。并且重复数据多的话查询效率很差但是可以利用布隆过滤器进行优化。
压缩数据 压缩数据其实就是将多个segment合并成一个新的segment图中最新的dog是84所以dog52在合并之后就不存储了。 删除数据 删除数据的时候其实不删除真实数据而是逻辑删除通过标记位tombstone。如果存在就代表数据被删除否则数据存在。
小结
本篇主要为了解决在B树中读少写多而带来的数据合并和分裂引入了LSMLSM的核心其实就是将数据分为两部分一部分在内存中定时更新到磁盘使用WAL机制来保证数据不丢失。所以在写多读少的场景下可以通过使用LSM结构进行构建分布式存储结构。