Elasticsearch — Урок 4.4 Translog и зачем он нужен

В прошлых уроках мы узнали, что при индексировании документов создается новый сегмент. Поскольку запись сегмента на диск при каждом обновлении очень дорога, сегмент записывается только в оперативную память. Когда выполняются определенные условия, процесс, известный как Lucene commit, записывает все файлы (сегменты) из памяти на диск.

Если узел падает до того, как файлы в памяти сохранятся на диске, данные из оперативной памяти теряются, и любые незафиксированные изменения также теряются. Но фиксация Lucene очень дорога и не может быть выполнена после каждой операции. Чтобы решить эту проблему, Elasticsearch использует журнал транзакций, который называется Translog.

Во время операции индекса или удаления документ записывается как в памяти, так и в журнал транзакций. Операция index / delete подтверждается только после того, как данные сохраняются на диск. Если система выходит из строя до того, как сегменты сохраняются на диске, они воспроизводятся из translog-a при перезапуске сервера. Когда translog становится слишком большим и выполняются некоторые другие условия, автоматически создается новый translog. Этот процесс известен как flush.

Асинхронно или синхронно?

По умолчанию операция индекса подтверждается только после того, как translog записывается на диск в первичных узлах и репликах. Если вы выполняете массовый индекс и не возражаете потерять несколько секунд данных в случае сбоя, вы можете настроить translog на определенный интервал, а не на каждую операцию индекса. Изменение режима translog в async значительно улучшает производительность индекса.

Актуальные данные из translog

Ранее мы обсудили, что данные, которые вы сохранили, доступны для поиска только через одну секунду. Это связано с тем, что процесс обновления выполняется один раз в секунду. Но когда вы получаете документ по его идентификатору, вы всегда будете получать последние данные.

Когда вы извлекаете документ по его идентификатору, Elasticsearch проверяет translog, чтобы получить данные еще не переданные в инвертированный индекс. Таким образом по идентификатору документа всегда можно получить самые свежие данные (если конечно translog не в режиме async).