Как ведет себя индекс при частых обновлениях? Он будет увеличиваться до бесконечности или же elastic будет оптимизировать индекс и форматировать его?
А какие записи обновляются? В основном свежие, или которые в индексе уже долгое время были?
Чаще всего средней свежести, которые лежат в индексе в пределах 3 мес. Они могут обновляться в интервале от нескольких раз в сутки д в течении одной недели. Ежесуточно изменяется порядка 1-2% от общего объема документов. Документов в индексе 4.5 млн.
Данные в elasticsearch индексируются в сегменты. Сегменты эти неизменны, то есть как только мы документ добавили, он в сегменте так и остаются, пока этот сегмент жив. Если нам надо документ обновить, мы помечаем его как удаленный в старом сегменте и добавляем в новый сегмент. Когда сегментов становиться слишком много - они сливаются, и во время этого слития, несколько сегментов объединяются в один и удаленные записи игнорируются. Слитие происходит на нескольких уровнях - то есть новые маленькие сегменты сливаются в сегменты побольше, те между собой в еще большие, и т.д. Как это выглядит примерно можно посмотреть тут. Суть в том, старые копии обновленных записей удаляются только при слитии сегментов, в которых эти записи были в момент удаления. То есть, обновленные свежие записи в свежих сегментах места много не занимают. Но если запись старая, она скорее всего слилась в старый большой сегмент. Эти сегменты сливаются редко, так что копии старых записей, могут оставаться достаточно долго.
Вот тут коллега достаточно подробно описал segment merging.
У меня правда кое-какие вопросы всё равно остались - придётся код читать.
А при обновлении связь с дочерними документами не теряется ведь? Они тоже копируются в новый сегмент?
Если вы спрашиваете про 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.