Go to content Go to menu Go to search

Мониторинг Mysql в Zabbix

Постановка задачи

В zabbix из коробки есть поддержка мониторинга Mysql, но есть проблема – для мониторинга mysql заббикс должен знать пароль к mysql.

Использование стандартного шаблона

1). Создать пользователя zabbix в mysql на хосте

GRANT USAGE,SELECT ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY '<PASSWORD>';

2). Дать понять zabbix серверу какой логин-пароль к mysql для мониторинга

для этого есть два варианта:

a) создать файл /var/lib/zabbix/.my.cnf на хосте, который мониторим:

[mysql]  
user=zabbix  
password=<password>

[mysqladmin]  
user=zabbix  
password=<password>  
host=localhost

b) добавить значения на вкладке “макросы” в конфиге хоста в zabbix

`{$MYSQL_USER} -> zabbix {$MYSQL_PASS} ->

3). Добавить пользовательские параметры (UserParameter)

# For all the following commands HOME should be set to the directory that has .my.cnf file with password information.

# Flexible parameter to grab global variables. On the frontend side, use keys like mysql.status[Com_insert].
# Key syntax is mysql.status[variable].
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -N | awk '{print $$2}'

# Flexible parameter to determine database or table size. On the frontend side, use keys like mysql.size[zabbix,history,data].
# Key syntax is mysql.size[<database>,<table>,<type>].
# Database may be a database name or "all". Default is "all".
# Table may be a table name or "all". Default is "all".
# Type may be "data", "index", "free" or "both". Both is a sum of data and index. Default is "both".
# Database is mandatory if a table is specified. Type may be specified always.
# Returns value in bytes.
# 'sum' on data_length or index_length alone needed when we are getting this information for whole database instead of a single table
UserParameter=mysql.size[*],echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema='$1'")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name='$2'");" | HOME=/var/lib/zabbix mysql -N

UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V

4). Подключить к хосту шаблон Template App MySQL

Расширенный шаблон

Ниже приведен расширенный шаблон для zabbix собственного сочинения. Чрез обнаружение zabbix находит все базы и таблицы и собирает следующие показатели:
1). Общий размер базы
2). Размер каждой таблицы
3). Количество строк в каждой таблице

Количество строк берется из таблицы information_chema.tables, для innodb этот показатель является ориентировочным (согласно документации отклонение от факта может составлять до 50%, при этом сильно разнится при каждом запросе), по этому сделан вычисляемый показатель rows_average, которые показывает среднее значение за последний час.

Итак, создаем два скрипта в /etc/zabbix/scripts :

/etc/zabbix/scripts/mysql.databases.discovery

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/perl
use strict;

my $EXCLUDES='performance_schema|mysql|sys|information_schema';

my @databases;
my @tables;
my @databases = `echo "show databases" | /usr/bin/mysql --skip-column-names | egrep -v "$EXCLUDES" 2>&1`;
chomp @databases;

print '{"data":[';
my $i=0;
foreach my $database (@databases) {
    print "," if $i > 0;
    print '{"{#DBNAME}":"';
    print $database;
    print '"}';
    $i++;
}
print ']}';
print "\n";

/etc/zabbix/scripts/mysql.tables.discovery

 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
#! /usr/bin/perl
use strict;

my $EXCLUDES='performance_schema|mysql|sys|information_schema';

my @databases;
my @tables;
my @databases = `echo "show databases" | mysql --skip-column-names | egrep -v "$EXCLUDES"`;
chomp @databases;

print '{"data":[';
my $i=0;
foreach my $database (@databases) {
    @tables = `echo "show tables" | mysql --skip-column-names $database`;
    chomp @tables;
    foreach my $table (@tables) {
        print "," if $i > 0;
        print '{"{#TABLENAME}":"';
        print "$database.$table";
        print '"}';
        $i++;
    }
}
print ']}';
print "\n";

Файл с пользовательскими параметрами /etc/zabbix/zabbix_agentd.d/userparameter_mysql_extras.conf:

# discovery rules
UserParameter=mysql.databases.discovery, export HOME=/var/lib/zabbix; /etc/zabbix/scripts/mysql.databases.discovery
UserParameter=mysql.tables.discovery, export HOME=/var/lib/zabbix; /etc/zabbix/scripts/mysql.tables.discovery

# Get database size
UserParameter=mysql.dbsize[*],export HOME=/var/lib/zabbix; echo 'SELECT SUM( data_length + index_length ) AS "size" FROM information_schema.TABLES WHERE table_schema = "$1" LIMIT 1;' | /usr/bin/mysql -N

# Get table size
UserParameter=mysql.table_size[*],export HOME=/var/lib/zabbix; db=`echo $1 | awk -F. '{print $$1}'`; table=`echo $1 | awk -F. '{print $$2}'`; echo "SELECT (data_length+index_length) FROM information_schema.TABLES WHERE table_schema = '$db' AND table_name = '$table';" | mysql -N

# Get rows count in table
UserParameter=mysql.table_rows[*],export HOME=/var/lib/zabbix; db=`echo $1 | awk -F. '{print $$1}'`; table=`echo $1 | awk -F. '{print $$2}'`; echo "SELECT TABLE_ROWS FROM information_schema.TABLES WHERE table_schema = '$db' AND table_name = '$table';" | mysql -N

Шаблон (zabbix 3.x): Template_MySQL_Extras.xml.zip

Enjoy!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved