Частые обновления индекса

Как ведет себя индекс при частых обновлениях? Он будет увеличиваться до бесконечности или же elastic будет оптимизировать индекс и форматировать его?

А какие записи обновляются? В основном свежие, или которые в индексе уже долгое время были?

Чаще всего средней свежести, которые лежат в индексе в пределах 3 мес. Они могут обновляться в интервале от нескольких раз в сутки д в течении одной недели. Ежесуточно изменяется порядка 1-2% от общего объема документов. Документов в индексе 4.5 млн.

Данные в elasticsearch индексируются в сегменты. Сегменты эти неизменны, то есть как только мы документ добавили, он в сегменте так и остаются, пока этот сегмент жив. Если нам надо документ обновить, мы помечаем его как удаленный в старом сегменте и добавляем в новый сегмент. Когда сегментов становиться слишком много - они сливаются, и во время этого слития, несколько сегментов объединяются в один и удаленные записи игнорируются. Слитие происходит на нескольких уровнях - то есть новые маленькие сегменты сливаются в сегменты побольше, те между собой в еще большие, и т.д. Как это выглядит примерно можно посмотреть тут. Суть в том, старые копии обновленных записей удаляются только при слитии сегментов, в которых эти записи были в момент удаления. То есть, обновленные свежие записи в свежих сегментах места много не занимают. Но если запись старая, она скорее всего слилась в старый большой сегмент. Эти сегменты сливаются редко, так что копии старых записей, могут оставаться достаточно долго.

Вот тут коллега достаточно подробно описал segment merging.
У меня правда кое-какие вопросы всё равно остались - придётся код читать.

1 Like

А при обновлении связь с дочерними документами не теряется ведь? Они тоже копируются в новый сегмент?

Если вы спрашиваете про nested - то да, они всегда остаются вместе, даже когда сегменты сливаются. Если про parent/child - то они остаются на одной шарде, их положение в сегментах особой роли не играет.

Спасибо!

А можно ли использовать Force Merge с флагом only_expunge_deletes = true для того что бы действительно удалить строки помеченные для удаления?

А цель какая?

При индексировании я не учел ряд факторов, потом несколько раз переиндексировал документы с новой структурой. В итоге индекс разросся. Отношение документов к удаленным составляет (41091796 к 7571766), что равно примерно 18%. При размере в 640Гб, это могло бы освободить порядка 100Гб.

То есть, вы этот индекс создали и теперь он меняться никогда не будет?

Будет, но его изменения не будут столь агрессивными как сейчас.

В этом случае, может иметь смысл. Но в целом, надо быть готовым к тому, что в индексе будут дырки и шардам будем нужно дополнительное место для сливания сегментов. Так что я бы лично добавил дополнительное дисковое пространство и оставил как есть, до следующего пере-индексирования. Если вы только начинаете работать с elasticsearch, то вам, скорее всего, придется пере-индексировать этот индекс еще несколько раз.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.