Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Рады представить наш новый Open Source-проект — elasticsearch-extractor. Это простой веб-интерфейс, решающий единственную задачу: извлечение заданного индекса из снапшота Elasticsearch. Почему такой проект вообще появился?
Представьте, что у вас есть большое количество однотипных инсталляций Elasticsearch в Kubernetes, где хранятся и анализируются многочисленные логи от приложений и инфраструктуры. Схема довольно обычная:
Для анализа различных инцидентов может часто возникать ситуация, когда необходимо доставать логи из снапшотов. Как это делать? В первую очередь приходит идея использовать веб-утилиту Cerebro. Она предоставляет широкие возможности по мониторингу кластера Elasticsearch и управлению его состоянием, включая работу с репозиториями снапшотов.
Однако, к сожалению, доступ ко всем функциям Cerebro избыточен и даже потенциально опасен. Для простой операции «извлечь такой-то индекс за такое-то число» не нужна возможность удалить репозиторий, снапшот или произвольный набор индексов. А разделение пользовательских прав в этом приложении не предусмотрено.
Так у нас и возникла потребность в простом инструменте, позволяющем решать одну задачу: извлечение нужного индекса в Elasticsearch. Им стал elasticsearch-extractor.
Код elasticsearch-extractor написан на Go. Функционально утилита представляет собой:
Интерфейс максимально упрощен и исключает возможность ошибочных/опасных действий со стороны пользователя.
Список снапшотов, доступных в хранилище для извлечения
Используемые в интерфейсе блоки:
Для восстановления нужного индекса необходимо нажать на кнопку восстановления:
После этого появится модальное окно со списком индексов, которые находятся в выбранном снапшоте:
После нажатия на Restore в список Restored Indices добавится индекс с названием
Когда индекс полностью восстановится, появится возможность удалить его:
Либо он будет удален автоматически (задачей в curator) через 48 часов.
Важной особенностью является функция расчета необходимого места на узлах кластера Elasticsearch перед восстановлением индекса из снапшота. При нехватке свободного места (для размещения индекса) в восстановлении будет отказано. Это позволяет избежать проблем, когда индекс восстанавливается частично, занимает место и появляются UNASSIGNED-шарды.
Так как мы предполагаем, что все кластеры запущены в Kubernetes, при разработке утилиты была сознательно пропущена реализация каких-либо механизмов контроля доступа /и авторизации:
Утилиту elasticsearch-extractor можно установить в систему (Linux с systemd) или запускать в Docker-контейнере. Инструкции описаны в README проекта.
Исходный код проекта распространяется на условиях свободной лицензии (Apache License 2.0). Будем рады улучшениям — равно как проблемам, обсуждениям и, конечно, звёздам!
Читайте также в нашем блоге:
Зачем
Представьте, что у вас есть большое количество однотипных инсталляций Elasticsearch в Kubernetes, где хранятся и анализируются многочисленные логи от приложений и инфраструктуры. Схема довольно обычная:
- Эти логи ежедневно архивируются в снапшоты, которые хранятся в S3-репозитории. (Строго говоря, выбор S3 — дело вкуса: снапшоты могут храниться и в других репозиториях, зарегистрированных в Elasticsearch.)
- Для экономии места настроен механизм очистки логов — в среднем они живут по 14 дней.
- Снапшоты же могут храниться в S3 до 90 дней.
Для анализа различных инцидентов может часто возникать ситуация, когда необходимо доставать логи из снапшотов. Как это делать? В первую очередь приходит идея использовать веб-утилиту Cerebro. Она предоставляет широкие возможности по мониторингу кластера Elasticsearch и управлению его состоянием, включая работу с репозиториями снапшотов.
Однако, к сожалению, доступ ко всем функциям Cerebro избыточен и даже потенциально опасен. Для простой операции «извлечь такой-то индекс за такое-то число» не нужна возможность удалить репозиторий, снапшот или произвольный набор индексов. А разделение пользовательских прав в этом приложении не предусмотрено.
Так у нас и возникла потребность в простом инструменте, позволяющем решать одну задачу: извлечение нужного индекса в Elasticsearch. Им стал elasticsearch-extractor.
Возможности и интерфейс
Код elasticsearch-extractor написан на Go. Функционально утилита представляет собой:
- пользовательский веб-интерфейс;
- сервер, проксирующий запросы к Elasticsearch.
Интерфейс максимально упрощен и исключает возможность ошибочных/опасных действий со стороны пользователя.
Список снапшотов, доступных в хранилище для извлечения
Используемые в интерфейсе блоки:
- Repositories — список хранилищ, доступных в кластере;
- Results — информационные сообщения;
- Nodes — узлы кластера Elasticsearch и их состояние;
- Restored Indices — восстановленные индексы и их состояние.
Для восстановления нужного индекса необходимо нажать на кнопку восстановления:
После этого появится модальное окно со списком индексов, которые находятся в выбранном снапшоте:
После нажатия на Restore в список Restored Indices добавится индекс с названием
extracted_ORIGNALNAME-DD-MM-YYYY
.Когда индекс полностью восстановится, появится возможность удалить его:
Либо он будет удален автоматически (задачей в curator) через 48 часов.
Важной особенностью является функция расчета необходимого места на узлах кластера Elasticsearch перед восстановлением индекса из снапшота. При нехватке свободного места (для размещения индекса) в восстановлении будет отказано. Это позволяет избежать проблем, когда индекс восстанавливается частично, занимает место и появляются UNASSIGNED-шарды.
Так как мы предполагаем, что все кластеры запущены в Kubernetes, при разработке утилиты была сознательно пропущена реализация каких-либо механизмов контроля доступа /и авторизации:
- В K8s эта задача возложена на Ingress-контроллер, предоставляющий доступ к этому сервису.
- Вне K8s можно использовать привычные родные механизмы nginx, Apache и подобных решений.
Попробовать
Утилиту elasticsearch-extractor можно установить в систему (Linux с systemd) или запускать в Docker-контейнере. Инструкции описаны в README проекта.
Исходный код проекта распространяется на условиях свободной лицензии (Apache License 2.0). Будем рады улучшениям — равно как проблемам, обсуждениям и, конечно, звёздам!
P.S.
Читайте также в нашем блоге:
- «Как мы Elasticsearch в порядок приводили: разделение данных, очистка, бэкапы»;
- «Логи в Kubernetes (и не только) сегодня: ожидания и реальность».