Настройка кластера Serf на серверах Ubuntu

Serf – это отказоустойчивый децентрализованный инструмент для обнаружения и оркестровки сервисов. Serf позволяет вызвать любое событие в кластере систем и настроить мониторинг. Этот инструмент основан на протоколе децентрализованной коммуникации Gossip. Чтобы подключиться к кластеру Serf, ноду необходимо заранее знать адрес одного из нодов кластера. После подключения к кластеру новый нод получает все необходимые для работы данные. Благодаря протоколу Gossip кластер Serf очень прост в настройке.

Кратко о нодах кластера

Serf предназначен для кластеризации нескольких VPS и совместим с системами Mac OS, windows, nix. Данное руководство поможет настроить кластер Serf из двух серверов Ubuntu.

Эти серверы будут условно называться SerfNode1 и SerfNode2. Для настройки кластера нужны IP-адреса этих серверов. В данном руководстве используются условные адреса:

  • SerfNode1 – 1.1.1.1
  • SerfNode2 – 2.2.2.2

Установка Serf

Примечание: Этот раздел нужно выполнить на всех серверах кластера, в данном случае – на SerfNode1 и SerfNode2.

Загрузите пакеты Serf:

wget https://dl.bintray.com/mitchellh/serf/0.3.0_linux_amd64.zip

Установите инструмент unzip, если он не был установлен ранее:

apt-get install unzip

Распакуйте полученный архив Serf:

unzip 0.3.0_linux_amd64.zip

Добавьте Serf в каталог bin:

mv serf /usr/local/bin

Создание кластера

Запустите первый нод кластера Serf на сервере SerfNode1.

serf agent -node=**SerfNode1** -bind=1.1.1.1:7496

На экране появится следующий результат:

==> Starting Serf agent...
==> Starting Serf agent RPC...
==> Serf agent running!
Node name: '**SerfNode1**'
Bind addr: '1.1.1.1:7496'
RPC addr: '127.0.0.1:7373'
Encrypted: false
Snapshot: false
Profile: lan
==> Log data will now stream in as it occurs:
2014/01/18 21:57:57 [INFO] Serf agent starting
2014/01/18 21:57:57 [WARN] Binding to public address without encryption!
2014/01/18 21:57:57 [INFO] serf: EventMemberJoin: **SerfNode1** 1.1.1.1
2014/01/18 21:57:58 [INFO] agent: Received event: member-join

Примечание: Параметр Node name задаёт имя нода, а Bind – IP-адрес и порт, к которым нужно подключиться.

Перейдите на сервер SerfNode2 и запустите Serf agent в фоновом режиме.

serf agent -node=**SerfNode2** -bind=2.2.2.2:7497 -rpc-addr=127.0.0.1:7373 &

Примечание: Амперсанд (&) запускает команду в фоновом режиме.

Подключите SerfNode2 к SerfNode1:

serf join 1.1.1.1:7496

На экране появится вывод:

...
2014/01/18 22:03:04 [INFO] serf: EventMemberJoin: **SerfNode2** 2.2.2.2
2014/01/18 22:03:05 [INFO] agent: Received event: member-join1922
...

Кластер Serf готов. Чтобы добавить в кластер дополнительные ноды, просто повторите инструкции, предназначенные для SerfNode2. Чтобы подключиться к кластеру Serf, нужно подключить серверы к  запущенным агентам Serf. Протокол Gossip автоматически уведомляет всех агентов Serf о появлении нового VPS в кластере.

События и управление событиями

Serf позволяет управлять событиями в кластере. Для примера попробуйте отправить событие.

Отправка простого пользовательского события

Выполните следующую команду на сервере SerfNode2:

serf event hello

На сервере SerfNode1 появится:

2014/01/16 15:48:05 [INFO] agent: Received event: user-event: hello

Как видите, всё работает очень просто. Теперь попробуйте настроить пользовательский обработчик событий.

Создание обработчика событий

Serf может вызывать пользовательские события в кластере, чтобы инициировать такие задачи, как развертывание, обновление безопасности конфигурации системы и т.д. Любое событие на машине Linux, которое можно добавить в скрипт, может быть вызвано при помощи Serf.

Рассмотрим простой пример.

На сервере SerfNode1 остановите Serf agent (клавиши Ctrl + C). Вывод выглядит так:

2014/01/16 15:58:54 [INFO] agent: requesting serf shutdown
2014/01/16 15:58:54 [WARN] Shutdown without a Leave
2014/01/16 15:58:54 [INFO] agent: shutdown complete

Теперь создайте пользовательский сценарий событий, который будет записывать фразу «written to file» в текстовый файл в каталоге /usr/src. Скрипт будет запускаться, когда пользователь отправляет событие «write».

Для начала нужно создать обработчик событий. Это может быть исполняемый файл; в данном случае используется файл bash.

Откройте каталог /usr/src:

cd /usr/src

Откройте текстовый редактор nano:

nano handler.sh

Используйте для обработчика событий такой код:

