Как я могу использовать индексы эластичного поиска исключительно в памяти?

У меня есть класс, который хранит документы и индексирует их с помощью клиента elasticsearch. Я бы хотел, чтобы индексы находились только в памяти, если только они не были явно сохранены на диск. Конкретно:

  • может создать индекс и искать его
  • стирается с диска при завершении сеанса, если не сохранен
  • если сохраняется, сохраняется на диск

Однако Elasticsearch фактически является службой на диске (записывает индекс непосредственно на диск, удаляет по запросу).

Есть ли способ получить желаемое поведение от Elasticsearch?


person anon01    schedule 03.11.2020    source источник


Ответы (2)


Эта функция была удалена давным-давно (в ES 1.7). Можно было использовать memory store для хранения всего в памяти, а не в файле.

Это было устарело и удалено в ES 2.0. по понятным причинам, т. е. это не обеспечивало никакой отказоустойчивости на случай, если узел сломается.

Нечто похожее — это возможность предварительно загружать все в память при запуске, даже если это не полностью соответствует вашим требованиям. Не стесняйтесь подробно объяснять, почему вам требуется такое поведение.

person Val    schedule 03.11.2020
comment
Я не думаю, что это то, что я ищу. Из того, что я могу сказать, это не то же самое, что обычный индекс в памяти, а альтернативный кеш для операций ввода-вывода, и его поведение отличается от обычного индекса (например, он принимает ввод в виде расширений файлов). - person anon01; 12.11.2020
comment
Мне нужен индекс, который функционирует точно так же, как обычно, но хранится в памяти, а не на диске. Я не видел ничего подобного в документах или где-либо еще. Вместо этого я пометил индексы как временные с помощью префикса, определил операцию их сохранения (фактически переименовать) и операцию очистки временных индексов. - person anon01; 12.11.2020
comment
Этого больше нет в Elasticsearch - person Val; 12.11.2020

Вы правы в том, что документы Elasticsearch сохраняются на диске, но данные кэшируются в ОЗУ, поэтому наши запросы /GET будут получать более быстрый ответ при поиске, если у вас достаточно памяти.

вы можете явно пометить тип хранилища индексов как кешированный, используя приведенный ниже запрос, чтобы сохранить индекс осколка в файловой системе (сопоставляется с Lucene MMapDirectory), сопоставив файл с памятью

curl -XPUT /indexname { "settings": { "index.store.type": "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 Hot-warm node, а для горячего узла вы можете применить настройки хранилища индексов к mmapfs, возможно, только для горячих узлов.

Дополнительная информация: https://www.elastic.co/blog/hot-warm-architecture-in-elasticsearch-5-x

person Kovalan R    schedule 03.11.2020
comment
Обратите внимание, что mmapfs по-прежнему использует файловую систему для хранения данных, и у вас нет выбора, чтобы решить, когда и будут ли данные записываться в файловую систему, о чем спрашивает OP. - person Val; 03.11.2020