Как установить и настроить NATS в Ubuntu 16.04

Вступление

NATS - это высокопроизводительная система обмена сообщениями с открытым исходным кодом, которую часто называют «центральной нервной системой для облака». Он способен маршрутизировать миллионы сообщений в секунду, что делает его идеальным для подключения микросервисов и устройств IoT (Internet of Things).

NATS - это система обмена сообщениями Pub Sub. В такой системе один или несколько publishers отправляют сообщения с определенной темой message broker, а брокер сообщений доставляет эти сообщения любым клиентам или subscribeers данной темы. Издатели не знают или даже не заботятся о подписчиках, и наоборот. Эта архитектура позволяет легко масштабировать систему и добавлять новые возможности, поскольку мы можем добавлять издателей и подписчиков, не влияя на остальную часть системы. Этот тип системы идеально подходит для мониторинга серверов и устройств; устройства могут отправлять сообщения, и мы можем подписаться на эти сообщения для отправки уведомлений по электронной почте или другими способами.

В этом уроке мы установим официальный сервис NAT + + gnatsd + и сделаем его доступным безопасным способом. Мы также создадим базовую систему предупреждения о перегрузке сервера, которая отправляет электронные письма, когда нагрузка на сервер становится слишком высокой, используя + gnatsd + в качестве посредника сообщений.

Предпосылки

Для завершения этого урока вам понадобится:

  • Новый сервер Ubuntu 16.04.

  • Стандартная учетная запись пользователя с привилегиями + sudo +. Вы можете настроить стандартную учетную запись, следуя Initial Server Setup с Ubuntu 16.04.

Шаг 1 - Загрузка сервера NATS

Начнем с загрузки сервера + gnatsd + и проверки его работоспособности в нашей системе без каких-либо проблем.

Последний стабильный выпуск + gnatsd + - версия 0.9.4 на момент написания этого руководства. Вы можете проверить the страницу загрузки NATS для более поздней версии и адаптировать команды ниже по мере необходимости, если вы хотите использовать более новую версию.

Сначала войдите на свой сервер с учетной записью без полномочий root:

ssh @

Затем убедитесь, что вы находитесь в домашнем каталоге вашего пользователя:

cd

Затем используйте + wget + для загрузки + gnatsd + на ваш сервер:

wget https://github.com/nats-io/gnatsd/releases/download/v/gnatsd-v-linux-amd64.zip

Архив, который вы только что скачали, является сжатым архивом, поэтому вам нужно установить + unzip + для распаковки файлов. Вы можете установить его с помощью + apt +:

sudo apt-get install -y unzip

Затем используйте + unzip + для извлечения + gnatsd +:

unzip -p gnatsd-v-linux-amd64.zip gnatsd-v-linux-amd64/gnatsd > gnatsd

Затем сделайте + gnatsd + исполняемым, чтобы вы могли запустить его:

chmod +x gnatsd

Давайте проверим, что мы можем запустить + gnatsd +, запустив его из текущего каталога. Используйте следующую команду для запуска + gnatsd +:

./gnatsd --addr 127.0.0.1 --port 4222

Вывод, который вы видите, будет похож на этот пример:

