Zabbix. Мониторинг репликации mysql в zabbix.

Мониторинг будем следующие параметры: Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master

Slave_IO_Running: Yes, Slave_SQL_Running: Yes — говорит о том, что репликация идет успешно, Seconds_Behind_Master время отставания репликации на slave сервере от master сервера

Параметры можно увидеть выполнив в mysql команду show slave status\G

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.10
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.011074
          Read_Master_Log_Pos: 20525970
               Relay_Log_File: mysql-relay-bin.000039
                Relay_Log_Pos: 20158830
        Relay_Master_Log_File: mysql-bin.011074
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: base
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 20525970
              Relay_Log_Space: 20526375
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 3
1 row in set (0.00 sec)

Как видно из вывода, с нашей репликацией все впорядке.

Для мониторинга этих параметров я написал следующий скрипт

#!/bin/bash
usermy=mysqluser
passmy=mysqlpasswd
 
if [ $# -eq 1 ]; then
        if [ $1 == Slave_IO_Running ]; then
                slave_status=$(mysql -u${usermy} -p${passmy} -e'show slave status\G' | awk '$1=="Slave_IO_Running:" {print $2}')
 
                if [ $slave_status == Yes ]; then
                        slave_status=1
                else
                        slave_status=0
                fi
 
        elif [ $1 == Slave_SQL_Running ]; then
                slave_status=$(mysql -u${usermy} -p${passmy} -e'show slave status\G' | awk '$1=="Slave_SQL_Running:" {print $2}')
 
                if [ $slave_status == Yes ]; then
                        slave_status=1
                else
                        slave_status=0
                fi
 
        elif [ $1 == Seconds_Behind_Master ]; then
                slave_status=$(mysql -u${usermy} -p${passmy} -e'show slave status\G' | awk '$1=="Seconds_Behind_Master:" {print $2}')
        fi
 
echo $slave_status
fi

При вызове скрипта с параметром Slave_SQL_Running, он вернет 1 если репликация идет успешно, если нет — 0

mysql_slave_status Slave_SQL_Running
1

При вызове скрипта с параметром Slave_IO_Running, он вернет 1 если репликация идет успешно, если нет — 0

mysql_slave_status Slave_IO_Running
1

При вызове скрипта с параметром Seconds_Behind_Master, он вернет веремя отставания репликации

mysql_slave_status Seconds_Behind_Master
0

переместим скрипт в /usr/local/bin/ (незабываем дать парва на выполнение).

Далее в конфигурационном файле zabbix-agent.conf добавляем пользовательские параметры:

UserParameter=mysql.slave_sql_running,/usr/local/bin/mysql_slave_status Slave_SQL_Running
UserParameter=mysql.slave_io_running,/usr/local/bin/mysql_slave_status Slave_IO_Running
UserParameter=mysql.seconds_behind_master,/usr/local/bin/mysql_slave_status Seconds_Behind_Master

И перезапускаем zabbix-agent

/etc/init.d/zabbix-agent restart

Теперь переходим в web интерфейс zabbix.

Настройка — Узлы сети , выбираем наш сервер, Элементы данных — Создать элемент данных

Для Seconds_Behind_Master

Имя: seconds_behind_master
Тип: Zabbix агент
Ключ: seconds_behind_master
Тип информации: Числовой (целое положительное)
Тип данных: десятичный
Интервал обновления (в сек): 600
Группы элементов данных: Zabbix agent

Для Slave_IO_Running

Имя: slave_io_running
Тип: Zabbix агент
Ключ: mysql.slave_io_running
Тип информации: Числовой (целое положительное)
Тип данных: Логический
Интервал обновления (в сек): 600
Группы элементов данных: Zabbix agent

Для Slave_SQL_Running

Имя: mysql_slave_status
Тип: Zabbix агент
Ключ: mysql.mysql_slave_status
Тип информации: Числовой (целое положительное)
Тип данных: Логический
Интервал обновления (в сек): 600
Группы элементов данных: Zabbix agent

Теперь по прошествии некоторого времени можно посмотреть собираются ли данные
Мониторинг — Последние данные, выбираем наш сервер и в группе элементов Zabbix agent смотрим какие значения отображаются в наших элементах.

last_data

Данные собираются, теперь нужно настроить тригеры для событий, когда Slave_IO_Running, Slave_SQL_Running равны 0, т.е. репликация нарушена и когда Seconds_Behind_Master больше 5 секунд, в этом случае нужно посмотреть почему у нас такое большое отставание по времени.

Настройка — Узлы сети , выбираем наш сервер, Тригеры — Создать тригер

Для Slave_IO_Running

Имя: Slave_IO_Running !=yes Репликация нарушена
Выражение: {Albali:mysql.slave_io_running.last()}=0
Важность: Высокая

Для Slave_SQL_Running

Имя: Slave_SQL_Running !=yes Репликация нарушена
Выражение: {Albali:mysql.slave_sql_running.last()}=0
Важность: Высокая

Для Seconds_Behind_Master

Имя: Репликация mysql запаздывает на {ITEM.LASTVALUE1} сек.
Выражение: {Albali:mysql.seconds_behind_master.last()}>5
Важность: Высокая

Теперь мы можем быть спокойны за репликацию, при при нарушении репликации zabbix уведомит нас об этом.