Оптимизация Zabbix

Примеры из жизни как развернуть и настроить систему мониторинга zabbix
Ответить
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Оптимизация Zabbix

Сообщение RomA »

Вступление:
Вот и наступило время, когда мой сервер системы мониторинга начал тормозить. Со временем тормоза достигли таких пределов, что мириться с этим больше не хотелось и был предпринят рад изменений, которые и будут описаны в этой теме.

Диагностика:
для диагностики была установлена утилитка atop (/usr/ports/sysutils/atop) которая диагностировала полную занятость жёского диска (atop -d). Она же и показала что грузит жёский исключительно MySQL - значит с него и начнём оптимизацию. Беглый осмотр БД выявил огромный файл, который постоянно растёт

Код: Выделить всё

stat# ls -l /var/db/mysql/
total 41388142
drwx------  2 mysql  mysql         1024 Aug 18  2010 atslog
-rw-rw----  1 mysql  mysql      5242880 Feb 11 10:01 ib_logfile0
-rw-rw----  1 mysql  mysql      5242880 Feb 11 10:01 ib_logfile1
-rw-rw----  1 mysql  mysql  42331013120 Feb 11 10:01 ibdata1
-rw-r--r--  1 root   mysql          785 Feb 11 09:50 my.cnf
drwx------  2 mysql  mysql         2048 Jul 28  2010 mysql
drwx------  2 mysql  mysql         1536 Feb 11 10:01 zabbix
stat#


Внимание:
1) Софт - OS FreeBSD 9.0, MySQL 5.1
2) Железо - ASUS RS120 8Гигов памяти
3) Имейти в виду что это может затронуть другие базы - в частности мне пришлось так же выгрузить и загрузить базу ocs-inventory, так как она тоже частично использовала InnoDB тип базы данных
4) Делайти скидку на то, что у вас сервер будет слабее, как и нагрузка, создаваемая zabbix

Решение:
Первым делом оставновим zabbix, дабы не мешался

Код: Выделить всё

stat# /usr/local/etc/rc.d/zabbix_server stop
Stopping zabbix_server.
Waiting for PIDS: 1513 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1786.
stat# /usr/local/etc/rc.d/zabbix_agentd stop
Stopping zabbix_agentd.
Waiting for PIDS: 1521 1552 1553 1554 1555 1556.
Теперь выгрузим дамп БД забикса (я спать ушёл - это очень долго в моём случае) - обратите внимание что тут вы должны логин и пароль подставить к БД свои

Код: Выделить всё

stat# mysqldump -u root -ppassword  zabbix > zabbix.sql
Дальше удаляем БД zabbix

Код: Выделить всё

stat# mysql -u root -ppassword 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4805
Server version: 5.1.58 FreeBSD port: mysql-server-5.1.58

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> drop database zabbix;
Query OK, 88 rows affected (5.55 sec)

mysql> exit
Bye

Теперь начинаем тюнинг MySQL
Добавляем в конфиг MySQL (/var/db/mysql/my.cnf) в секцию [mysqld] следующее:

Код: Выделить всё

innodb_thread_concurrency       = 8
innodb_buffer_pool_size         = 4096M
innodb_additional_mem_pool_size = 24M
innodb_data_home_dir            = /var/db/mysql/inno
innodb_log_group_home_dir       = /var/db/mysql/inno
innodb_data_file_path           = ibdata1:2000M;ibdata2:10M;ibdata3:10000M:autoextend
innodb_flush_method             = O_DIRECT
innodb_log_file_size            = 256M
innodb_log_buffer_size          = 8M
innodb_log_files_in_group       = 2
innodb_flush_log_at_trx_commit  = 2
innodb_max_dirty_pages_pct      = 90
innodb_lock_wait_timeout        = 120
innodb_file_per_table
Как вижно мы переназначили логи и базу в новую директорию (по умолчанию они лежали в корне, то есть /var/db/mysql), поэтому нам надо создать эту директорию

Код: Выделить всё

mkdir /var/db/mysql/inno
chown mysql:mysql /var/db/mysql/inno
Ну а старые файлики можно удалить

Код: Выделить всё

rm /var/db/mysql/ibdata1
Дальше я перезапустил MySQL

Код: Выделить всё

stat# /usr/local/etc/rc.d/mysql-server stop
Stopping mysql.
Waiting for PIDS: 1504.
stat# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
Создадим БД zabbix

Код: Выделить всё

stat# mysql -u root -ppassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.58 FreeBSD port: mysql-server-5.1.58

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database zabbix;
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye

Теперь надо вернуть наши данные на место (у меня это заняло 3е суток)

Код: Выделить всё

cat zabbix.sql | mysql -u root -ppassword zabbix
После того как всё загрузилось не место - запускаем пока zabbix и смотрим как оно стало работать - в моём случае изменения были видны "на глаз" - zabbix стал летать

Литература:
1) http://www.realcoding.net/article/view/4752
2) http://www.zabbix.com/forum/showthread.php?t=19215
3) http://bolknote.ru/2007/11/09/~1466#09
4) http://www.proggear.ru/276-оптимизация- ... нимум-2-г/
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Сегментирование - или почему тормозит zabbix

Сообщение RomA »

