Написать в техподдержку Позвонить нам
Админпанель Выход

Содержание статьи:

    Мониторинг баз данных: MySQL Exporter

    Конфигурация оборудования

    Чтобы выполнить данный сценарий мониторинга, установите и настройте серверы c использованием следующего оборудования: 

    • Prometheus 2.13 на ОС Ubuntu 18.04 LTS x86_64.
    • Grafana 6.4.2 на ОС Ubuntu 18.04 LTS x86_64.
    • PostgreSQL 10 на ОС Ubuntu 18.04 LTS x86_64.

    Внимание

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


    Схема работы

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

    Установка mysqld_exporter

    1. Выполните логин на сервере MySQL c правами суперпользователя.

    2. Укажите актуальную версию экспортера:

    root@mysql:~# export VERSION="<версия>"

    Примечание

    Актуальную версию mysqld_exporter можно найти и скачать тут.

    1. Создайте пользователя prometheus и группу prometheus, от имени которых вы будете запускать mysqld_exporter:

    root@mysql:~# groupadd --system prometheus
    root@mysql:~# useradd --system -g prometheus -s /bin/false prometheus
    1. Скачайте архив mysqld_exporter и распакуйте его в папку /tmp:
    root@mysql:~# wget https://github.com/prometheus/mysqld_exporter/releases/download/v$VERSION/mysqld_exporter-$VERSION.linux-amd64.tar.gz -O - | tar -xzv -C /tmp
    1. Скопируйте содержимое распакованного архива в папку /usr/local/bin:
      root@mysql:~# cp /tmp/mysqld_exporter-$VERSION.linux-amd64/mysqld_exporter /usr/local/bin
    2. Удалите содержимое распакованного архива из папки /tmp:
      root@mysql:~# rm -rf /tmp/mysqld_exporter-$VERSION.linux-amd64
    3. Измените владельца mysqld_exporter на prometheus:
    root@mysql:~# chown -R prometheus:prometheus /usr/local/bin/mysqld_exporter
    1. Для работы mysqld_exporter создайте пользователя mysql и дайте ему соответствующие права:
    MariaDB [(none)]> CREATE USER 'exporter'@'localhost' IDENTIFIED BY '<пароль>' WITH MAX_USER_CONNECTIONS 3;
    Query OK, 0 rows affected (0.001 sec)
    
    MariaDB [(none)]> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
    Query OK, 0 rows affected (0.000 sec)

    Внимание

    Параметр WITH MAX_USER_CONNECTIONS 3 не поддерживается некоторыми версиями сервера MySQL. Если при создании пользователя вы получили ошибку, уберите этот параметр и выполните команду еще раз.

    1. Создайте файл, содержащий правила доступа к mysqld_exporter:

    root@mysql:~# cat <<EOF>>/usr/local/etc/.mysqld_exporter.cnf
    EOF
    root@mysql:~# chown prometheus:prometheus /usr/local/etc/.mysqld_exporter.cnf
    1. Создайте сценарий запуска systemd сервиса mysqld_exporter. Для этого создайте файл /etc/systemd/system/mysqld_exporter.service со следующим содержимым:

    [Unit]
    Description=Prometheus MySQL Exporter
    After=network.target
    
    [Service]
    Type=simple
    Restart=always
    User=prometheus
    Group=prometheus
    ExecStart=/usr/local/bin/mysqld_exporter \
    --config.my-cnf /usr/local/etc/.mysqld_exporter.cnf \
    --collect.global_status \
    --collect.info_schema.innodb_metrics \
    --collect.auto_increment.columns \
    --collect.info_schema.processlist \
    --collect.binlog_size \
    --collect.info_schema.tablestats \
    --collect.global_variables \
    --collect.info_schema.query_response_time \
    --collect.info_schema.userstats \
    --collect.info_schema.tables \
    --collect.perf_schema.tablelocks \
    --collect.perf_schema.file_events \
    --collect.perf_schema.eventswaits \
    --collect.perf_schema.indexiowaits \
    --collect.perf_schema.tableiowaits \
    --collect.slave_status \
    --web.listen-address=0.0.0.0:9104
    
    [Install]
    WantedBy=multi-user.target

    Примечания

    • Параметры, начинающиеся с collect, отвечают за метрики, которые будут собираться с сервера MySQL. Подробное описание собираемых метрик см. тут.
    • В параметре web.listen-address указываются адрес и порт, по которым будет доступен mysqld_exporter (0.0.0.0 означает любой адрес на сервере). Эти адрес и порт должны быть доступны с сервера Prometheus. Если порт недоступен, попробуйте изменить настройки межсетевого экрана на сервере с mysqld_exporter.
    1. Запустите mysqld_exporter:

    root@mysql:~# systemctl daemon-reload
    root@mysql:~# systemctl start mysqld_exporter.service
    root@mysql:~# systemctl enable mysqld_exporter.service
    Created symlink /etc/systemd/system/multi-user.target.wants/mysqld_exporter.service → /etc/systemd/system/mysqld_exporter.service.
    1. Убедитесь, что сервис запустился:

    root@mysql:~# systemctl status mysqld_exporter.service
    ● mysqld_exporter.service - Prometheus MySQL Exporter
    Loaded: loaded (/etc/systemd/system/mysqld_exporter.service; enabled; vendor preset: enabled)
    Active: active (running) since Tue 2019-10-01 10:26:30 MSK; 40s ago
    Main PID: 24617 (mysqld_exporter)
    Tasks: 4 (limit: 2359)
    Memory: 6.4M
    CGroup: /system.slice/mysqld_exporter.service
    └─24617 /usr/local/bin/mysqld_exporter/mysqld_exporter --config.my-cnf /usr/local/etc/.mysqld_exporter.cnf --collect.global_status --collect.info_schema.innodb_metrics --collect.auto_increment.columns --collect.info_schema.processlist --collect.binlog_size --colle
    
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.perf_schema.tableiowaits" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.perf_schema.indexiowaits" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.perf_schema.tablelocks" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.info_schema.tablestats" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.perf_schema.file_events" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.info_schema.userstats" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.info_schema.innodb_cmp" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.info_schema.innodb_cmpmem" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg=" --collect.info_schema.query_response_time" source="mysqld_exporter.go:273"
    Oct 01 10:26:30 mysql mysqld_exporter[24617]: time="2019-10-01T10:26:30+03:00" level=info msg="Listening on 0.0.0.0:9104" source="mysqld_exporter.go:283"

    Настройка Prometheus для получения данных mysqld_exporter

    1. На ноде Prometheus выполните логин.
    2. В файле prometheus.yml для работы с mysqld_exporter:
      • В scrape_configs добавьте следующую секцию:
    scrape_configs:
      - job_name: mysql
        static_configs:
          - targets: ['10.0.0.4:9104']
            labels:
              alias: mysql
    
    • В секции targets впишите IP-адрес сервера mysql_exporter.
    1. Перезапустите сервиc Prometheus:
    root@prometheus:~# systemctl reload prometheus.service
    

    Настройка Grafana

    Для визуализации полученных данных установите соответствующий Dashboard (например, базовый Dashboard или Dashboard Percona).

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

    И примерно следующее при использовании Dashboard Percona:


    Создание тестовой нагрузки

    Чтобы посмотреть, как изменятся графики при нагрузке на сервер MySQL, воспользуйтесь утилитой sysbench (примеры использования см. тут и тут). 

    Для этого:

    1. Установите утилиту sysbench:
    root@mysql:~# apt-get install sysbench
    1. На ноде MySQL запустите генерацию тестового набора :
    root@mysql:~# sysbench oltp_read_only --mysql-db=test --mysql-user=root --mysql-password --db-driver=mysql prepare
    sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)
    Creating table 'sbtest1'...
    Inserting 10000 records into 'sbtest1'
    Creating a secondary index on 'sbtest1'...
    1. Запустите тест:
      root@mysql:~# sysbench oltp_read_only --mysql-db=test --mysql-user=root --mysql-password --db-driver=mysql run
      sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)
      
      Running the test with following options:
      Number of threads: 1
      Initializing random number generator from current time
      
      Initializing worker threads...
      
      Threads started!
      
      SQL statistics:
      queries performed:
      read: 109340
      write: 0
      other: 15620
      total: 124960
      transactions: 7810 (780.72 per sec.)
      queries: 124960 (12491.51 per sec.)
      ignored errors: 0 (0.00 per sec.)
      reconnects: 0 (0.00 per sec.)
      
      General statistics:
      total time: 10.0007s
      total number of events: 7810
      
      Latency (ms):
      min: 0.59
      avg: 1.28
      max: 10.28
      95th percentile: 2.26
      sum: 9979.28
      
      Threads fairness:
      events (avg/stddev): 7810.0000/0.00
          execution time (avg/stddev):   9.9793/0.00


    В результате тестовой нагрузки графики в Grafana изменяться:

    Удаление mysql_exporter

    Чтобы удалить mysqld_exporter:

    1. Удалите Dashboard из Grafana.

    2. Из конфигурационного файла prometheus удалите секцию - job_name: mysql.

    3. На ноде с mysqld_exporter выполните следующие команды:

    root@mysql:~# systemctl stop mysqld_exporter.service
    root@mysql:~# systemctl disable mysqld_exporter.service
    Removed /etc/systemd/system/multi-user.target.wants/mysqld_exporter.service.
    root@mysql:~# rm /etc/systemd/system/mysqld_exporter.service
    root@mysql:~# systemctl daemon-reload
    root@mysql:~# rm -f /usr/local/bin/mysqld_exporter /usr/local/etc/.mysqld_exporter.cnf
    root@mysql:~# userdel prometheus
    root@mysql:~# groupdel prometheus
    1. На ноде mysql в консоли mysql удалите пользователя:

    MariaDB [(none)]> drop user 'exporter'@'localhost';
    Query OK, 0 rows affected (0.020 sec)
    
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.007 sec)

    Обратная связь

    Возникли проблемы или остались вопросы? Напишите нам, мы будем рады вам помочь.

    Полезна ли была эта статья?