Алгоритм действий состоит из следующих шагов:
1.Создание пользователя с необходимымы привилегиями для сбора метрик с mysql
2.Запуск MySQL-экспортера для сбора метрик с MySQL и отдачи их Prometheus-у
3.Настройка Prometheus-а для сбора метрик с MySQL-экспортера
4.Импортирование/настройка dashboard Grafana для визуализации метрик
5.Настрйка правил Prometheus для мониторинга MySQL показателей
Описание параметров, которые испоьзуются для поcтроения дашбоарада в Grafana, изложено в статье
1.Создание пользователя с необходимыми привилегиями для сбора метрик с mysql
1 |
mysql> CREATE USER 'exporter'@'172.16.0.0/255.240.0.0' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3; |
1 |
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'172.16.0.0/255.240.0.0'; |
1 |
mysql> flush privileges; |
Доступ для этого пользователя предоставим с Docker-подсети(172.16.0.0/12)
Запрос на mysql-контейнер будет идти с mysql-exporter-контейнера, который будет запущен в одной docker-сети с mysql-контейнером
Необходимо отметить, что mysql не понимает формат бесклассовой маршрутизации(CIDR) маски подсети, поэтому необходимо использовать стандартный тип маски( вместо 12 необходимо использовать 255.240.0.0)
2.Запуск MySQL-экспортера для сбора метрик с MySQL и отдачи их Prometheus-у
Если не используется docker-compose
1 |
# docker run -d -p 10.130.15.2:9104:9104 –-network laradock_backend --name mysql-exporter -e DATA_SOURCE_NAME="exporter:exporterpassword@(mysql:3306)/" prom/mysqld-exporter |
Если используется docker-compose
1 |
# nano docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql-exporter: image: prom/mysqld-exporter container_name: mysql-exporter restart: unless-stopped environment: - DATA_SOURCE_NAME=${MYSQL_USER_EXPORTER}:${MYSQL_PASSWORD_EXPORTER}@(mysql:3306)/ ports: - "10.130.15.2:9104:9104" networks: - backend #mem_limit: 128m # for docker-compose v2 only #mem_reservation: 64m # for docker-compose v2 only logging: driver: "json-file" options: max-size: "5m |
Также здесь пробрасывается порт,на котором слушает запросы mysql-exporter наружу на, например, туннельный IP-адрес(10.130.15.2) и на порт, например,9104, чтобы Prometheus смог подключиться к с mysql-экспортеру для сбора метрик с него.
Определяем имя пользователя и пароль в файле с переменными — .env-файле, который читает docker-compose
1 |
# nano .env |
1 2 3 |
### MYSQL EXPORTER ########################################## MYSQL_USER_EXPORTER=exporter MYSQL_PASSWORD_EXPORTER=exporterpassword |
Проверка синтаксиса docker-compose-файла
1 |
# docker-compose config |
Создание и запуск mysql-exporter контейнера
1 |
# docker-compose up -d mysql-exporter |
Проверяем наличие запущенного mysql-exporter контейнера, который будет собирать метрики с mysql-сервера
1 |
# docker-compose ps | grep mysql-exporter |
1 |
mysql-exporter /bin/mysqld_exporter Up 10.130.15.2:9104->9104/tcp |
1 |
# netstat -nlptu | grep 9104 |
1 |
tcp 0 0 10.130.15.2:9104 0.0.0.0:* LISTEN 778/docker-prox |
С хоста, на котором запущен mysql-контейнер проверяем доступность метрик с mysql-экспортера
Список показателей достаточно длинный, поэтому вывел только их количество
1 |
# curl 10.130.15.2:9104/metrics | grep -E "^mysql" | wc -l |
1 |
792 |
С мониторинг хоста получаем такой же успешный ответ
3.Настройка Prometheus-а для сбора метрик с MySQL-экспортера
Добавляем mysql-экпортер в service discovery файл
1 |
# nano prometheus/sd/targets-mysql-exporter.yml |
1 2 3 4 5 6 7 |
... - targets: - replica2.mydomain.com:9104 labels: env: prod job: mysql-exporter ... |
Подключаем этот service discovery файл в Prometheus
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 5 6 |
... - job_name: 'mysql-exporter' file_sd_configs: - files: - sd/targets-mysql-exporter.yml ... |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/myusername/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Перечитываем конф.файл Prometheus
1 |
# curl -X POST https://adminuser:adminpassword@prometheus.mydomain.com/-/reload |
После чего проверяем в Prometheus наличие новой цели для мониторинга
Prometheus->Status->Target
4.Импортирование/настройка dashboard Grafana для визуализации метрик
Импортируем дашбоард отсюда
https://grafana.com/grafana/dashboards/7362
Я слегка изменил его под свои задачи
MySQL-dashboard.zip
5.Настрйка правил Prometheus для мониторинга MySQL показателей
Добавляем несколько правил для мониторинга MySQL показателей
1.Запущен ли MySQL (mysql_is_running)
2.Максимального количества одновременных клиентских подключений (mysql_used_connections)
3.Текущего количества активных тредов(соединений, которые выполняются в данный момент, а не находятся в статусе idle(простоя))( mysql_active_threads)
4.Запущена ли репликация (mysql_replication_is_running)
5.Отставание репликации (mysql_replication_lagging)
1 |
# nano prometheus/services_rules.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
groups: - name: mysql rules: - alert: mysql_is_running expr: mysql_up == 0 for: 30s labels: severity: critical annotations: summary: "Critical: MySQL is down on the host {{ $labels.instance }}." description: "MySQL has been down for more than 30 seconds" - alert: mysql_used_connections expr: (mysql_global_status_max_used_connections / mysql_global_variables_max_connections) * 100 > 80 for: 30s labels: severity: warning annotations: summary: "Warning: MySQL connections utilization (>80%) on the host {{ $labels.instance }}" description: "MySQL connections utilization is {{ humanize $value}}%" - alert: mysql_used_connections expr: (mysql_global_status_max_used_connections / mysql_global_variables_max_connections) * 100 > 90 for: 30s labels: severity: critical annotations: summary: "Critical: MySQL connections utilization (>90%) on the host {{ $labels.instance }}" description: "MySQL connections utilization is {{ humanize $value}}%" - alert: mysql_active_threads expr: mysql_global_status_threads_running > 40 for: 60s labels: severity: warning annotations: summary: "Warning: MySQL active threads (>40) on the host {{ $labels.instance }}" description: "MySQL active threads is {{ humanize $value}}" - alert: mysql_active_threads expr: mysql_global_status_threads_running > 100 for: 60s labels: severity: critical annotations: summary: "Critical: MySQL active threads (>100) on the host {{ $labels.instance }}" description: "MySQL active threads is {{ humanize $value}}" - alert: mysql_replication_is_running expr: (mysql_slave_status_slave_io_running !=1) or (mysql_slave_status_slave_sql_running != 1) for: 60s labels: severity: critical annotations: summary: "Critical: MySQL replication is broken on the host {{ $labels.instance }}" description: "MySQL replication is broken" - alert: mysql_replication_lagging expr: mysql_slave_status_seconds_behind_master > 300 for: 60s labels: severity: warning annotations: summary: "Warning: MySQL replication lagging(>300s) on the host {{ $labels.instance }}" description: "MySQL replication lagging is {{ humanize $value}}s" - alert: mysql_replication_lagging expr: mysql_slave_status_seconds_behind_master > 600 for: 60s labels: severity: critical annotations: summary: "Critical: MySQL replication lagging(>600s) on the host {{ $labels.instance }}" description: "MySQL replication lagging is {{ humanize $value}}s" |
Источник:
https://github.com/prometheus/mysqld_exporter
https://grafana.com/grafana/dashboards/7362
https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html