Один из наших клиентов столкнулся с необычной проблемой: поисковая система ElasticSearch «из коробки» не умеет мигрировать индексы незаметно для пользователей. Приходилось каждый раз отключать поиск на несколько часов. Мы сделали систему доступной в режиме 24/7, снизили количество человеческих ошибок, повысили скорость выполнения работ при миграции и удешевили обслуживание.
Справочная информация
Elasticsearch — поисковый движок с поддержкой полнотекстового поиска, созданный на основе библиотеки Lucene. Благодаря развитой экосистеме и простоте интеграции в инфраструктуру, Elasticsearch занимает лидирующее положение на рынке. Систему используют Microsoft, eBay, Amazon, GitHub, Netflix и многие другие.
Индексация/Реиндексация — процесс добавления сведений о документах и файлах в базу данных поисковой системы, чтобы в дальнейшем можно было осуществлять полнотекстовый поиск по индексированной актуальной информации.
Основные проблемы
Крупная компания, которая использует Elasticsearch в своей инфраструктуре, столкнулась с рядом проблем. С ростом объёма информации в корпоративных сервисах, на работы по миграции схем, где главным фактором является правильная и быстрая реиндексация данных, стало уходить слишком много времени и денег.
Проблема 1
На реиндексацию данных уходит несколько часов. В процессе поиск становится недоступен сотрудникам компании. |
Негативный эффект
Пользователи не могут получить доступ к поисковой системе. Растёт их недовольство работой внутренних сервисов компании. |
Проблема 2
С ростом компании многократно выросли расходы на техническую поддержку поисковой системы. |
Негативный эффект
DevOps-инженеры тратят всё больше времени на исправление ошибок при реиндексации и миграции данных. |
Обе проблемы связаны с особенностями системы Elasticsearch. В ней отсутствуют инструменты для контроля миграций и проверки данных, а реиндексация нуждается в дополнительной тонкой настройке. Всё это негативно отражается на работе поисковой системы, соответственно — вредит и пользователям, и бизнесу.
Решение проблемы контроля миграций
Развитие сервисов компании приводит к изменению схемы в реляционной базе данных, которые важно оперативно переносить в поисковую систему. Нужен инструмент для миграции изменений, отслеживания версий и мониторинга процессов. Проблема в том, что такого встроенного инструмента в Elasticsearch нет.
Мы создали утилиту с рабочим названием MigrationTool, который включает гибкие настройки, поддержку скриптов и профилей, а также возможность расширения функциональности в будущем. После запуска инструмент проверяет последнюю версию изменений в Elasticsearch и, в случае наличия более новых версий, начинает процесс миграции.
Решение гарантирует, что все версии индекса автоматически будут перенесены в поисковую систему по очереди, а применённые ранее — были пропущены. Всё происходит без привлечения инженеров, которые тратят на это больше времени и периодически допускают ошибки.
Было
С ростом компании выросли расходы на поддержку поисковой системы. DevOps-команда отвлекалась от важных проектов для контроля миграций Elasticsearch. В процессе часто допускались ошибки, исправление которых требовало дополнительных ресурсов. |
Стало
Утилита MigrationTool отслеживает версии и самостоятельно осуществляет миграции. Снизилась стоимость поддержки системы и количество допускаемых ошибок. Инженеры больше не отвлекаются от важных проектов. |
Решение проблемы реиндексации данных
Сломать поиск или уничтожить поисковую информацию могут изменения мастер-данных в реляционной базе данных, изменения в структуре индекса или его статических настройках.
Решить проблему можно с помощью версионирования дополнительных полей индекса. Ещё один вариант избежать потерь данных — создание новых версий индексов с изменённой структурой. Мы разработали утилиту с рабочим названием ReindexTool, который минимизирует количество ошибок и автоматически обновляет поисковый сервис с учётом выбранных критериев и режимов.
Инструмент позволяет производить реиндексацию без отключения системы поиска. Например, нужно мигрировать индекс версии 1.0 на версию 2.0. Пользователи считывают информацию из старого индекса, при этом в фоне создаётся индекс версии 2.0, куда записываются изменения. После завершения миграции, мы переключаем чтение с версии 1.0 на 2.0. Поиск при этом не отключается ни на секунду.
Было
Реиндексация часто приводила к возникновению ошибок, которые ломали систему и удаляли важные данные из индекса. Во время реиндексации поиск информации становился частично недоступен пользователям. |
Стало
Утилита ReindexTool автоматизировала процессы и свёл количество ошибок к минимуму. Поиск доступен в режиме 24/7, так как реиндексация теперь осуществляется в фоновом режиме. |
Оптимизация реиндексации
С ростом количества документов до 30–50 миллионов реиндексация стала отнимать до 5 часов. Мы добавили в утилиту ReindexTool ряд настроек, которые позволяют снизить нагрузку на поисковый движок и ускорить процесс:
- Количество реплик индекса до и после реиндексации.
- Интервал, с которым обновленное содержимое индекса становится доступным для поиска.
- Возможность запуска параллельных процессов извлечения информации из базы данных.
- Пакетирование данных и их групповая отправка на индексацию.
- Возможность индексации данных за выбранный период времени и прочие фильтры, по которым необходимо сделать переиндексацию.
Было
Настройки Elasticsearch «по умолчанию» замедляли процесс реиндексации. В какой-то момент он стал занимать до 5 часов. |
Стало
Оптимизация настроек Elasticsearch позволила сократить время реиндексации в среднем до 60 минут. |
Выводы и метрики
Когда бизнес активно развивается, поисковая система может перестать справляться с быстро растущим массивом данных. Это приводит к увеличению времени реиндексации, возникновению ошибок, росту расходов на поддержку системы и недовольству пользователей.
При правильном подходе и наличии опыта работы с поисковыми системами можно сделать Elasticsearch эффективнее. C помощью всего двух утилит и тонкой настройки специалисты Sibedge:
- Сократили время, необходимое на реиндексацию в пять раз.
- Автоматизировали миграции и разгрузили DevOps-инженеров.
- Обеспечили доступность поиска для пользователей в режиме 24/7.
- Минимизировали количество ошибок в работе поискового движка.
- Снизили расходы на техническую поддержку Elasticsearch.
Полученный опыт применим к компаниям любого размера. Вне зависимости от сложности инфраструктуры и объёма документной базы, любую поисковую систему можно сделать более быстрой, автономной и стабильной. Мы рады делиться с вами нашей экспертизой. Надеемся, что этот материал будет вам полезен. В будущем мы обязательно продолжим публиковать подобные истории из практики Sibedge.
Таблица улучшения метрик
* При использовании стратегии с двумя индексами, но в полностью ручном режиме.
** 1 час работы DevOps-инженера = $16.