存储

edit

存储模块允许您控制索引数据在磁盘上的存储和访问方式。

这是一个低级设置。某些存储实现具有较差的并发性或禁用了堆内存使用的优化。我们建议坚持使用默认设置。

文件系统存储类型

edit

有不同的文件系统实现或存储类型。默认情况下,Elasticsearch会根据操作环境选择最佳的实现。

存储类型也可以通过在 config/elasticsearch.yml 文件中配置存储类型来为所有索引显式设置:

index.store.type: hybridfs

这是一个可以在索引创建时基于每个索引设置的静态配置:

PUT /my-index-000001
{
  "settings": {
    "index.store.type": "hybridfs"
  }
}

这是一个仅限专家的设置,未来可能会被移除。

以下部分列出了所有支持的不同存储类型。

fs
默认的文件系统实现。这将根据操作环境选择最佳的实现,目前在所有支持的系统上为hybridfs,但可能会发生变化。
simplefs
已弃用::[7.15,"simplefs 已被弃用,并将在 8.0 中移除。请改用 niofs 或其他文件系统。Elasticsearch 7.15 或更高版本使用 niofs 作为 simplefs 存储类型,因为它提供了优于或相当于 simplefs 的性能。"]

Simple FS 类型是文件系统存储的一个简单实现(映射到 Lucene SimpleFsDirectory),使用随机访问文件。这个实现具有较差的并发性能(多个线程会导致瓶颈),并且禁用了一些针对堆内存使用的优化。

niofs
NIO FS 类型将分片索引存储在文件系统上(映射到 Lucene NIOFSDirectory),使用 NIO。它允许多个线程同时从同一个文件中读取。不建议在 Windows 上使用,因为 SUN Java 实现中存在一个 bug,并且禁用了一些堆内存使用的优化。
mmapfs
MMap FS 类型将分片索引存储在文件系统上(映射到 Lucene MMapDirectory),通过将文件映射到内存(mmap)。内存映射会占用进程中等于被映射文件大小的虚拟内存地址空间部分。在使用此类之前,请确保您已分配了足够的 虚拟地址空间
hybridfs
hybridfs 类型是 niofsmmapfs 的混合体,它根据读取访问模式为每种类型的文件选择最佳的文件系统类型。 目前只有 Lucene 术语字典、规范和文档值文件被内存映射。所有其他文件都使用 Lucene NIOFSDirectory 打开。 与 mmapfs 类似,请确保您已允许足够的 虚拟地址空间

您可以通过设置 node.store.allow_mmap 来限制使用 mmapfs 和相关的 hybridfs 存储类型。这是一个布尔设置,指示是否允许内存映射。默认情况下是允许的。例如,如果您处于无法控制创建大量内存映射的环境中,您可能需要禁用使用内存映射的能力,这时此设置就很有用。

将数据预加载到文件系统缓存中

edit

这是一个专家设置,其细节可能会在未来发生变化。

默认情况下,Elasticsearch完全依赖操作系统的文件系统缓存来进行I/O操作的缓存。可以通过设置index.store.preload来告诉操作系统在打开时将热索引文件的内容加载到内存中。此设置接受以逗号分隔的文件扩展名列表:所有扩展名在列表中的文件在打开时都会被预加载。这对于提高索引的搜索性能非常有用,特别是在主机操作系统重新启动时,因为这会导致文件系统缓存被清空。但请注意,这可能会减慢索引的打开速度,因为它们只有在数据被加载到物理内存后才能变为可用。

此设置仅为尽力而为,具体效果取决于存储类型和主机操作系统。

The index.store.preload 是一个静态设置,可以在 config/elasticsearch.yml 中设置:

index.store.preload: ["nvd", "dvd"]

或在索引创建时的索引设置中:

PUT /my-index-000001
{
  "settings": {
    "index.store.preload": ["nvd", "dvd"]
  }
}

默认值为空数组,这意味着不会主动将任何内容加载到文件系统缓存中。对于经常搜索的索引,您可能希望将其设置为 ["nvd", "dvd"],这将导致规范和文档值被主动加载到物理内存中。这是首先要查看的两个扩展,因为Elasticsearch对它们执行随机访问。

可以使用通配符来指示应预加载所有文件: index.store.preload: ["*"]。但请注意,通常没有必要将所有文件加载到内存中,特别是存储字段和词向量的文件,因此更好的选择可能是将其设置为 ["nvd", "dvd", "tim", "doc", "dim"],这将预加载归一化值、文档值、词典、倒排索引列表和点,这些是搜索和聚合中最重要的一部分索引。

对于向量搜索,您使用近似k近邻搜索, 您可能希望将设置设置为向量搜索文件:["vec", "vex", "vem"] ("vec" 用于向量值,"vex" 用于HNSW图,"vem" 用于元数据)。

请注意,在索引大小超过主机内存大小的情况下,此设置可能会带来危险,因为它会导致在大型合并后重新打开时文件系统缓存被破坏,从而使索引和搜索速度变慢