Мониторинг 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!