LSM树和Elasticsearch的索引写入机制

LSM简介

Log Structured Merge Tree,下面简称 LSM。2006年,Google 发表了 BigTable 的论文。这篇论文提到 BigTable 单机上所使用的数据结构就是 LSM。目前,LSM 被很多存储产品作为存储结构,比如 Apache HBase, Apache Cassandra, MongoDB 的 Wired Tiger 存储引擎, LevelDB 存储引擎, RocksDB 存储引擎等。简单地说,LSM 的设计目标是提供比传统的 B+ 树更好的写性能。LSM 通过将磁盘的随机写转化为顺序写来提高写性能 ,而付出的代价就是牺牲部分读性能写放大(B+树同样有写放大的问题)。LSM 相比 B+ 树能提高写性能的本质原因是:外存,其随机读写都要慢于顺序读写,无论磁盘还是 SSD。

三种基本的存储引擎

1、哈希存储引擎

是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是正确的选择。

2、B树存储引擎

是B树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。

3、LSM树存储引擎

和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

LSM树(Log Structured Merge Tree,结构化合并树)的思想非常朴素,就是将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘(由此提升了写性能),是一种基于硬盘的数据结构,与B-tree相比,能显著地减少硬盘磁盘臂的开销。读取时需要合并磁盘中的历史数据和内存中最近的修改操作,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件(存储在磁盘中的是许多小批量数据,由此降低了部分读性能。但是磁盘中会定期做merge操作,合并成一棵大树,以优化读性能)。LSM树的优势在于有效地规避了磁盘随机写入问题,但读取时可能需要访问较多的磁盘文件。

LSM tree的核心特点:

  1. 将索引分为内存和磁盘两部分,并在内存达到阈值时启动树合并(Merge Trees);
  2. 用批量写入代替随机写入,并且用预写日志 WAL 技术(Elasticsearch 中为 translog 事务日志)保证内存数据,在系统崩溃后可以被恢复;
  3. 数据采取类似日志追加写的方式写入(Log Structured)磁盘,以顺序写的方式提高写入效率。

ES中的segment写入机制

一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了translog中。

索引分片(shard)每秒被刷新(refresh)一次:

  • 这些在内存缓冲区的文档被写入到一个新的段中,且没有进行 fsync 操作。
  • 这个段被打开,使其可被搜索。
  • 内存缓冲区被清空。

Segment在被refresh之前,数据保存在内存中,是不可被搜索的,这也就是为什么 ES 被称为提供近实时而非实时查询的原因。

这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志

每隔一段时间,例如 translog 变得越来越大,索引被刷新(flush);一个新的 translog 被创建,并且一个全量提交被执行:

  • 所有在内存缓冲区的文档都被写入一个新的段。
  • 缓冲区被清空。
  • 一个提交点被写入硬盘。
  • 文件系统缓存通过 fsync 被刷新(flush)。
  • 老的 translog 被删除。

数据先写入到内存中,通过定时refresh机制写入到一个segment中,ES后台会进行segment merge(段合并)操作,将多个小的segment合并大的segment。

如上这种机制避免了随机写,数据写入都是 Batch 和 Append,能达到很高的吞吐量。同时为了提高写入的效率,利用了文件缓存系统和内存来加速写入时的性能,并使用translog日志来防止数据的丢失。

对比LSM,ES的这种segment分段写,再合并的机制,和LSM的思想是一致的。

 

参考:

https://www.cnblogs.com/yefeng654321/articles/11422231.html

https://www.jianshu.com/p/42d9dcd4f8cd

 

posted @ 2020-06-01 14:29  阿凡卢  阅读(4425)  评论(0编辑  收藏  举报