Elasticsearch数据存储概念

Elasticsearch的数据是存储在 磁盘 中,但它也会利用 内存 来提高查询和索引的性能。具体来说,Elasticsearch 采用了 混合存储模型,即数据存储在磁盘上,但为了提高效率,系统会将一些数据和索引结构加载到内存中。这个内存和磁盘的配合使用是 Elasticsearch 高效处理大规模数据的核心之一。

Elasticsearch 的数据存储模型

1、数据存储在磁盘上

  • Elasticsearch 使用 Lucene 作为底层的索引库,而 Lucene 本身是一个 磁盘存储 的系统。所有的数据、文档、倒排索引等都存储在磁盘上的文件中。
  • 每个索引都会被分割成多个 分片(shard),每个分片都有自己的数据文件,并存储在硬盘中。
  • 索引的数据以 倒排索引(inverted index)的形式存储,这种索引结构优化了对文本数据的搜索性能。

2、内存缓存

  • 文件缓存(File System Cache):尽管数据存储在磁盘上,但操作系统会将常用的数据块缓存在内存中(文件系统缓存)。这意味着,如果你经常访问某些数据,操作系统可能会将这些数据从磁盘加载到内存,以提高访问速度。
  • Lucene 内存结构:Lucene 索引会在内存中维护一些索引数据结构,如 字段数据缓存 和 分词器缓存。这些数据结构会加速搜索和索引操作。
  • 查询缓存:Elasticsearch 使用查询缓存(query cache)来存储常用查询的结果,从而避免重复计算。查询结果会存储在内存中,并在后续的查询中复用。
  • 索引写入缓存(Translog):Elasticsearch 使用一个名为 事务日志(Translog) 的结构,将所有索引操作(如新增、更新、删除)记录到磁盘上。但在数据还未刷新到磁盘之前,相关的数据会在内存中缓存一段时间,以提高写入性能。

3、内存使用和垃圾回收

  • Elasticsearch 使用 JVM(Java Virtual Machine) 来运行,所有的内存管理都在 JVM 层面进行。JVM 会为 Elasticsearch 分配堆内存(Heap Memory),并通过垃圾回收机制管理内存的释放。
  • Elasticsearch 的 heap 内存用于存储查询缓存、过滤器缓存、内存中建立的索引数据等。
  • 为了防止内存过度占用导致 JVM 堆溢出,Elasticsearch 会根据配置进行内存限制,通常会限制 JVM 的堆内存大小为总内存的 50%。

4、刷新(Refresh)和合并(Merge)

  • Elasticsearch 会定期执行 刷新(refresh) 操作,将内存中的数据持久化到磁盘上的 Lucene 索引文件中。这通常会发生在每个分片的内存缓存满了之后,或者每隔一定的时间。
  • 合并(merge) 操作是 Elasticsearch 在后台进行的,它会合并多个小的索引段成一个大的段,从而减少磁盘空间的浪费和提高查询效率。合并操作会在后台进行,但它也可能会导致 I/O 负担。

内存和磁盘的配合使用

  • 写入数据

    • 数据首先会写入到内存中的 缓冲区(或者说是内存中的一个小索引)。
    • 然后这些数据会写入到磁盘的 事务日志(Translog) 和索引文件中。
    • 数据会在一段时间内保留在内存中(直到它被刷新到磁盘上),以提高性能。
  • 查询数据

    • 查询首先会检查 内存中的缓存(如查询缓存、字段数据缓存等)。
    • 如果缓存中没有结果,查询将访问磁盘上的数据。
    • 查询过程中,如果 Elasticsearch 发现某些数据在内存中被频繁访问,它会将其缓存到内存中,从而提高后续查询的速度。

关键组件的内存和磁盘关系

  1. 倒排索引(Inverted Index):

    • 存储在磁盘中,用于加速搜索。
    • 在内存中有一个缓存机制来加速查询。
  2. 事务日志(Translog)

    • 记录所有的写操作,存储在磁盘上。
    • 提供了持久性保证(即使系统崩溃,也不会丢失未写入磁盘的数据)。
  3. 内存缓冲区

    • Elasticsearch 会在内存中为每个分片分配一个写缓冲区,用于临时存储写入操作。
    • 数据会在一定的时间间隔或者缓冲区填满后刷写到磁盘。
  4. JVM 堆内存

    • 用于存储运行时的数据结构,如缓存、索引结构等。
    • 管理查询缓存、过滤器缓存和 Lucene 的缓存。

总结

  • Elasticsearch 数据 存储在磁盘上,并使用磁盘存储所有索引和文档数据。
  • 为了提高性能,Elasticsearch 会利用 内存 来缓存索引数据、查询结果和其他操作,以减少磁盘 I/O 的开销。
  • Elasticsearch 通过 内存缓存 和 磁盘持久化 的结合,提供高效的查询和索引性能。

 

 

 

 

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)