Резервное копирование и восстановление Graylog-сервера

в 18:01, , рубрики: automation, backup, bash scripting, chef, linux, monitoring, restore, Блог компании EPAM Systems, системное администрирование, метки: , , , , , ,

Приветствую, читатели!Резервное копирование и восстановление Graylog сервера
Дело было вечером, делать было нечего, и тут я вспомнил — я же хотел поделится с сообществом своим недавним боевым опытом.
Было у меня задание — автоматизировать процедуру резервного копирования и создать процедуру восстановления Graylog-сервера.

Сервер был для меня неизвестным, ранее сталкиваться не приходилось.
Ну что ж, посидел-почитал, да подумал — ничего сложного. Однако поиски в Google показали, что не каждый день такая задача появляется, ибо информации практически не было.
«Где наша не пропадала?» — подумал я, все должно быть предельно просто, скопируем конфигурационные файлы и вуаля.
Сделаю небольшое лирическое отступление, дабы описать Graylog-сервер и его составляющие.

Что такое Graylog-сервер?

Graylog2 — это open-source система для сбора и анализа статистики, позволяющий обрабатывать данные достаточно гибко. В качестве агента — он использует syslog. Данные посылаются с узлов посредством syslog и агрегируются Graylog-сервером.
В качестве базы данных для хранения контента и настроек — используется MongoDB.
Ну и самая громоздкая часть сервера — это ElasticSearch, мощный инструмент для индексирования данных и поиска по ним.

Процесс резервного копирования

Задание начинало приобретать очертания. Необходимо было копировать содержимое MongoDB и индексы ElasticSearch, а также конфигурационные файлы каждой из частей Graylog.
Остановив предварительно сервис graylog-server и elasticsearch, я приступил к резервному копированию.

/etc/init.d/graylog-server stop
/etc/init.d/elasticsearch stop
/etc/init.d/chef-client stop

В моем случае, в MongoDB у нас находилась база под названием graylog2. Дабы получить копию оной, я создал dump базы следующей командой:

logger -s -i "Dumping MongoDB"
mkdir -p path-to-backup
mongodump -h 127.0.0.1 -d graylog2 -o path-to-backup/

Таким образом, в директории path-to-backup cоздается dump базы данных «graylog2», находящейся на localhost (можно указывать также удаленный узел).

Следующий шаг — резервное копирование и сжатие индексов ElasticSearch. В нашем случае, за 7 месяцев работы, собралось около 12 Гбайт индексов. По умолчанию, не было настроено их сжатие, что могло бы уменьшить затраты места под хранение в разы.
Директория, хранящая индексы, в нашем случае находилась на примонтированном разделе. За указание на место хранения индексов отвечает параметр path.data в /etc/elasticsearch/elasticsearch.yml. Также, немаловажным параметром (без него не заработает, никак) — является имя кластера, заданное в том же конфигурационном файле параметром cluster.name.
Для резервного копирования индексов я использовал следующую команду, которая сжимала и упаковывала содержимое директории с индексами:

logger -s -i "Dumping MongoDB"
tar -zcf path-to-backup/elasticsearch.tar.gz --directory=path-to-indices graylog2

В результате, из 12 Гбайт исходной информации получился архив в 1.8 Гбайта. Что ж, уже неплохо…

Далее, оставалось скопировать конфигурационные файлы Graylog, MongoDB и ElasticSearch. Стоит отметить, что в конфигурационном файле ElasticSeach — elasticsearch.yml — содержался также параметр node.name, представляющий собой hostname нашего сервера. Это важно в том случае, если восстановление Graylog-сервера будет происходить на узле с другим hostname. Точно также содержимое конфигурационного файла Graylog — graylog2.conf — содержало настройки под нашу конкретную базу MongoDB, с используемым в ней для доступа пользователем и паролем.
Упоминаю я это все к тому, что бездумное копирование файлов конфигурации к добру не приведет, и это «не наши методы, Шурик» (с)

После того, как все конфигурационные файлы были упакованы и скопированы — осталось передать данные файлы на сервер резервного копирования. Тут, на самом деле, каждый волен делать как хочет и как того требует инфраструктура.

В моем случае копирование осуществлялось при помощи scp с использованием ключа для аутентификации:

logger -s -i "Copying backups to Backup server"
scp -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -r -i /root/.ssh/id_rsa path-to-backup backup-user@backup-server: 

logger -s -i «Copying backups to Backup server: DONE»

Подытоживая процесс резервного копирования, я бы хотел выделить шаги, которые необходимо предпринять:

  • Остановка сервисов Graylog и ElasticSearch
  • Создание dump-а (копии) MongoDB базы данных
  • Копирование и архивирование директории индексов ElasticSearch
  • Копирование конфигурационных файлов

Процесс восстановления Graylog-сервера

Неудивительно, что процесс восстановления — зеркальное отображение процесса резервного копирования.
Ниже я приведу небольшой bash-скрипт, который восстанавливает Graylog-сервер:

/etc/init.d/graylog-server stop
/etc/init.d/elasticsearch stop
scp -r user@backup-server/graylog-backup/* ./
tar zxf graylog2-mongodump.tar.gz
tar zxf elasticsearch.tar.gz
mongorestore -d graylog2 ./graylog2
mv ./elasticsearch/* /opt/elasticsearch/data/
mv ./graylog2.conf /etc/
mv ./elasticsearch.yaml /etc/elasticsearch/elasticsearch.yml

/etc/init.d/graylog-server start
/etc/init.d/elasticsearch start

Скрипт копирует архивы с backup-server, распаковывает их, потом восстанавливается база graylog2 в MongoDB и перемещаются индексы ElasticSearch в директорию по-умолчанию. Также копируются конфигурационные файлы ElasticSearch и Graylog-сервера. После этого запускаются сервис ElasticSearch и Graylog-server.

Для того, чтобы удостовериться в целостности восстановления можно поступить следующим образом:

  • зайти на web-интерфейс сервера и удостоверится, что все Messages, Hosts, Streams и параметры присутствуют в идентичном состоянии
  • сравнить результат curl-запроса curl -XGET " localhost:9200/graylog2_0/_mapping

Процесс простой, проверенный на нескольких экземплярах. Однако мало-документированный. Стоит также отметить, что с релизом ElasticSearch v.1 — он упрощается введением процедуры получения «слепков» индексов, но сути это не меняет.
Надеюсь, что кому-то данная статья поможет. Спасибо за внимание.

P.S. Отдельное спасибо моему коллеге Siah, который сделал этот скрипт красивым и поддающимся автоматизации. Ну а я — ленивый топикстартер :)

Автор: MistiC

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js