background
Because the historical data of zabbix is too large, it takes up too much disk space, so it needs to clean up the data and free up space.
1. Check the space occupied by the table
SELECT table_name AS "Tables", round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB" FROM information_schema.TABLES WHERE table_schema = 'zabbix' ORDER BY (data_length + index_length) DESC;
2. Analysis table data
From the larger table above, it mainly focuses on two tables: history unit and history, and stores historical data.
a. view the history uint and history data table structure, and delete the data according to the clock timestamp.
MariaDB [zabbix]> desc history_uint; +--------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+-------+ | itemid | bigint(20) unsigned | NO | MUL | NULL | | | clock | int(11) | NO | | 0 | | | value | bigint(20) unsigned | NO | | 0 | | | ns | int(11) | NO | | 0 | | +--------+---------------------+------+-----+---------+-------+ 4 rows in set (0.26 sec) MariaDB [zabbix]> desc history; +--------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+-------+ | itemid | bigint(20) unsigned | NO | MUL | NULL | | | clock | int(11) | NO | | 0 | | | value | double(16,4) | NO | | 0.0000 | | | ns | int(11) | NO | | 0 | | +--------+---------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) MariaDB [zabbix]>
3. Clean up the table data. It is recommended to stop the zabbix server service.
a. take the time stamp 30 days ago
[root@docker ~]# [root@docker ~]# date +%s -d "Jun 4, 2019 00:00:00" 1559577600 [root@docker ~]#
b. delete data according to time stamp and optimize
delete from history where clock < 1559577600; optimize table history
Чаще всего хватает дефолтных настроек, поэтому какого-то особенного внимания бд я не уделял.
Если вы активно используете zabbix и внедряете его повсеместно во все используемые системы, то вы рано или поздно столкнетесь с вопросом производительности системы мониторинга и размера базы данных zabbix.
Тема производительности zabbix очень индивидуальная. Она напрямую зависит от того, как вы его используете, а схемы мониторинга могут быть очень разные. Одно дело мониторить несколько серверов, а другое дело нагруженные свичи на 48 портов со съемом метрик с каждого порта раз в 30 секунд.
Чтобы помочь вам разобраться в этой теме и прикинуть, к чему готовиться, я поделюсь с вами своим опытом эксплуатации заббикса, его нагрузки, производительности и обслуживания базы данных mysql. Расскажу, как можно уменьшить размер базы.
Под небольшой структурой, упомянутой в начале, я подразумеваю 50-100 узлов (не сетевое оборудование с десятками портов) сети на мониторинге и примерно 2000-4000 активных элементов данных, которые записывают 20-40 новых значений в секунду. Под такую сеть вам будет достаточно небольшой виртуальной машины с 2 ядрами и 4 гб памяти. База данных на преимущественно стандартных шаблонах будет расти примерно на 2-4 Гб в год. Дальше еще меньше, так как будет автоматически очищаться.
Для мониторинга такой сети можно вообще не выполнять никаких дополнительных настроек. Мониторинг будет вполне нормально работать. Если же нагрузка начнет расти, то первое, с чем вы столкнетесь — это с размером и производительностью базы данных. База zabbix будет расти пропорционально подключению к ней хостов. И с этим придется что-то делать.
Для решения вопроса производительности нужно будет двигаться в двух направлениях:
- Очистка базы от ненужных данных.
- Увеличение производительности сервера mysql.
Каждый из указанных вопросов многогранен. Далее мы частично их рассмотрим и выполним наиболее простые, очевидные и результативные изменения.
After zabbix monitoring runs for a period of time, it will leave a lot of historical monitoring data, and the zabbix database has been growing; it may cause system performance degradation, and the query speed of viewing historical data room is slow.
The biggest tables in zabbix are history and history uint, and the time in zabbix is recorded by using the time stamp method, so historical data can be deleted according to the time stamp
Close zabbix and http services
pkill -9 zabbix service httpd stop
Clean up zabbix historical data
View database catalog file
[root@zabbix-server zabbix]# cd /var/lib/mysql/zabbix/ [root@zabbix-server zabbix]# ls -lh | grep G total 177G -rw-r----- 1 mysql mysql 1.7G Dec 24 13:49 events.ibd -rw-r----- 1 mysql mysql 60G Dec 24 13:49 history.ibd -rw-r----- 1 mysql mysql 2.4G Dec 24 13:49 history_str.ibd -rw-r----- 1 mysql mysql 99G Dec 24 13:49 history_uint.ibd -rw-r----- 1 mysql mysql 4.6G Dec 24 13:02 trends.ibd -rw-r----- 1 mysql mysql 9.5G Dec 24 13:49 trends_uint.ibd [root@zabbix-server zabbix]# //Generate Unix timestamps. The time is set as February 1, 2018 (tentative is to save the monitoring data after February 18) [root@zabbix-server zabbix]# date +%s -d "Feb 1, 2018 00:00:00" #An ID will be generated after executing this command 1517414400 #This is the generated ID
[root@zabbix-server zabbix]#mysql -uroot -p zabbix > /root/mysqlback/zabbix.sql #mysqlback directory needs to be created
[root@zabbix-server zabbix]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use zabbix; #Select zabbix database #Execute sql to view the data size before the specified date: SELECT table_schema as `Database`,table_name AS `Table`,round(((data_length + index_length) / 1024 / 1024 / 1024), 2) `Size in MB`FROM information_schema.TABLES where CREATE_TIME < '2018-02-01 00:00:00' and table_name='history.ibd'; #Modify the date and the table name of the query as needed (if the result of the query is 0.0, delete one of the three 1024 in the sql and display it in G)
delete from history where clock < 1517414400; optimize table history; delete from history_uint where clock < 1517414400; optimize table history_uint; delete from trends where clock < 1517414400; optimize table trends; delete from trends_uint where clock < 1517414400; optimize table trends_uint;
Note: the ID in sql is the ID number of Unix timestamp generation, which needs to be changed to the ID number generated by itself
/usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf #zabbix server /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf #zabbix agent service httpd start
Use truncate command to clear all monitoring data of zabbix
------------------------------------------------------- truncate table history; optimize table history; ------------------------------------------------------- truncate table history_str; optimize table history_str; ------------------------------------------------------- truncate table history_uint; optimize table history_uint; ------------------------------------------------------- truncate table trends; optimize table trends; ------------------------------------------------------- truncate table trends_uint; optimize table trends_uint; ------------------------------------------------------- truncate table events; optimize table events; -------------------------------------------------------
Note: these commands will clear all monitoring data of zabbix, and pay attention to backup the database before operation
truncate is to delete the table and then re create it according to the table structure. Delete is to delete the record data without modifying the table
truncate is faster to delete, but it is not as safe as delete in transaction processing. If the table we executed truncat e is processing a transaction, this command exits and generates an error message
Data Base zabbix db
Тут будет различная инфа связная с базой заббикса. На основе MySQL MariaDB innodb
Обычно упираемся в следующие проблемы это :
1. Все стало тормозит пошли ложные срабатывания триггера сервер завис
2. Большие объемы данных нужно их подчистить
3. Потерянные данные нужно убрать
Больше нагрузка падает на оперативную память и на диск.
Сперва рассмотрим структуру базы, далее варианты ее очистки, поиска потерянных данных и тд.
То что сопоставил я к таблице
Связи означает что таблица сделана для связи других таблиц между собой ключами.
Если не хватает оперативки и быстрые диски можно временно использовать файл подкачки SWAP если его нет
Если не хватает оперативы на какое то время поможет swap, но он работает медленнее и быстрее изнашивает диск.
Для начала, нужно убедиться, что своп ещё не подключен:
swapon -s
Если команда выдала пустой результат или что-то навроде:
Результат:
Filename Type Size Used Priority
— значит, своп, скорее всего отсутствует.
Если в таблице в строке swap стоит 0, значит своп отсутствует
Быстрый способ
Используем fallocate:
fallocate -l 4G /swapfile
Результатом будет пустая строка, это нормально.
В отличие от dd, результат будет получен почти сразу, и я рекомендую именно его
Традиционный, медленный способ
команда
dd if=/dev/sda1 of=/swapfile bs=1G count=6
Синтаксис команды простой:
dd — команда предназначена для того, чтобы что-то куда-то копировать побайтово;
if=/dev/zero — указывает на источник, т.е. на то, откуда копируем, в данном случае из /dev/zero — это специальный файл в UNIX-подобных системах, представляющий собой источник нулевых байтов;
of=/swapfile — указывает путь назначения, куда копируем данные;
bs=1G — количество байт, которые будут записаны за раз. В нашем случае, 1 гигабайт. Обозначения: G — гигабайт, M — мегабайт, K — килобайт, и так далее;
count=4 — сколько блоков размером с bs будет создано, в нашем случае 4.
ошибиться с определением пути для of= (куда сохранять файл), можно повредить данные на диске
Теперь, когда файл создан, проверим результат:
ls -lh /swapfile
Ответ
-rw-r—r— 1 root root 6,0G мар 12 14:42 /swapfile
ограничим права доступа
chmod 600 /swapfile
ls -lh /swapfile
ответ
-rw——- 1 root root 6,0G мар 12 14:42 /swapfile
Теперь нужно сделать из swapfile файл подкачки:
mkswap /swapfile
Ответ
mkswap: /swapfile: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 6291452 KiB
без метки, UUID=9950de08-0d80-4440-93c8-dbcd8c1b31bf
Подключим его к системе:
swapon /swapfile
Проверка
swapon -s
Ответ
Filename Type Size Used Priority
/swapfile file 6291452 0 -1
Как очистить SWAP в Linux
Вообще, это делается с помощью отключения и включения свопа.
swapoff -a && sleep 3 && swapon -a
не рекомендую прибегать к этому способу, так как swap просто очищается,
а не переносится в ОЗУ, и, в случае наличия данных системных процессов, система может стать недоступна.
Удаление файла подкачки
Чтобы деактивировать и удалить файл подкачки, выполните следующие действия:
Сначала отключите пространство подкачки, набрав:
swapoff -v /swapfile
Затем удалите запись файла подкачки /swapfile swap swap defaults 0 0 из файла /etc/fstab.
Наконец, удалите фактический файл подкачки:
rm /swapfile
Запуск вручную Очистки истории Заббикс
zabbix_server -R housekeeper_execute
или
zabbix_server -c /usr/local/etc/zabbix_server.conf -R housekeeper_execute
Пример свернутых таблиц выстроенных по алфавиту для версии 4.2
Сохранённая страница как zabbixbdA-Z это id 1
— Дамп данных таблицы `pma__table_coords`
—
— Дамп данных таблицы `pma__table_coords`
—
Схему связи можно просмотреть скачав исходный архив zabbix_4.2.8.orig.tar.gz
Смотрим zabbix_4.2.8.orig.tar\zabbix_4.2.8.orig\zabbix-4.2.8\database\mysql\schema.sql
Очистка и уменьшение mysql базы zabbix
Начнем с очистки базы данных zabbix от ненужных данных. Рассмотрим по пунктам в той последовательности, в которой это нужно делать.
- Первым делом надо внимательно просмотреть все используемые шаблоны и отключить там все, что вам не нужно. Например, если вам не нужен мониторинг сетевых соединений windows, обязательно отключите автообнаружение сетевых интерфейсов. Оно само по себе находит десятки виртуальных соединений, которые возвращают нули при опросе и не представляют никакой ценности. Тем не менее, все эти данные собираются и хранятся, создавая лишнюю нагрузку. Если же вам нужен мониторинг сети в windows, зайдите в каждый хост и отключите руками лишние адаптеры, которые будут найдены. Этим вы существенно уменьшите нагрузку. По моему опыту, в стандартных шаблонах windows мониторинг всех сетевых интерфейсов дает примерно 2/3 всей нагрузки этих шаблонов.
- Отредактируйте в используемых стандартных шаблонах время опроса и хранения данных. Возможно вам не нужна та частота опроса и время хранения, которые заданы. Там достаточно большие интервалы хранения. Чаще всего их можно уменьшить. В целом, не забывайте в своих шаблонах ставить адекватные реальной необходимости параметры. Не нужно хранить годами информацию, которая теряет актуальность уже через неделю.
- После отключения лишних элементов в шаблонах, нужно очистить базу данных от значений неактивных итемов. По-умолчанию, они там остаются. Можно их очистить через web интерфейс, но это плохая идея, так как неудобно и очень долго. Чаще всего попытки очистить 50-100 элементов за раз будут сопровождаться ошибками таймаута или зависанием web интерфейса. Далее расскажу, как это сделать эффективнее.
Данными запросами можно прикинуть, сколько данных будет очищено:
Если запросы нормально отрабатывают и возвращают счетчик данных, которые будут удалены, дальше можете их удалять из базы следующими sql запросами.
Данными запросами вы очистите базу данных zabbix от значений неактивных элементов данных. Но реально размер базы данных у вас не уменьшится, потому что в дефолтной настройке базы данных используется формат innodb. Все данные хранятся в файле ibdata1, который автоматически не очищается после удаления данных из базы.
Администрировать такую базу неудобно. Нужно как минимум настроить хранение каждой таблицы в отдельном файле. Этим мы далее и займемся, а заодно обновим сервер базы данных до свежей версии mariadb и реально очистим базу, уменьшив ее размер.
Обновление и настройка сервера mysql
В данном примере я использую сервер CentOS 7. Из стандартных репозиториев устанавливается достаточно старая версия MariaDB 5.5. Для начала обновим ее до последней стабильной на момент написания статьи версии 10.2. Перед этим сделаем полный бэкап базы данных zabbix, предварительно остановив сервер.
Теперь удалим с сервера mysql все базы данных, кроме системных.
# mysql -uroot -ppassword
Удаляем старые файлы базы zabbix.
Начинаем обновлять сервер. Добавляем репозиторий MariaDB в систему. Для этого создаем файл /etc/yum.repos.d/mariadb.repo следующего содержания:
Далее предлагаю свой вариант конфига для mysql сервера. Положите его в директорию /etc/my.cnf.d.
# cat /etc/my.cnf.d/zabbix.cnf
Сразу предупреждаю, что универсальных настроек для mariadb не существует. Я не большой специалист по тонкой настройке mysql и детально не вникал в оптимизацию работы с zabbix. И тем более не тестировал производительность с разными параметрами. Данный пример это набор рекомендаций, полученных из разных источников. Я сам использую этот конфиг и каких-то нареканий к нему у меня нет, поэтому делюсь с вами. Возможно, тут есть что-то, что совершенно не подходит и надо поменять. Если вы увидите такое, прошу поделиться информацией.
Будет вообще здорово, если кто-то предложит свой более оптимальный конфиг для zabbix. Хотя я понимаю, что настройки будут сильно зависеть от параметров сервера (память и cpu в основном). Их нужно подбирать в каждом конкретном случае. В ситуации со стандартной установкой zabbix, когда проблем с производительностью нет, мне не хочется этим заниматься.
Запускаем сервер mariadb.
Если сервер не стартует, а в логе /var/log/messages ошибка:
И снова запускайте mariadb. Проверить статус запуска можно командой:
# systemctl status mariadb
Сервер запустился. Есть пару замечаний, мы их позже исправим. Теперь восстанавливаем базу данных zabbix из выгрузки.
Запускаем утилиту mysql_upgrade для генерации новой базы performance_schema.
Запускаем сервер zabbix.
Проверяем работу. По идее, все должно быть в порядке. Теперь база данных zabbix хранится в директории /var/lib/mysql/zabbix. Она уменьшилась в размере, и каждая таблица хранится в отдельном файле.