Когда я был молод и горяч и не знал, куда девать свою энергию, я решил немного пофрилансить. Мне удалось быстро набить рейтинг и я нашёл пару постоянных клиентов, которые попросили поддерживать их сервера на постоянной основе.
Первое, о чём я подумал, это необходимость мониторинга. Решил сделать как умные люди, не изобретать велосипед, а посмотреть готовые варианты, такие как Munin или Zabbix. Но сразу обнаружилось, что Web-версия требует хорошего интернет соединения, особенно если открывать впервые с телефона. Если же ты отдыхаешь на природе вдали от города, получить стабильную связь сложно. Поэтому был выбран консольный вариант мониторинга.
В качестве консольного мониторинга мне хорошо помог atop и программа для чтения логов atop’а — atopsar. Их уже упоминали на habr, atop даже разобрали, а вот про atopsar ничего почти не рассказали.
Установка
Очень простая установка, всего три команды.
#Centos
yum install atop
#Debian/Ubuntu
apt-get install atop
Далее можно настроить работу мониторинга под себя или использовать настройки по умолчанию.
#Debian/Ubuntu/Centos
/etc/default/atop
Стандартный файл:
#cat /etc/default/atop
INTERVAL=60 #Время, через которое создаётся снимок нагрузки в секундах, по умолчанию каждые 10 минут
LOGPATH="/var/log/atop" #Путь до папки хранения логов
OUTFILE="$LOGPATH/daily.log" #Название файла логов за сегодняшний день
Добавляем в автозапуск
#Debian/Ubuntu/Centos
systemctl enable atop
Запускаем atop как демон
#Debian/Ubuntu/Centos
systemctl start atop
Для ленивых собрал в одну команду
#Centos
yum install atop && systemctl enable atop && systemctl start atop
#Debian/Ubuntu
apt-get install atop && systemctl enable atop && systemctl start atop
Atopsar
Вместе с atop ставится и atopsar, это удобный консольный анализатор бинарных логов, которые ведёт демон atop. Конечно можно читать логи и самим atop’ом, но это не так удобно, если требуется захватить большой интервал времени.
Небольшой ликбез по работе atopsar.
При запуске atopsar без ключей открывается лог за сегодняшний день и выводится нагрузка на каждое ядро по отдельности и строка idl по всем ядрам.
Ключи, которые я использую:
-A = вывести всю информацию из лога
-с = вывести информацию по нагрузке на ядра процессора, ключ по умолчанию
-m = нагрузка на оперативную память и swap
-d = дисковая активность
-O = топ-3 процессов нагрузки на CPU
-G = топ-3 процессов нагрузки на RAM
-D = топ-3 процессов нагрузки на диск
-N = топ-3 процессов нагрузки на сеть
-r = указать путь до лога, который хотите прочитать, если надо посмотреть нагрузку за прошедшие дни
-b = время, с которого начать вывод
-e = время, на котором надо закончить вывод
-M = создаёт дополнительный столбец в конце, в котором помечается критичность строки (+ есть нагрузка, * — критическая нагрузка)
Благодаря мониторингу мы сможем понять причину некорректного поведения сервера в любое время.
Уведомления
Итак, мониторинг нагрузки есть, но он всё равно не даёт возможности оперативно находить и решать проблемы. Нам нужны уведомления о возникшей проблеме.
Я один слежу за серверами, поэтому уведомлять нужно туда, где я всегда смогу это увидеть и хоть как-то на это среагировать.
В начале были SMS — быстро, надёжно, бесплатно. Но потом мобильные операторы прикрыли бесплатную SMS рассылку через свои шлюзы.
Почта — долго, могут быть проблемы с доставкой.
Мессенджеры — надо ставить на телефон, необходимо создавать ботов.
В результате поиска был выбран мессенджер Телеграмм за простоту и удобное приложение на телефоне и десктопе.
Создал своего бота с помощью botfather.
После положил на сервер несколько скриптов, отслеживающих нагрузку на сервер (IDL, smartct и др.l), наличие ошибок вида «oom killer», ошибки при создании бэкапа и другие операции, которые необходимо контролировать.
Скрипты довольно простые, написанные на bash, например, проверка LA и уведомление о превышении Load Averadge’м количества ядер на сервере.
if [ ${LA[0]} -gt 2000 ] || [ ${LA[1]} -gt 3000 ] || [ ${LA[2]} -gt 4000 ]
then
wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=На сервере $ip LA $LAd"
wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=`top -b -n 1 | grep Cpu`"
wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=Топ 5 процессов `top -b -n 1 | grep -A 5 'PID USER' | tail -5`"
fi
Простота синтаксиса даёт очень много вариантов использования (и написать/дописать может любой, кто хоть немного владеет языком программирования).
Единственный нюанс — если сервер находится в России (и у вас нет IPv6 на сервере), то необходимо пользоваться прокси. Для этого в начале скрипта надо прописать строку подключения к прокси:
export https_proxy=http://логин:пароль@IP.адрес:порт
Это не конец
Идёшь ты себе спокойно по горам с рюкзаком за спиной, отдыхаешь от цивилизации, и тут телефон, случайно поймав связь, кидает уведомление о возникшей на твоём сервере проблеме. Что делать? Безмятежное настроение как ветром сдуло. Звонить жене и надиктовывать команды? Ха-ха!
Нужно было срочно придумать какой-то способ устранения возникших проблем быстро и без наличия хорошего интернета. Здесь меня опять спас мессенджер (#телеграммживи). Я научил своего бота общаться только со мной, игнорируя всех остальных. Теперь, вместе с уведомлением о проблеме, мне приходит немного больше данных, по которым я понимаю, кто источник проблемы, и могу попробовать ее решить удалённо. Достаточно просто написать сообщение боту, подкинуть телефон повыше, чтобы это сообщение ушло, и вуаля — бот пошёл делать твою работу. Таким образом я могу, например, убить какой-нибудь неугодный процесс, перезапустить демон, заблокировать IP и прочее.
Сюда же я перенёс будущие нужные запросы от клиентов, например, срочный сброс паролей пользователям (ибо “Аааа, мы не можем попасть на сервер, мы теряем миллионы!”), поиск пользователя, имеющего доступ в нужную папку, включение и выключение сайта и другие. Конечно же я постоянно дорабатываю функционал бота, так как фантазия клиентов подкидывает порой неожиданные и не предусмотренные мной запросы. Но основные удовлетворены.
Имеется и версия для VK, но она как-то не прижилась.
Теперь я спокойно путешествую и изучаю этот мир, не боясь, что что-то там сломается, а я не смогу об этом узнать или исправить.
Комментарии (11)
pyur
25.05.2019 21:53+1больше на какое-то хвастовство похоже. в духе "азазаз!!! посмотрите какой я успешный фрилансер! как я путешествую, пока мне денюжка на карман падает! а вы преете в своих душных офисах-душегубках!"
ну серьёзно, такую фигню любой мало-мальски опытный программер на коленках за выходные слабает.driveirk Автор
26.05.2019 03:43Я это писал не для того, чтобы показать какой я крутой программист, а чтобы показать народу что можно использовать мессенджеры для мониторинга. И что это просто и не требует каких либо специфических знаний. О чём вы подтвердили. Спасибо.
Потому что когда я искал как сделать, мне никто подобного не предлагал.
Это статья была написана как идея для будущих свершений.keydon2
26.05.2019 04:56Как то очень надуманно. К тому же заббиксу нет проблемы прикрутить нотификацию на месседжеры:
www.zabbix.com/integrations/?cat=notifications_alerting
В графане на телеграм алерты и вовсе из коробки.
AKYLA
26.05.2019 03:43Если бы хоть какие-то наброски для бота были, а то все как-то написано действительно, поверхностно.
driveirk Автор
26.05.2019 03:47Там же есть пример.
Когда делаешь бота тебе дают ключ и id бота. Вставляешь их в нужное место в ссылке. И всё.
Тебе осталось написать текст уведомления.
Или имеется ввиду момент приёма сообщений от бота?driveirk Автор
26.05.2019 04:19Приём сообщений прост, качаешь страницу, и парсишь её по id чата и всё. Это есть по ссылке на создание чат бота. Поэтому не думал что это надо описывать.
M_Muzafarov
26.05.2019 13:05Очередное переизобретение ChatOps? Автор сделал то, что уже давно много где используется и похвастался, как он путешествует и алюминии с телефона — довольно странная статья. Какой главный посыл тут?
gecube
Зачем wget, если curl'ом можно в меньшее кол-во букв и параметров уложиться? А в стандартных дистрибутивах обе утилиты есть...
driveirk Автор
Как то исторически сложилось. В принципи можно и curl-ом дёргать.
keydon2
Не во всех стандартных по дефолту curl есть.
gecube
Внезапно — ну, может кроме alpine. В Ubuntu/Centos/RedHat/Debian — обе утилиты были из коробки.