Output[1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4
[1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on
[1851] 2016/09/23 05:20:02.248626 [INF] Server is ready

По умолчанию + gnatsd + прослушивает порт + 4222 + по адресу + 0.0.0.0 +, который соответствует всем интерфейсам. Используя аргумент + - port +, вы можете изменить порт, а с помощью + - addr + вы можете изменить адрес, который он прослушивает. Мы запустили + gnatsd + с + - addr 127.0.0.1 +, чтобы он был доступен только на нашем сервере и не мог быть доступен для внешних клиентов. Позже в этом уроке мы защитим + gnatsd + и откроем его для всего мира.

Нажмите + CTRL + C +, чтобы выключить + gnatsd +.

Теперь, когда вы знаете, что все работает, давайте настроим это более формально.

Шаг 2 - Создание структуры каталогов и файла конфигурации

В Linux стороннее программное обеспечение, связанное со службами, часто хранится в каталоге + / srv +. Мы собираемся следовать этому соглашению и хранить файлы, связанные с NATS, в + / srv / nats +. Мы поместим исполняемый файл + gnatsd + в + / srv / nats / bin +.

Сначала создайте папку + / srv / nats / bin +:

sudo mkdir -p /srv/nats/bin

Затем переместите + gnatsd + в папку + / srv / nats / bin +:

sudo mv ~/gnatsd /srv/nats/bin

Сервер может загрузить свою конфигурацию из файла, что пригодится, когда нам понадобится изменить настройки сервера позже в руководстве. Создайте файл + / srv / nats / gnatsd.config +:

sudo nano /srv/nats/gnatsd.config

И добавьте следующее содержимое в файл:

/srv/nats/gnatsd.config

port: 4222
net: '127.0.0.1'

Этот файл конфигурации говорит серверу + gnatsd + прослушивать порт + 4222 + по адресу + 127.0.0.1 +, как и раньше, но на этот раз нам не нужно указывать эти параметры в командной строке.

Давайте снова запустим сервер, чтобы убедиться, что мы все настроили правильно. Выполните следующую команду для запуска + gnatsd + с использованием нового файла конфигурации:

/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config

Вывод похож на то, что вы видели раньше:

Output[1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4
[1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on
[1869] 2016/06/18 05:30:55.989562 [INF] Server is ready

Еще раз нажмите + CTRL + C +, чтобы выключить + gnatsd + и вернуться к вашему приглашению. Теперь давайте создадим пользователя, который будет запускать этот сервис.

Шаг 3 - Создание пользователя сервиса

Хорошей практикой безопасности является запуск каждой службы со своей учетной записью пользователя, чтобы ограничить ущерб в случае взлома службы. Давайте создадим пользователя и группу, которые будут владеть службой NATS и файлами, связанными с NATS.

Во-первых, давайте создадим системного пользователя и группу с именем ++:

sudo adduser --system --group --no-create-home --shell /bin/false nats
OutputAdding system user `nats' (UID 106) ...
Adding new group `nats' (GID 114) ...
Adding new user `nats' (UID 106) with group `nats' ...
Not creating home directory `/home/nats'.

Мы присвоили оболочку + / bin / false + системному пользователю + nats +, чтобы отключить вход в систему для этого пользователя и подавить создание домашнего каталога. Мы также создали группу + nats +.

Давайте изменим владельца каталога + / srv + на пользователя и группу + nats +:

sudo chown -R nats:nats /srv

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

Шаг 4 - Запуск gnatsd как службы

Мы бы хотели, чтобы + gnatsd + запускался при загрузке системы и перезапускался в случае сбоя. Мы будем использовать systemd, чтобы справиться с этим.

systemd - менеджер сервисов для систем Linux. Он отвечает за запуск служб при загрузке, перезапуск их по мере необходимости и остановку их контролируемым образом при завершении работы системы.

Нам нужно создать конфигурацию службы, чтобы определить, как и когда должна быть запущена служба NATS. Созданные пользователем сервисные файлы находятся в + / etc / systemd / system +, поэтому создайте файл + / etc / systemd / system / nats.service +:

sudo nano /etc/systemd/system/nats.service

А в файле поместите этот скрипт, чтобы определить, как + gnatsd + должен запускаться:

/etc/systemd/system/nats.service

[Unit]
Description=NATS messaging server

[Service]
ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
User=nats
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • Раздел + [Unit] + содержит общую информацию об услуге, такую ​​как + Description +, которая описывает службу.

  • Раздел + [Service] + содержит конфигурацию, связанную с сервисом. + ExecStart + - команда для запуска сервера. Здесь мы используем абсолютный путь к исполняемому файлу + gnatsd +. + Restart = on-fail означает, что служба должна быть перезапущена, если она выходит из строя или завершается с ошибкой. Он не будет перезапущен, если он был остановлен systemd.

  • Раздел + [Install] + содержит информацию об установке службы. + WantedBy = multi-user.target указывает systemd запустить службу при запуске` + multi-user.target`. Это общий способ запуска служб при загрузке системы.

Как только описание службы будет готово, мы можем запустить его с помощью следующей команды:

sudo systemctl start

Давайте подтвердим, что + gnatsd + работает, отправив сообщение + PING +:

printf "PING\r\n" | nc 127.0.0.1 4222

Мы только что использовали + nc + для связи с + gnatsd +. + nc + - утилита командной строки для связи с серверами TCP или UDP. Команда, которую мы использовали, печатает вывод, подобный следующему:

OutputINFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576}

Ответ + PONG + позволяет нам узнать, что сервер прослушивает и работает, как ожидалось. Нам нужно выполнить одну последнюю команду, чтобы наш сервер NATS запустился при загрузке:

sudo systemctl enable

Вы увидите следующий вывод, который подтверждает, что служба была установлена:

OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.

Мы успешно настроили + gnatsd + для запуска в качестве службы. Теперь давайте защитим его и сделаем доступным для внешних клиентов.

Шаг 5 - Защита подключений к службе NATS

Если бы все издатели и подписчики, которых мы хотели бы использовать с + gnatsd +, работали на одном и том же сервере, мы могли бы назвать это выполненным и двигаться дальше, но это редко случается в наши дни. Нам нужно разрешить внешним клиентам подключаться и публиковать сообщения в + gnatsd + безопасным способом.

+ gnatsd + поддерживает транспорт TLS, поэтому мы будем использовать его для защиты связи между + gnatsd + и клиентами NATS.

Во-первых, нам нужен сертификат. Вы можете купить коммерческий сертификат, получить его по адресу http://letsencrypt.org [Let’s Encrypt] или создать самозаверяющий сертификат. Мы будем использовать последний подход, поскольку получение сертификата выходит за рамки данной статьи.

Создайте каталог для временного хранения сертификата:

mkdir ~/priv

Затем создайте самозаверяющий сертификат с помощью следующей команды:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
   -keyout priv/gnatsd.key -out priv/gnatsd.crt \
   -subj "/C=US/ST=/L=/O=/CN=www."

Эта команда создает сертификат RSA с 2048 битами и сроком действия 10 лет. Обратите внимание, что мы использовали произвольное доменное имя, так как мы не включим проверку TLS для сервера + gnatsd + в этой статье.

Теперь у вас должны быть файлы + gnatsd.key + и + gnatsd.crt + в каталоге + ~ / priv +. Давайте переместим эти файлы в нашу структуру каталогов + / srv / nats / +, чтобы все было в одном месте. Выполните следующую команду:

sudo mv ~/priv /srv/nats

Теперь сделайте + / srv / nats / priv + доступным только для пользователя и группы + nats +:

sudo chmod 440 /srv/nats/priv/*
sudo chmod 550 /srv/nats/priv
sudo chown -R nats:nats /srv/nats/priv

Теперь мы обновляем + / srv / nats / gnatsd.config +, чтобы содержать сертификат и ключ, который мы только что создали. Снова откройте файл конфигурации:

sudo nano /srv/nats/gnatsd.config

И добавьте следующий раздел, чтобы сказать + gnatsd +, чтобы использовать ваш сертификат и ключ:

/srv/nats/gnatsd.config

. . .

tls {
 cert_file: ""
 key_file: ""
 timeout: 1
}

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

sudo systemctl restart

Давайте проверим, что наши сертификаты работают. Запустите эту команду:

printf "PING\r\n" | nc localhost 4222

На этот раз команда выводит это сообщение:

OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}

Сервер вернул сообщение + -ERR 'Безопасное соединение - требуется TLS' +, которое подтверждает, что новая конфигурация выбрана и требуется безопасное соединение, которое + nc + не знает, как это сделать.

Чтобы иметь возможность общаться с нашим сервисом NATS без установки полноценного клиента NATS, мы будем использовать инструмент под названием catnats. Давайте сначала скачаем это:

wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py

И сделать его исполняемым:

chmod +x catnats.py

Наконец, переместите + catnats.py + в папку + / srv / nats / bin + и переименуйте ее в + catnats +:

sudo mv catnats.py /srv/nats/bin/catnats

Давайте проверим, что мы можем общаться с нашей службой NATS, используя + catnats +, отправив то же самое сообщение + PING +, которое мы отправили ранее:

printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

Вы увидите этот вывод, указывающий, что ваше соединение безопасно:

OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}

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

Шаг 6 - Требование аутентификации

Наша служба NATS не требует аутентификации по умолчанию. Это нормально, когда служба доступна только в частной сети, но мы хотим, чтобы наша служба NATS была доступна в Интернете, поэтому мы должны включить аутентификацию. + gnatsd + поддерживает аутентификацию по имени пользователя и паролю, и ее легко включить.

Откройте файл + / srv / nats / gnatsd.config +:

sudo nano /srv/nats/gnatsd.config

Добавьте новый раздел + authorization +, в котором указаны учетные данные. Мы будем использовать ` в качестве имени пользователя и ` в качестве пароля для этого урока. Вы должны использовать более длинный и сложный пароль в производственной среде:

/srv/nats/gnatsd.config

. . .

authorization {
 user:
 password:
}

Сохраните файл, а затем измените владельца + / srv / nats / gnatsd.config + на + nats + и сделайте его доступным для чтения этим пользователем, чтобы защитить имя пользователя и пароль от других пользователей в системе:

sudo chown nats /srv/nats/gnatsd.config
sudo chmod 400 /srv/nats/gnatsd.config

Затем перезапустите службу, чтобы изменения вступили в силу:

sudo systemctl restart nats

Давайте отправим сообщение + PING на` + gnatsd`, чтобы проверить, все ли в порядке. Еще раз, используйте + catnats + для отправки сообщения:

printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

Вы увидите следующий вывод:

OutputNFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}

Это говорит нам о том, что изменения были успешно применены, и теперь нам нужно отправить правильное имя пользователя и пароль для подключения к службе. Давайте попробуем еще раз, на этот раз предоставив имя пользователя ` и пароль `:

printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user  --pass

На этот раз это сработало, как вы можете видеть из следующего вывода:

OutputINFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}

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

Шаг 7 - Открытие Служения Миру

Мы настроили наш сервер NATS для прослушивания + 127.0.0.1 +, который является локальным интерфейсом. Если мы заставим его слушать + 0.0.0.0 +, то он будет доступен всему миру. Давайте обновим + / srv / nats / gnatsd.config + в последний раз:

sudo nano /srv/nats/gnatsd.config

Затем измените IP-адрес, связанный с настройкой + net +:

/srv/nats/gnatsd.config

. . .
net: ''
. . .

Сохраните файл и перезапустите сервис:

sudo systemctl restart nats

И теперь наша служба NATS готова к подключению внешних клиентов. Чтобы узнать, как его использовать, давайте создадим простую службу мониторинга, которая использует наш сервер NATS в качестве посредника сообщений.

Шаг 8 - (Необязательно) Настройка уведомлений о перегрузке сервера

В этом разделе вы создадите простую систему мониторинга перегрузки, которая использует вашу службу NATS. Система получит среднюю загрузку серверов и отправит электронное письмо администратору, если какой-либо из серверов перегружен.

Пример проекта будет состоять из следующих компонентов:

  • Служба NATS, которую вы только что настроили.

  • Monitor, который публикует имя хоста, среднее значение загрузки и количество процессоров сервера для субъекта + stats.loadaverage + каждые 60 секунд. Вам нужно запустить этот компонент на любом сервере, который вы хотите отслеживать на предмет загрузки.

  • Notifier, который подписывается на тему + stats.loadaverage + и получает имя хоста, среднее значение загрузки и число процессоров сервера. Если средняя загрузка хоста превышает определенный порог, уведомитель отправляет электронное письмо на предварительно определенный адрес через SMTP-сервер.

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

Настройка монитора

Вы можете прочитать среднюю загрузку в системе Linux из + / proc / loadavg +. Для этого проекта нас интересует только средняя загрузка за последнюю минуту, которая является первым полем вывода. Используйте эту команду, чтобы получить это значение:

cat /proc/loadavg | cut -f1 -d" "

Вы увидите следующий вывод:

Output0.11

Среднее значение загрузки, которое вы получаете, читая + / proc / loadavg +, зависит от количества процессоров, поэтому вам нужно нормализовать его, поделив среднее значение нагрузки на количество процессоров. Вы можете использовать следующую команду, чтобы узнать количество процессоров вашего сервера:

getconf _NPROCESSORS_ONLN

Вы увидите результат, отображаемый в вашем терминале:

Output1

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

echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`

Команда отображает имя хоста, среднюю загрузку и количество процессоров соответственно:

Output 0.28 1

Давайте создадим скрипт оболочки, который публикует имя хоста, среднее значение загрузки и число процессоров на нашем сервере NATS с темой + stats.loadaverage +. Мы настроим нашу систему для периодического запуска этого скрипта. Создайте новый файл с именем + ~ / publish_load_average.sh +:

nano ~/publish_load_average.sh

В файле добавьте этот скрипт:

~ / Publish_load_average.sh

NATS_ADDR=
LOADAVG=
NPROC=
SUBJECT=
PAYLOAD=
MESSAGE=
printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user  --pass

Этот скрипт создает сообщение и затем передает его + catnats +, который публикует сообщение в службу NATS. Мы запускаем + catnats + с ключом + -q +, чтобы подавить любой вывод, и используем переключатель + - raw +, чтобы + catnats + не пытался интерпретировать содержимое ввода. Вы можете изменить значение переменной + $ NATS_ADDR +, если служба NATS находится на разных серверах.

Давайте проверим, что скрипт отправляет средние значения нагрузки в NATS.

Следующая команда запускает + ~ / publish_load_average.sh + каждые 5 секунд. Обратите внимание, что мы используем символ + & + в конце строки, чтобы выполнить команду в фоновом режиме:

while true; do sh ~/publish_load_average.sh; sleep 5; done &

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

Output[1]

Теперь подключитесь к NATS и подпишитесь на тему + stats.loadaverage + для получения средних значений нагрузки:

printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user  --pass

Мы используем флаг + - no-exit +, чтобы отключить автоматический выход, и + - pong +, чтобы поддерживать наше соединение с NATS. Если все правильно, вы должны получить вывод, похожий на следующий, который будет обновляться каждые 5 секунд:

OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
+OK
+OK
MSG stats.loadaverage 0 27

Нажмите + CTRL + C +, чтобы выйти из + catnats +. Давайте также остановим цикл, который вызвал + publish_load_average.sh +, поскольку у нас будет лучший способ запуска + publish_load_average.sh +:

kill

Подход, который мы только что выбрали, отлично подходит для тестирования, но мы не хотим постоянно его использовать. Мы бы хотели, чтобы система запускала + publish_load_average.sh + для запуска каждую минуту. Для этого мы можем добавить запись crontab. Системы Linux используют + cron +, систему, которая может запускать команды или «задания» по заданному нами расписанию. Команда + crontab + позволяет нам управлять этими заданиями. Вы можете узнать все о Cron в учебнике Как использовать Cron для автоматизации задач На VPS.

Чтобы создать новую запись, выполните команду:

crontab -e

Если вы никогда не выполняли команду, указанную выше, вы можете увидеть следующую подсказку, в которой вас попросят выбрать текстовый редактор для управления записями:

Outputno crontab for demo - using an empty one

Select an editor.  To change later, run 'select-editor'.
 1. /bin/ed
 2. /bin/nano        <---- easiest
 3. /usr/bin/vim.basic
 4. /usr/bin/vim.tiny

Choose 1-4 [2]:

Введите номер, соответствующий редактору, который вам удобнее всего, и нажмите + ENTER. Файл будет отображен в выбранном вами редакторе.

В конце открытого файла добавьте следующую строку, но замените свое имя пользователя, если вы использовали что-то отличное от ++:

*/1 * * * * bash /home//publish_load_average.sh

Запись выше говорит + cron + запускать наш скрипт + publish_load_average.sh + каждую минуту. Сохраните файл и закройте редактор.

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

printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user  --pass

Подождите несколько минут, и результат, который вы увидите, будет похож на следующий:

OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
+OK
+OK
MSG stats.loadaverage 0 27

MSG stats.loadaverage 0 27

Нажмите + CTRL + C + для выхода из + catnats +.

Мы успешно настроили монитор, и он отправляет сообщения на наш сервер NATS. Далее мы настроим уведомитель, который использует эти данные.

Создание уведомителя

Давайте создадим уведомитель, который подключается к нашей службе NATS и прослушивает сообщения + stats.loadaverage +. Всякий раз, когда наша программа получает сообщение, она вычисляет среднюю нагрузку на процессор. Если он выше 0,6 или 60% загрузки ЦП на процессор, он устанавливает флаг предупреждения для хоста, который опубликовал сообщение, и отправляет электронное письмо на предварительно определенный адрес. Если средняя загрузка на процессор меньше 0,4, флаг предупреждения для хоста сбрасывается. Чтобы предотвратить переполнение почтового ящика, мы отправляем одно электронное письмо, когда установлен флаг предупреждения.

Мы будем использовать Node.JS для создания уведомителя, так как есть отличный клиент NATS для Node.js. Итак, сначала установите Node.js:

sudo apt-get install -y npm

Затем создайте каталог для уведомителя и переключитесь на него:

mkdir ~/overload_notifier && cd ~/overload_notifier

В проектах Node.js используется файл с именем + package.json +, который содержит информацию о проекте и его зависимостях. Выполните следующую команду, чтобы создать этот файл:

npm init -y

Затем установите клиент NATS для Node.js, а также модуль + nodemailer +, который мы будем использовать в этом проекте для отправки предупреждений:

npm install [email protected] [email protected] --save-exact

Теперь мы можем создать уведомитель. Создайте файл + notifier.js +:

nano notifier.js

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

notifier.js

var NATS_URL = 'nats://127.0.0.1:4222';
var NATS_USER = '';
var NATS_PASS = '';
var EMAIL_TO = '';

Обязательно измените эти параметры, чтобы они соответствовали вашему имени пользователя и паролю для службы NATS, а также вашему адресу электронной почты.

Затем добавьте этот код, чтобы импортировать клиента Node.js NATS и подключиться к службе + gnatsd +:

notifier.js

var tlsOptions = {
 rejectUnauthorized: false,
};
var nats = require('nats').connect({url: NATS_URL,
                                   tls: tlsOptions,
                                   user: NATS_USER,
                                   pass: NATS_PASS});

Затем добавьте этот код для настройки почтовой программы и подключитесь к SMTP-серверу, который будет отправлять электронные письма. Мы настроим этот сервер в ближайшее время:

notifier.js

var nodemailer = require('nodemailer');
var transport = nodemailer.createTransport('smtp://localhost:2525');

Затем добавьте оставшуюся часть кода, чтобы рассчитать среднее значение нагрузки и определить, нужно ли нам отправлять уведомления по электронной почте:

notifier.js

// keep the state of warnings for each host
var warnings = {};

function sendEmail(subject, text) {
   transport.sendMail({
       to: EMAIL_TO,
       subject: subject,
       text: text
   });
}

function processMessage(message) {
   // message fields: host load processor_count
   var fields = message.split(" ");
   var host = fields[0];
   var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]);
   if (loadAverage > 0.6) {
       if (!warnings[host]) {
           // send warning email if one wasn't already sent
           var res = sendEmail('Warning! Server is Overloaded: ' + host,
                               'Load average: ' + loadAverage);
           // set warning for the host
           warnings[host] = true;
       }
   }
   else if (loadAverage < 0.4) {
       if (warnings[host]) {
           // clear the warning
           warnings[host] = false;
       }
   }
}

nats.subscribe('stats.loadaverage', processMessage);

Мы подписываемся на это сообщение, и каждый раз, когда мы получаем сообщение, мы выполняем функцию + processMessage +, которая анализирует отправленную нами полезную нагрузку и определяет среднее значение нагрузки. Если оно слишком высокое, мы отправляем сообщение и отслеживаем, отправили ли мы его ранее, установив флаг на основе имени хоста. Таким образом, мы можем отслеживать уведомления для каждого хоста. Если средняя нагрузка ниже нашего порога, мы снимаем этот флаг.

При наличии монитора и уведомителя пришло время протестировать наш пример проекта.

Тестирование проекта

Давайте возьмем это для тест-драйва. Мы собираемся сгенерировать некоторую искусственную загрузку и проверим, отправит ли уведомитель электронное письмо с предупреждением, когда нагрузка станет слишком высокой.

Давайте установим инструмент «+ress +» для генерации нагрузки на процессор на нашем сервере:

sudo apt-get install -y stress

Затем нам нужно настроить SMTP-сервер для отправки сообщений от нашего уведомителя. Установка и настройка полноценного SMTP-сервера для этого теста была бы излишней, поэтому мы будем использовать простой SMTP-сервер, который просто отображает электронные письма, переданные ему, а не отправляет их. Язык программирования Python имеет модуль + DebuggingServer +, который мы можем загрузить, который отбрасывает получаемые электронные письма, но отображает их на экране, чтобы мы могли убедиться, что все работает. Python уже установлен на нашем сервере Ubuntu, так что это идеальное решение.

Давайте запустим отладочный SMTP-сервер в фоновом режиме. Мы заставим его прослушивать + localhost + port + 2525 +, что соответствует SMTP-адресу, который мы настроили в нашем коде + notifier.js +. Выполните эту команду, чтобы запустить SMTP-сервер:

python -m smtpd -n -c DebuggingServer localhost:2525 &

Затем запустите уведомитель в фоновом режиме с помощью этой команды:

nodejs ~/overload_notifier/notifier.js &

И наконец, давайте создадим некоторую нагрузку на все процессоры нашего сервера. Выполните команду +ress + со следующими параметрами:

stress --cpu $(getconf _NPROCESSORS_ONLN)

Через несколько минут вы увидите вывод, подобный следующему, поскольку SMTP-сервер начнет отображать сообщения, отправленные уведомителем:

Output---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain
To:
Subject: Warning! Server is Overloaded:
Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost>
X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/;
SMTP/2.5.0[client:2.5.0])
Content-Transfer-Encoding: 7bit
Date: Sun, 19 Jun 2016 16:47:02 +0000
MIME-Version: 1.0
X-Peer: 127.0.0.1


------------ END MESSAGE ------------

Это позволяет вам знать, что вы успешно отправили электронные письма, когда нагрузка на сервер слишком высока.

Нажмите + CTRL + C +, чтобы остановить генерирование нагрузки. Вы завершили пример проекта и теперь должны иметь представление о том, как сделать это для вас в вашей собственной среде.

Заключение

В этой статье вы узнали о системе обмена сообщениями NATS PubSub, установили ее безопасным способом в качестве службы и протестировали ее в примере проекта. В примере проекта использовался клиент Node.JS, но в NATS есть клиенты для других языков и сред, которые вы можете найти в списке на странице загрузки NATS. Вы можете узнать больше о NATS в его official документации.

Related