Из-за того что большинство машин имеют несколько экземпляров, иногда может возникнуть ситуация, когда из-за одного из этих экземпляров производительность всей машины снижается. Из-за отсутствия мониторинга на уровне процессов после того как произошла проблема, становится сложно выявить, какой именно экземпляр заблокировал системные ресурсы. Чтобы решить эту проблему управления, требуется реализовать мониторинг на уровне процессов.
Мониторинг ресурсов на уровне процессов включает, но не ограничивается следующими аспектами: ЦП, память, операции ввода-вывода с диском, сетевой трафик.
$ uname -a
Linux 3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
Другие среды не тестировались, могут возникнуть проблемы, рекомендуется решать их в зависимости от конкретной ситуации.
Перейти в виртуальное окружение и установить необходимые модули
virtualenv -p /usr/local/python3/bin/python3 py37env
source py37env/bin/activate
pip install -r init/requirements.txt
Если используется встроенное виртуальное окружение, эти три шага можно пропустить.
ip,top,netstat,df,awk,grep,sed,free,lscpu,uptime,iftop,iotop,md5sum,tr,cd,ssh,rsync,python3,timeout
```### Раздел 3. Принцип работы

#### 1. Сервер
- Поток 1
Этот поток выполняет три задачи:
(1) При каждом перезапуске сервера он читает таблицу `tb_monitor_version`, проверяет текущую версию и сравнивает её с записанной в MySQL. Если они не совпадают, то происходит обновление записи в MySQL. После этого все узлы со значением istate = 2 обновляются до istate = 1.
(2) Управляет запуском и завершением клиентских узлов. Каждые 30 секунд он читает таблицу `tb_monitor_host_config` и управляет запуском новых узлов или завершением существующих. Istae = 1 указывает на необходимость запуска, тогда происходит развертывание скрипта мониторинга (обновление кода при необходимости), и узел обновляется до istate = 2. Istae = 0 указывает на необходимость завершения, тогда происходит завершение клиента и обновление до istate = -1.
(3) Управляет состоянием клиентских узлов. Каждые 30 секунд он читает таблицы `tb_monitor_host_config`, `tb_monitor_alert_info`, `tb_monitor_host_info` (три таблицы связаны между собой), и если клиент не отправил данные за последние две минуты и не был предупрежден за последние пять минут, то он отправляет предупреждение.
- Поток 2
Этот поток выполняет две задачи:
(1) Ждет получения данных мониторинга от клиента, затем анализирует их повторно и записывает в MySQL.
(2) Возвращает текущую версию клиенту.#### 2. Клиент
Клиент выполняет три действия:
(1) Шесть потоков параллельно собирают данные с машин ([процессор CPU], [оперативная память], [жесткий диск], [сетевые интерфейсы], [сетевой трафик процесса], [ввод-вывод процесса, процессор CPU, оперативная память процесса]). После завершения сбора данных основной поток анализирует их и отправляет серверу.
(2) Во время отправки данных, если происходит три последовательных отказа со стороны сервера, то клиент регистрирует это как ошибку (чтобы избежать одновременного оповещения нескольких клиентов) в таблице [tb_monitor_alert_info] и отправляет оповещение.
(3) После успешной отправки данных клиент проверяет совпадает ли его версия с версией, полученной от сервера. Если версии не совпадают, программа завершается и ждет запуска через crontab для выполнения обновления.
> Сервер после обновления кода при перезапуске передаст новый код всем клиентам.
#### 3. MySQL
MySQL используется для хранения информации о версиях, конфигурациях IP клиента, мониторинговых данных и состоянии оповещений.
#### 4. Grafana
Grafana используется для чтения мониторинговых данных из MySQL и их отображения.
#### 5. Оповещение
Оповещения осуществляются через бота корпоративного WeChat.
> Часть по сбору и анализу данных у клиента можно найти здесь, раздел 3, пункт 2: https://mp.weixin.qq.com/s/UCSZWYJ5D4_EoK6mud2pPQ### 4. Инструкция по использованию
#### 1. Установка сервера
Может возникнуть проблема совместимости между версиями программного обеспечения, поэтому другие версии могут работать некорректно. Пожалуйста, протестируйте самостоятельно.
##### (1) Клонирование проекта
```bash
mkdir -p /opt/soft/git
cd /opt/soft/git
git clone https://gitee.com/mo-shan/rpc_for_process_monitor.git
Требуется среда Python 3, рекомендованная версия 3.7.4. Обязательно наличие
python3
в PATH, подробности установки пропущены.
cp -r /opt/soft/git/rpc_for_process_monitor /opt/soft/rpc_for_monitor # Обратите внимание, что эти директории различаются, чтобы избежать ошибок между рабочими и тестовыми окружениями cd /opt/soft/rpc_for_monitor
$ tree -L 2 . ├── conf │ └── config.ini # файл конфигурации ├── img # игнорировать │ ├── all-info.png │ ├── cpu-info.png │ ├── disk-info.png │ ├── grafana-data-source-1.png │ ├── grafana-data-source-2.png │ ├── grafana-data-source-3.png │ ├── grafana-data-source-4.png │ ├── grafana-data-source-5.png │ ├── grafana-data-source-6.png │ ├── grafana-data-source-7.png │ ├── mem-info.png │ ├── net-info.png │ └── process-info.png ├── init # файлы инициализации │ ├── grafana.json # шаблон конфигурации Grafana │ ├── init.sql # SQL-запросы для создания таблиц в MySQL │ └── requirements.txt # зависимости модулей Python 3 ├── lib # библиотечные файлы │ ├── Config.py # парсер файла config.ini │ ├── ConnectMySQL.py # подключение и управление MySQL │ ├── globalVar.py # глобальные переменные │ ├── Public.py # общие функции │ └── pycache ├── LICENSE ├── logs # каталог логов │ └── info.log # файл логов ├── py37env # виртуальная среда, требуется наличие в /opt/soft/rpc_for_monitor/py37env для использования (путь к activate и другим файлам зафиксирован) │ ├── bin │ ├── include │ ├── lib │ └── pip-selfcheck.json ├── README.md # документация ├── rpc
├── start_server.sh #скрипт запуска сервера
└── state #игнорировать
└── state.log
```11 директорий, 28 файлов
```##### (3) Настройка сервера
```markdown
vim conf/config.ini #редактируйте в соответствии с вашими требованиями
[global]
version = 1.1 #версия; с помощью этого параметра контролируется код сервера и клиента, если версии различаются, клиент будет перезапущен, что обеспечивает обновление
interval_time = 30 #интервал сбора данных (в секундах); то есть каждые 30 секунд, значение не является строго точным
retention_day = 30 #количество дней хранения данных мониторинга; то есть 30 дней
log_file = /opt/soft/rpc_for_monitor/logs/info.log #файл логов
script_dir = /opt/soft/rpc_for_monitor #каталог скриптов; не рекомендуется менять
mount_part = /work #точка монтирования диска данных; можно не указывать, но конфигурация этого параметра должна присутствовать
log_size = 20 #размер файла логов (в МБ); при превышении этого значения старые логи будут удалены
[RULE]
cpu = 200 #пороговое значение сбора данных; 200 означает, что процесс будет собран, если его использование ЦП >= 200%
mem = 10 #пороговое значение сбора данных; 10 означает, что процесс будет собран, если его использование памяти >= 10 ГБ
io = 10240 #пороговое значение сбора данных; 10240 означает, что процесс будет собран, если его использование I/O (чтение или запись) >= 10 МБ
net = 10240 #пороговое значение сбора данных; 10240 означает, что процесс будет собран, если его использование сети (входящие или исходящие данные) >= 10 МБ
```[CLIENT]
path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin # Определение пути операционной системы, так как клиент поддерживает задачу cron, важно определить path, чтобы избежать ошибок выполнения скрипта из-за проблем с переменными окружения
python3 = /usr/local/python3 # Путь установки Python3
py3env = /opt/soft/rpc_for_monitor/py37env # Путь виртуальной среды Python3, проект уже содержит одну виртуальную среду, которую можно использовать (при условии, что каталог скриптов не был изменён)
[MSM]
wx_url = xxxx # URL для отправки уведомлений от корпоративного WeChat, функционал уведомлений требует вашего изменения и тестирования (если используется URL + ключ для бота WeChat, он может быть использован сразу после настройки)
[Monitor] # Конфигурация MySQL для хранения данных мониторинга
mysql_host = xxxx
mysql_port = xxxx
mysql_user = xxxx
mysql_pass = xxxx
Не рекомендовано изменять некоторые конфигурации
Все директории не следует менять, иначе потребуется слишком много изменений
Установка MySQL не рассматривается подробно, рекомендуемая версия: 5.7
Войдите в систему с помощью администраторского аккаунта MySQL.
CREATE USER 'monitor_ro'@'192.%' IDENTIFIED BY 'pass1';
GRANT SELECT ON dbzz_monitor.* TO 'monitor_ro'@'192.%';
CREATE USER 'monitor_rw'@'192.%' IDENTIFIED BY 'pass2';
GRANT SELECT, INSERT, UPDATE, DELETE ON dbzz_monitor.* TO 'monitor_rw'@'192.%';
```> Аккаунт `monitor_ro` используется для Grafana, а аккаунт `monitor_rw` — для записи данных мониторинга программами (сервер записывает данные, клиент отправляет данные серверу). Поэтому важно предоставить права доступа для `monitor_ro` на машине Grafana и для `monitor_rw` на всех объектах мониторинга. Цель этого — контролировать ситуацию, когда сервер отключается, и первый обнаруживший клиент пишет в таблицу сообщение о тревоге и отправляет уведомление, чтобы избежать повторной отправки тревоги другими клиентами.
##### (2) Инициализация MySQL
> Войдите в систему с помощью административного аккаунта MySQL.
cd /opt/soft/rpc_for_monitor mysql < init/init.sql
> Все таблицы находятся в базе данных dbzz_monitor```markdown
(dba:3306)@[dbzz_monitor]> show tables;
+---------------------------------------------+
| Tables_in_dbzz_monitor |
+---------------------------------------------+
| tb_monitor_alert_info | # Таблица тревог, где записывается информация при активации тревоги, чтобы избежать повторных тревог одновременно.
| tb_monitor_disk_info | # Таблица информации о дисках, где каждое устройство хранится как отдельная запись.
| tb_monitor_host_config | # Конфигурационная таблица клиента, куда следует добавить конфигурацию для каждого устройства.
| tb_monitor_host_info | # Таблица для системного уровня мониторинга.
| tb_monitor_port_net_info | # Таблица для сетевого мониторинга портов.
| tb_monitor_process_info | # Таблица для записи информации о процессах на уровне всей системы.
| tb_monitor_process_io_info | # Таблица для записи информации о вводе-выводе для каждого процесса.
+---------------------------------------------+
6 строк (0.00 сек)
Для каждой таблицы есть подробные комментарии, пожалуйста, обращайтесь к комментариям при создании таблиц.
### 3. Настройка клиента
Настройка клиента проста, достаточно добавить одну запись в таблицу MySQL.
```sql
use dbzz_monitor;
insert into tb_monitor_host_config select 0, '192.168.168.11', 1; # Для нескольких устройств добавьте несколько записей
Здесь есть ограничение, что клиентская машина должна иметь установленную среду Python 3, иначе могут возникнуть ошибки.
Установка не рассматривается здесь.
Версия Grafana: 8.3.1, рекомендуется использовать одинаковые малые версии. https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.1.linux-amd64.tar.gz
Эта часть относится к конфигурации Grafana, все конфигурации уже преобразованы в JSON-файлы, пользователи могут просто импортировать их.
Конкретные действия следуют ниже.
Создайте новый источник данных
Необходимо выбрать MySQL источник данных
Имя источника данных должно быть записано как dba_process_monitor, если это не совпадает с конфигурацией Grafana, может возникнуть проблема.
$ ll init/grafana.json
-rw-r--r-- 1 root root 47875 Jun 23 14:28 init/grafana.json
Этот конфигурационный файл был создан в версии Grafana 8.3.1. Обратите внимание на версию, так как различные версии могут быть несовместимыми.
Настройте скрипт запуска сервера в crontab, чтобы он выполнял роль демона.
echo "*/1 * * * * bash /opt/soft/rpc_for_monitor/start_server.sh" >> /var/spool/cron/root
Клиентская сторона не требует специальных действий, после запуска сервера он автоматически будет управлять клиентами.
После завершения настроек, подождите минуту и проверьте логи в файле /opt/soft/rpc_for_monitor/logs/info.log
, вы должны увидеть что-то подобное:
[ 2022-06-30 15:13:01 ] [ INFO ] [ V1.1 Listening for '0.0.0.0:9300' ]
[ 2022-06-30 15:13:04 ] [ INFO ] [ Новый мониторинговый узел успешно добавлен ] [ 192.168.168.11 ]
[ 2022-06-30 15:13:11 ] [ INFO ] [ Успешное отправление данных мониторинга ] [ 192.168.168.11 ]
По умолчанию порт равен 9300, его можно изменить, модифицировав файл
/opt/soft/rpc_for_monitor/start_server.sh
.
Всего пять строк, первые пять — это мониторинг уровня машины, process — мониторинг процессов.
Общее использование ЦПУ всей машины.
Общее использование памяти всей машины.
Общее использование жесткого диска всей машины, если конкретные точки монтирования не определены, будут собраны все точки монтирования.
Общее использование сети всей машины.
Вы будете видеть конкретное использование системных ресурсов каждым процессом.
Серверная и клиентская стороны должны иметь среду Python 3.- При наличии нескольких серверов, при запуске следует указывать их все (через запятую). В противном случае при развертывании клиента будет использоваться только один сервер. Преимущество использования нескольких серверов заключается в том, что если первый выйдет из строя или станет некорректным, клиент отправит данные на другой сервер.- Во время работы сервер может добавлять клиента, достаточно добавить запись с istate
= 1 в таблицу [tb_monitor_host_config]
. Аналогично, чтобы отключить клиента, нужно обновить istate
до 0. Для работающего клиента istate
равно 2, а после отключения равно -1.
Устройство имеет функцию тревожной сигнализации (при правильной конфигурации). Если сервер выходит из строя (клиент трижды не может подключиться к серверу), то первый обнаруживший клиент запишет информацию в MySQL и отправит тревогу. Если клиент выходит из строя, сервер заметит это и отправит тревогу (если за две минуты нет данных).
Если требуется обновление кода, достаточно протестировать новый код, убедиться в его корректности, затем обновить его в директории скриптов развертывания сервера и завершить работу сервера командой kill
. Ожидайте, пока cron
не запустит сервер снова. Код клиента не требует ручного обновления. Важно помнить, что новому коду обязательно нужно обновить версию в конфигурационном файле, иначе сервер не заметит несоответствие версий и не отправит задачи на обновление кода клиента.
Если требуется изменить каталог развертывания, пожалуйста, внесите необходимые изменения в [conf/config.ini]
и [lib/Config.py]
, обратите внимание, что встроенный виртуальный окружение может перестать работать в этом случае. Сильно не рекомендуется менять структуру каталогов или названия каталогов.- Учитывая проблемы производительности MySQL и графического отображения данных Grafana, была добавлена возможность установки пороговых значений сбора данных. В результате некоторые панели могут не содержать мониторинговых данных за определённые периоды времени (процесс за этот временной промежуток не достиг порогового значения для сбора данных).
Все материалы данной статьи представлены исключительно в справочных целях. Из-за различий в средах выполнения при использовании кода из этой статьи могут возникнуть неизвестные проблемы. Если вам требуются действия в рабочей среде, настоятельно рекомендуется провести полное тестирование в среде тестирования.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )