ТЗ получилось примерно такое:
- Мониторинг системы (cpu, mem, load average, bandwidth).
- Мониторинг состояния сервисов (запущен или нет).
- Мониторинг функционирования сервисом (отвечает на запросы корректно или нет).
- Контроль потребляемых сервисами ресурсов и общего их состояния.
- Централизованая «админка» для всей этой радости.
- Уведомление по email, самостоятельное исправление проблемы (например рестарт упавшей службы).
Поиск решения.
В процессе изучения возможных вариантов были найдены 5 вариантов:
- Nagios
- Whats UP
- Zabbix
- Monit
- Написание собственных скриптов
Первый и третий варианты были отброшены как слишком сложные в настройке и имеющие заведомо не нужный (хотя и огромный) функционал. Второй отброшен из-за феерической (995$) цены и требования сервера с MS Windows. В итоге я решил остановиться на Monit.
Что такое Monit?
Monit — бесплатное приложение с открытым исходным кодом, обеспечивающее комплексный мониторинг UNIX-like систем, как то:
- Состояние серверов (доступность, потребление ресурсов).
- Мониторинг демонов (состояние, потребляемые ресурсы, количество child-process и многое другое).
- Мониторинг сетевых сервисов (возможность подключения и корректность ответа).
- Выполнение встроенных (запуск\остановка\перезапуск) или собственных (скрипты) действий при достижении определенных событий.
- Уведомление на email или в централизованный web-интерфейс M\Monit.
Основным приемуществами программы являются низкое потребление ресурсов, простота конфигурации (настройка 15-20 минут) и открытый исходный код.
Поддерживаются ОС GNU\Linux (есть в большинстве пакетных систем), FreeBSD (есть в портах), OpenBSD, Solaris, MacOS X. Windows в качестве сервера НЕ поддерживается, но мониторить сетевые сервисы расположенные на удаленной windows-машине это не мешает.
Архитектуры — x86, x86_64, PowerPC (Mac only), Sparc (Sun only).
Установка и базовая настройка.
Пакет есть для большинства дистрибутивов (Gentoo, Debian, FreeBSD — в основном дереве, CentOS, Fedora, RedHat — в репозитории dag). Пакет так и называется — monit.
Основной конфигурационный файл — /etc/monit.conf (в Linux) или /usr/local/etc/monitrc (в FreeBSD). В FreeBSD этот файл нужно создать:
# mv /usr/local/etc/monitrc.sample /usr/local/etc/monitrc
После чего нам нужно раскомментировать в конфигурационном файле строку:
include /etc/monit.d/*
Теперь все файлы конфигурации из /etc/monit.d/ будут автоматически подхватыватся monit-ом.
Я разбил свою конфигурацию на два файла (для удобства) — main.conf (общие настройки) и master.conf (настройки мониторинга сервисов).
main.conf
Для тех, кому лень читать комментарии на английском привожу его пример и перевод части комментариев.
set daemon 120 # Частота проверки сервисов.
set logfile syslog facility log_daemon # syslogd facility.
set mailserver localhost, # IP\hostname почтового сервера, через который пойдут уведомления.
set eventqueue # Разрешить очередь уведомлений.
basedir /var/log/monit # путь к каталогу, где будут храниться уведомления.
slots 100 # Максимальное количество уведомлений в очереди.
set mail-format { from: main-servers-alert@example.com } # От какого имени рассылать уведомления.
set alert admin@example.com #Ящик для _всех_ уведомлений (много).
set alert support@example.com { timeout } # Ящик для критических уведомлений (падение сервера\демонов).
check system *CHANGEME.HOSTNAME.EXAMPLE.COM* # Хостнейм сервера.
if loadavg (1min) > 6 then alert
if loadavg (5min) > 3 then alert
if memory usage > 75% then alert
if cpu usage (user) > 70% then alert
if cpu usage (system) > 30% then alert
if cpu usage (wait) > 20% then alert
Как видно, конфиг крайне прост и понятен.
master.conf
master.conf — в моем случае отвечает за мониторинг конкретных демонов.
Опять же привожу его пример (слепо копипастить _не_нужно_). Показываю на примере почтовика exim, по этой логике пишется такой блок под каждый демон, который нужно мониторить:
check process exim with pidfile /var/run/exim.pid # Название и PID.
start program = "/etc/init.d/exim stop" # Команда запуска.
stop program = "/etc/init.d/exim start" # Команда остановки.
if cpu > 60% for 2 cycles then alert # Если в течение двух циклов потребление CPU > 60% - уведомить.
if cpu > 80% for 5 cycles then restart # А если за 5 циклов больше 80% - перезапустить.
if totalmem > 300.0 MB for 5 cycles then restart # Если потребление памяти > 300мб - рестарт.
if children > 50 then restart # Если больше 50 чайлдов - рестарт.
if failed port 25 protocol smtp then restart # Если не отвечает на 25 порту по SMTP - рестарт.
if 5 restarts within 5 cycles then timeout # Если пять раз рестартовали и не помогло - timeout.
M\Monit
M\Monit — средство централизованного мониторинга серверов под управлением monit.
Сама программа платная, но пользоваться ей можно и бесплатно — на сайте выложена Free-версия, хотя и с определенными ограничениями.
Установка и базовая настройка.
Качаем версию для своей ОС и архитектуры, распаковываем архив.
Устанавливаем:
# mv mmonit-2.0.3 /usr/local/mmonit
# cd /usr/local/mmonit
# cp /usr/local/mmonit/doc/startup/mmonit_init /etc/init.d/mmonit
Создаем базу данных MySQL (также поддерживаются PgSQL и SQLite), вносим содержимое:
# cat /usr/local/mmonit/db/mmonit-schema.mysql | mysql -u-p monit
Редактируем /usr/local/mmonit/conf/server.xml. Формат конфига - XML. Для нас там интересен только один блок:
minConnections="5"
maxConnections="250"
reapConnections="300" />
Можно запускать:
# /etc/init.d/mmonit start
Если запустилось нормально - заходим на localhost:8080. Логин admin, пароль swordfish
Теперь осталось настроить клиенты.
Связывание monit с m\monit
Для связывания клиента и центра управления, нужно в main.conf каждого сервера вписать:
set mmonit monit:monit@:8080/collector
set httpd port 2812 and use address allow localhost
allow allow monit:monit
После чего перезапустить мониторинг.
Осталось только зайти в админку и зарегистрировать появившиеся там серверы. Мониторинг готов. Мы сможем контролировать нагрузку на все серверы, работающих демонов и системные события.