Введение:
С ндавнего времени начал замечать что у меня в заббикс нет некоторых данных - точнее есть пробелы в данных. Проверил - zabbix параметры успешно снимает, а вот в БД они попадают совсем не всегда. Обратился к БД и увидел вот такую картину:
z2.jpg
z2.jpg (68.42 КБ) 9284 просмотра
Очередь данных на запись в БД
z1.jpg
z1.jpg (152.96 КБ) 9284 просмотра
Ага, значит данные просто н пападают в БД - не успевают туда записываться вовремя, или вообще - вот и срабатывают тригеры и появляются пробелы... Значит затык следет искать в БД... давайте гляним статистику:
stat# mysqladmin -uroot -p status
Enter password:
Uptime: 95470 Threads: 121 Questions: 36408118 Slow queries: 3917 Opens: 222 Flush tables: 1 Open tables: 215 Queries per second avg: 381.356
stat#
Поиск виноватых:
Всегда есть виновные... откуда же столько операций в секунду? Смотрим:
stat# mysqladmin -uroot -p processlist | grep Query
Enter password:
| 58 | root | localhost | zabbix | Query | 409 | updating | delete from history_uint where itemid=100100000029776 and clock<1354685859 |
| 85 | root | localhost | zabbix | Query | 28 | updating | delete from node_cksum where nodeid=7 and cksumtype=1 |
| 88 | root | localhost | zabbix | Query | 0 | statistics | select num,value_min,value_avg,value_max from trends_uint where itemid=800800000022866 and clock=136 |
| 122 | root | localhost | zabbix | Query | 7 | update | insert into history_str (itemid,clock,value) values (1201200000024505,1363800685,'Ethernet Interface |
| 2662 | root | localhost | zabbix | Query | 634 | Sending data | SELECT max(e.eventid) as eventid, e.objectid FROM events e WHERE e.object=0 AND (e.objectid IN (10 |
| 2682 | root | localhost | | Query | 0 | | show processlist |
stat#
Вот они - первая строка. Прошел год с первой моей оптимизации и начали удаляться прошлогоднии данные - ведь почти везед хранение данных стояло 365 дней.
В конфиге zabbix-server за это отвечают следующие переменные
### Option: HousekeepingFrequency
#<----->How often Zabbix will perform housekeeping procedure (in hours).
#<----->Housekeeping is removing unnecessary information from history, alert, and alarms tables.
#<----->If PostgreSQL is used, suggested value is 24, as it performs VACUUM.
#
# Mandatory: no
# Range: 1-24
# Default:
HousekeepingFrequency=24

### Option: MaxHousekeeperDelete
#<----->The table "housekeeper" contains "tasks" for housekeeping procedure in the format:
#<----->[housekeeperid],[tablename], [field], [value].
#<----->No more than 'MaxHousekeeperDelete' rows (corresponding to [tablename], [field], [value])
#<----->will be deleted per one task in one housekeeping cycle.
#<----->SQLite3 does not use this parameter, deletes all corresponding rows without a limit.
#<----->If set to 0 then no limit is used at all. In this case you must know what you are doing!
#
# Mandatory: no
# Range: 0-1048576
# Default:
# MaxHousekeeperDelete=500

### Option: DisableHousekeeping
#<----->If set to 1, disables housekeeping.
#
# Mandatory: no
# Range: 0-1
# Default:
# DisableHousekeeping=0
проведем следственный эксперемент - закоментируем очистку старых данных

Код: Выделить всё

DisableHousekeeping=1
и перезапустим zabbix. Дадим пару часов ему устаканиться и посмотрим стратистику:

Код: Выделить всё

stat# mysqladmin -uroot -p processlist | grep Query
Enter password: 
| 3057 | root | localhost | zabbix | Query   | 0    | statistics           | select num,value_min,value_avg,value_max from trends_uint where itemid=2002000000022714 and clock=13 |
| 3117 | root | localhost | zabbix | Query   | 3    | update               | insert into history_uint (itemid,clock,value) values (1501500000022624,1363814884,2234947),(15015000 |
| 3126 | root | localhost | zabbix | Query   | 6    | update               | insert into history_str (itemid,clock,value) values (1401400000022544,1363893144,'Ethernet Interface |
| 3131 | root | localhost | zabbix | Query   | 3    | update               | insert into history_str (itemid,clock,value) values (1901900000022905,1363511105,'Ethernet Interface |
| 3133 | root | localhost | zabbix | Query   | 1    | update               | insert into history_str (itemid,clock,value) values (800800000023209,1363845389,'2886846300'),(80080 |
| 3264 | root | localhost | zabbix | Query   | 0    | Copying to tmp table | SELECT i.itemid,i.lastclock,i.description,i.key_,i.type,h.host,h.hostid,h.proxy_hostid,i.delay,i.del |
| 3265 | root | localhost |        | Query   | 0    |                      | show processlist                                                                                     |
stat# 
Наших долгих запросов нет - значит это оно. Так же мы выдим другие долгие запроссы к таблице истории - значит очередной оптимизации все же не избежать...

Поиск пути:
Перепробовал много способов - оптимизировал БД, пробовал уходить на слоника и даже покупал ssd, но скорости это все не добавляло - база слишком большая и на ее работу реально нужно время. В этом утверждении и содержится подсказка - надо просто уменьшить базу. Ну или некоторые ее части. И как это сделать оень хорошо описано на официальном сайте https://www.zabbix.com/wiki/doku.php?id ... g_in_mysql - этим то мы и займемся, но сначало (делать так делать) мне надо перейти на zabbix2 (ну что бы потом не было мучительно больно) :-)

Реализация:
Ответить