【问题标题】:How can I use elastic search indexes exclusively "in-memory"?我如何才能在“内存中”专门使用弹性搜索索引?
【发布时间】:2020-11-03 17:27:10
【问题描述】:

我有一个类可以存储文档并使用 elasticsearch 客户端对它们进行索引。我希望索引仅在内存中,除非明确保存到磁盘。具体来说:

  • 可以创建索引并进行搜索
  • 如果未保存,会话结束时会从磁盘中擦除
  • 如果保存,则保存到磁盘

但是,Elasticsearch 实际上是一种磁盘服务(将索引直接写入磁盘,在询问时删除)。

有没有办法从 Elasticsearch 获得所需的行为?

【问题讨论】:

    标签: python elasticsearch persistence in-memory


    【解决方案1】:

    该功能在很久以前就被删除了(在 ES 1.7 中)。可以利用memory store 将所有内容存储在内存中而不是文件中。

    这是 ES 2.0 中的 deprecated and removed,原因很明显,即它没有提供任何弹性以防节点中断。

    类似的功能是在启动时preload everything in memory,即使这并不能完全满足您的要求。随意扩展您需要这种行为的原因。

    【讨论】:

    • 我认为这不是我想要的。据我所知,这与内存中的典型索引不同,而是用于 IO 操作的替代缓存,并且具有与典型索引不同的行为(例如,它接受作为文件扩展名的输入)。
    • 我想要的是一个功能完全一样的索引,但存储在内存中而不是持久化到磁盘。我在文档或其他地方没有看到这样的东西。相反,我通过前缀将索引标记为临时,定义了保存它们的操作(有效地重命名它们),以及临时索引的清理操作
    • Elasticsearch 中不再存在这种情况
    【解决方案2】:

    Elasticsearch 文档保存在磁盘中是正确的,但是数据缓存在 RAM 中,因此只要您有足够的内存,我们的 /GET 查询将在搜索时获得更快的响应。

    您可以使用以下查询显式将索引存储类型标记为缓存,通过将文件映射到内存来将分片索引存储在文件系统上(映射到 Lucene MMapDirectory)

    curl -XPUT /indexname { "settings": { "index.store.type": "mmapfs" } }
    

    mmapfs

    The MMap FS type stores the shard index on the file system (maps to Lucene MMapDirectory) by mapping a file into memory (mmap). Memory mapping uses up a portion of the virtual memory address space in your process equal to the size of the file being mapped. Before using this class, be sure you have allowed plenty of virtual address space.
    

    在此处阅读有关索引存储类型的更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html

    此外,如果您正在处理 Elasticsearch 上的大量数据并且最近几天的索引查询更频繁,您可以尝试 ElasticSearch 热温节点架构,对于热节点,您可以将索引存储设置应用到 mmapfs 可能仅用于热节点

    更多信息: https://www.elastic.co/blog/hot-warm-architecture-in-elasticsearch-5-x

    【讨论】:

    • 请注意,mmapfs 仍然使用文件系统来存储数据,并且您无法决定何时/是否将数据写入文件系统,这就是 OP问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2021-05-18
    • 2012-05-07
    • 2016-10-08
    相关资源
    最近更新 更多