Изменения в Lucene сохраняются на диске только во время фиксации Lucene, которая является относительно дорогой операцией и поэтому не может выполняться после каждой операции индексирования или удаления. Изменения, произошедшие после одной фиксации и до другой, будут удалены из индекса Lucene в случае завершения процесса или аппаратного сбоя.
Коммит Lucene слишком дорог для выполнения каждого отдельного изменения, поэтому каждая копия шарда также записывает операции в свой журнал транзакций, известный как translog. Все операции индексирования и удаления записываются в translog после обработки внутренним индексом Lucene, но до того, как они будут подтверждены. В случае сбоя недавние операции, которые были подтверждены, но еще не включены в последний коммит Lucene, восстанавливаются из translog, когда шард восстанавливается.
Промывка Elasticsearch (flush) - это процесс выполнения фиксации Lucene и начала генерации нового транслога. Промывка выполняется автоматически в фоновом режиме, чтобы убедиться, что транслог не вырастет слишком большим, что приведет к тому, что воспроизведение его операций займет значительное время во время восстановления. Возможность выполнить "промывку" вручную также доступна через API, хотя это редко требуется.
Настройки Translog
Данные в транслоге сохраняются на диске только при синхронизации и фиксации транслога.
Все данные, записанные с момента предыдущей фиксации транслога, будут потеряны, в случае:
- Аппаратного сбоя
- Сбоя операционной системы
- Сбоя JVM
- Сбоя шарда .
По умолчанию index.translog.durability установлен на request, что означает, что Elasticsearch будет сообщать клиенту об успешном выполнении запроса на индекс, удаление, обновление или массовый запрос только после того, как транслог будет успешно синхронизирован и зафиксирован на основном и всех выделенных репликах. Если index.translog.durability установлен на async, то Elasticsearch будет синхронизировать и фиксировать транслог только через каждый интервал index.translog.sync_interval, что означает, что любые операции, которые были выполнены непосредственно перед сбоем, могут быть потеряны при восстановлении узла.
Следующие динамически обновляемые настройки для каждого индекса управляют поведением транслога:
- index.translog.sync_interval - Как часто транслог синхронизируется с диском и фиксируется, независимо от операций записи. По умолчанию установлено значение 5 с. Значения менее 100 мс не допускаются.
- index.translog.durability - Выполнять или нет fsync и фиксацию транслога после каждого запроса индекса, удаления, обновления или массового запроса. Этот параметр принимает следующие параметры:
- request - (по умолчанию) fsync и фиксация после каждого запроса. В случае аппаратного сбоя все подтвержденные записи уже будут зафиксированы на диске.
- async - fsync и фиксация в фоновом режиме через каждый sync_interval. В случае сбоя все подтвержденные записи с момента последней автоматической фиксации будут отброшены.
- index.translog.flush_threshold_size - В translog хранятся все операции, которые еще не сохранены в Lucene (т.е. не являются частью точки фиксации Lucene). Хотя эти операции доступны для чтения, их нужно будет воспроизвести, если шард был остановлен и его пришлось восстанавливать. Этот параметр контролирует максимальный общий размер этих операций, чтобы восстановление не занимало слишком много времени. При достижении максимального размера произойдет сброс, создавая новую точку фиксации Lucene. По умолчанию 512 мб.