#!/bin/bash
if [ "${SERF_USER_EVENT}" = "write" ]; then
echo "written to file" >> test.txt
fi
echo "${SERF_USER_EVENT}"

Примечание: Параметр ${SERF_USER_EVENT} задаёт имя отправляемого события. Обратите внимание на оператор if, который позволяет задавать различные события.

Чтобы закрыть nano и сохранить файл, нажмите Ctrl + X, Y и Enter.

Сделайте файл исполняемым:

chmod +x handler.sh

Перезапустите Serf agent при помощи нового обработчика событий:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode1** -bind=1.1.1.1:7496

Дополнительные рекомендации

Каждый отдельный Serf agent может использовать индивидуального обработчика событий. Чтобы добавить пользовательский обработчик событий для сервера SerfNode2, просто повторите инструкции предыдущего раздела на этом сервере. Можно даже просто скопировать готовый скрипт обработки событий на сервер SerfNode2 в каталог /usr/src. Выполните следующие команды:

  • На сервере SerfNode2 выйдите из кластера Serf:

serf leave

  • Перейдите в каталог /usr/src:

cd /usr/src

  • Запустите Serf agent в фоновом режиме при помощи пользовательского обработчика событий:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

Тестирование обработчика событий

Снова подключите SerfNode2 к SerfNode1.

serf join 1.1.1.1:7496

Запустите команду:

serf event write

На сервере SerfNode1 перейдите в каталог /usr/src:

cd /usr/src

В каталоге должен быть файл test.txt. Этот файл был создан во время запуска события Serf на сервере SerfNode2.

Настройка мониторинга свободной памяти

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

На сервере SerfNode1 нажмите Ctrl+C, чтобы покинуть кластер Serf.

Затем откройте каталог /usr/src:

cd /usr/src

Откройте скрипт handler.sh:

nano handler.sh

Замените код скрипта следующим кодом:

#!/bin/bash
if [ "${SERF_USER_EVENT}" = "mem" ]; then
serf event memresponse "$(awk '/MemTotal/ {printf( "%.2f\n", $2 / 1024 ) }'              /proc/meminfo) MB from $(wget -qO- http://ipecho.net/plain ; echo) at $(date)"
fi

Чтобы закрыть nano и сохранить файл, нажмите Ctrl + X, Y и Enter.

Этот скрипт будет запускать событие Serf, которое будет возвращать объём свободной памяти на виртуальном сервере в таком формате:

490 MB from 1.1.1.1 at Sun Jan 19 00:37:22 EST 2014

На сервере SerfNode2 закройте кластер Serf:

serf leave

Откройте каталог /usr/src:

cd /usr/src

Создайте скрипт обработчика:

nano handler.sh

Вставьте в файл следующий код:

#!/bin/bash
if [ "${SERF_USER_EVENT}" = "memresponse" ]; then
cat >> mem.txt
echo "\n" >> mem.txt
fi

Чтобы закрыть nano и сохранить файл, нажмите Ctrl + X, Y и Enter.

Сделайте скрипт исполняемым.

chmod +x handler.sh

Запустите агент на сервере SerfNode1:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode1** -bind=1.1.1.1:7496

Запустите агент на сервере SerfNode2:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

Снова подключите сервер SerfNode2 к SerfNode1:

serf join 1.1.1.1:7496

Запустите событие mem:

serf event mem

Затем проверьте файл mem.txt:

nano mem.txt

Теперь на сервере есть инструмент для мониторинга свободной памяти, который можно распространить между другими виртуальными серверами.

Переменные событий Serf

Ниже приведён список переменных, которые могут пригодиться во время написания скрипта обработчика событий.

Примечание: Также о переменных можно прочитать на сайте Serf.

  • SERF_EVENT: определяет тип события (member-join, member-leave, member-failed или user).
  • SERF_SELF_NAME: задаёт имя нода, который использует обработчик событий.
  • SERF_SELF_ROLE: роль нода, использующего обработчик событий.
  • SERF_USER_EVENT: определяет имя пользовательского события, если тип события в SERF_EVENT – user.
  • SERF_USER_LTIME: логические часы пользовательского события, если SERF_EVENT – user.

После запуска события используется следующий шаблон команды:

serf event [SERF_EVENT_NAME] [PAYLOAD]

Примечание: PAYLOAD – полезная нагрузка, интерпретируется скриптом как стандартный ввод.

При запуске пользовательского события нужно использовать переменную SERF_USER_EVENT вместо SERF_EVENT.

Заключение

Serf – простой и быстрый способ создания событий в кластере машин. Кроме того, инструмент Serf легковесный и устойчивый к ошибкам. Serf можно использовать для настройки системы, развертывания, обновления безопасности, транслирования сообщений и мониторинга серверов. Благодаря гибкости настроек Serf можно адаптировать для решения широкого круга задач.

Более подробную информацию об этом инструменте можно найти на официальном сайте.

Tags: ,

Добавить комментарий