Zabbix очистка старых записей. Houskeeping
От Zabbix-а начали приходить уведомления о том, что заканчивается место на ноде где он работает. После проверки оказалось, что 80% места уже израсходавно..
1 2 3 4 5 |
[root@zabbix tmp]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 38G 29G 7,0G 81% / |
Посмотрел что именно занимает место, оказалось history таблица zabbix-a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cd /var/lib/mysql/zabbix # ls -Slah | head total 27G -rw-r-----. 1 mysql mysql 17G Nov 4 11:03 history.ibd -rw-r-----. 1 mysql mysql 9,6G Nov 4 11:08 history_uint.ibd -rw-r-----. 1 mysql mysql 452M Nov 4 11:03 trends.ibd -rw-r-----. 1 mysql mysql 316M Nov 4 11:03 trends_uint.ibd -rw-r-----. 1 mysql mysql 136M Nov 4 11:03 history_text.ibd -rw-r-----. 1 mysql mysql 36M Nov 4 11:03 history_str.ibd -rw-r-----. 1 mysql mysql 17M Aug 22 19:19 items.ibd -rw-r-----. 1 mysql mysql 11M Nov 4 11:03 alerts.ibd -rw-rw----. 1 mysql mysql 10M Nov 4 11:03 auditlog.ibd |
Начал разбираться с HousKeeper-ом. Для начала включил его в конфиге
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# nano /etc/zabbix/zabbix_server.conf ... ### Option: HousekeepingFrequency # Housekeeping is removing outdated information from the database. # To prevent Housekeeper from being overloaded, no more than 4 times HousekeepingFrequency # With HousekeepingFrequency=0 the housekeeper can be only executed using the runtime control option. HousekeepingFrequency=1 ... ### Option: MaxHousekeeperDelete # No more than 'MaxHousekeeperDelete' rows (corresponding to [tablename], [field], [value]) MaxHousekeeperDelete=15000 |
Далее уменьшил время храенния логов до 90 дней в настройка панели управления
- Zabbix > Administration > General > Housekeeping
- Events and alerts > Trigger data storage period = 90d
- Services > Data storage period = 90d
- User sessions > Data storage period = 90d
- History > Data storage period = 90d
- Trends > Data storage period = 90d
- Zabbix > Administration > General > Audit log
- Data storage period = 90d
Перезапустил zabbix и на всякий случай тригернул запуск housekeeper-а вручную
1 2 3 |
# systemctl restart zabbix-server |
после перезапуска, процесс houskeeper-а будет находиться в idle статусу, поэтому имеет смысл запустить его вручную
1 2 3 |
# zabbix_server -c /etc/zabbix/zabbix_server.conf -R housekeeper_execute |
В логах увидел что housekeeper запущен
1 2 3 4 5 6 |
# tail -n 100 /var/log/zabbix/zabbix_server.log 2427692:20231104:110336.878 forced execution of the housekeeper 2427692:20231104:110336.879 executing housekeeper |
далее запустилд htop и увидел что процесс запущен и работает
заглянул что именно он делает через утилиту strace
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# strace -s100 -p2427692 recvfrom(9, "\7\0\0\1\0\0\0\"\0\207\3", 16384, MSG_DONTWAIT, NULL, NULL) = 11 sendto(9, "Q\0\0\0\3select auditid from auditlog where clock<1634396803 order by auditid limit 15000", 85, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 85 recvfrom(9, "\1\0\0\1\1;\0\0\2\3def\6zabbix\10auditlog\10auditlog\7auditid\7auditid\0\f!\0K\0\0\0\375\203P\0\0\0\5\0\0\3\376\0\0\2\0\32\0\0\4\31ckutp31v90001tdctg"..., 16384, MSG_DONTWAIT, NULL, NULL) = 4466 sendto(9, "H\t\0\0\3delete from auditlog where auditid in (140725688959344,140725688959344,140725688959344,14072568"..., 2380, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 2380 recvfrom(9, "\7\0\0\1\0\0\0\"\0\207\3", 16384, MSG_DONTWAIT, NULL, NULL) = 11 sendto(9, "Q\0\0\0\3select auditid from auditlog where clock<1634396803 order by auditid limit 15000", 85, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 85 recvfrom(9, "\1\0\0\1\1;\0\0\2\3def\6zabbix\10auditlog\10auditlog\7auditid\7auditid\0\f!\0K\0\0\0\375\203P\0\0\0\5\0\0\3\376\0\0\2\0\32\0\0\4\31ckutp31v90001tdctg"..., 16384, MSG_DONTWAIT, NULL, NULL) = 4466 sendto(9, "H\t\0\0\3delete from auditlog where auditid in (140725688959344,140725688959344,140725688959344,14072568"..., 2380, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 2380 recvfrom(9, "\7\0\0\1\0\0\0\"\0\207\3", 16384, MSG_DONTWAIT, NULL, NULL) = 11 |
как видим, вроде чистит аудит лог. Но, я обратил внимание что в select-ах, одни и теже auditid, что достаточно странно.
Посмотрел в таблицы auditlog и увидел что там всего пару сотен записей, что выглядело странно. Погуглив нашел, что было пару багов похожих на мою проблему, и они уже исправлены в более свежих версиях. Поэтому я решил попробовать обновиться
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# zabbix_server -V zabbix_server (Zabbix) 6.0.0alpha4 # systemctl stop zabbix-agent # systemctl stop zabbix-server # dnf update zabbix-server zabbix-agent # systemctl start zabbix-server # systemctl start zabbix-agent # zabbix_server -V zabbix_server (Zabbix) 6.0.23rc1 |
и повторив трюк с strace, я заметил что теперь zabbix не зависает на SQL связанных с auditlog, а начал чистить history
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sendto(19, "9\0\0\0\3delete from history_uint where itemid=37834 limit 500000", 61, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 61 recvfrom(19, 0x55e5b8511d70, 16384, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) poll([{fd=19, events=POLLIN}], 1, -1) = 1 ([{fd=19, revents=POLLIN}]) recvfrom(19, "\t\0\0\1\0\3740t\0\2\0\0\0", 16384, MSG_DONTWAIT, NULL, NULL) = 13 sendto(19, "9\0\0\0\3delete from history_uint where itemid=37805 limit 500000", 61, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 61 recvfrom(19, 0x55e5b8511d70, 16384, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) poll([{fd=19, events=POLLIN}], 1, -1) = 1 ([{fd=19, revents=POLLIN}]) recvfrom(19, "\t\0\0\1\0\374<t\0\2\0\0\0", 16384, MSG_DONTWAIT, NULL, NULL) = 13 sendto(19, "9\0\0\0\3delete from history_uint where itemid=37840 limit 500000", 61, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 61 recvfrom(19, 0x55e5b8511d70, 16384, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) poll([{fd=19, events=POLLIN}], 1, -1) = 1 ([{fd=19, revents=POLLIN}]) |
тк таблички достаточно большие, я поднял лимит по очистке до 500к записей за запуск, это опция
1 2 3 4 5 6 |
# nano /etc/zabbix/zabbix_server.conf ### Option: MaxHousekeeperDelete # No more than 'MaxHousekeeperDelete' rows (corresponding to [tablename], [field], [value]) MaxHousekeeperDelete=500000 |
даже такой большой лимит, не почистил все что нужно за 1 запуск, поэтому я запустил тригер запуска housekeeper-а, через watch с инетрвалом в 15 секунд и оставил так поработать (время выполнения я смотрел через strace и знал что цикл заканчивается до 15 секунд)
1 2 3 |
# watch -n15 zabbix_server -c /etc/zabbix/zabbix_server.conf -R housekeeper_execute |
далее я решил посмотреть как обстоят дела с размером таблиц
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SELECT TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)` FROM information_schema.TABLES WHERE TABLE_SCHEMA = "zabbix" AND ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) > 5 ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC; +--------------+-----------+ | Table | Size (MB) | +--------------+-----------+ | history | 16177 | | history_uint | 9624 | | trends | 430 | | trends_uint | 294 | | history_text | 130 | | history_str | 25 | | items | 12 | +--------------+-----------+ |
как видите изменений пока нет, history по прежнему весит очень много. Поэтому адо посмотреть кол-во записей в ней.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
MariaDB [zabbix]> DESCRIBE history; +--------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+-------+ | itemid | bigint(20) unsigned | NO | MUL | NULL | | | clock | int(11) | NO | | 0 | | | value | double | NO | | 0 | | | ns | int(11) | NO | | 0 | | +--------+---------------------+------+-----+---------+-------+ 4 rows in set (0.005 sec) MariaDB [zabbix]> SELECT COUNT(itemid) FROM history; | COUNT(itemid) | +---------------+ | 208415735 | +---------------+ 1 row in set (2 min 2.641 sec) |
208 млн записей выглядит как очень большое значение для чистки, поэтому я решил поднять ставки и вместо 50к поставить 10 млн записей. К сожалению при перезапуске получил ошибку
- Nov 04 12:50:32 zabbix zabbix_server[2442269]: zabbix_server [2442269]: wrong value of "MaxHousekeeperDelete" in config file "/etc/zabbix/zabbix_server.conf", line 438
1 2 3 4 5 6 7 8 9 10 11 |
# systemctl restart zabbix-server Job for zabbix-server.service failed because the control process exited with error code. See "systemctl status zabbix-server.service" and "journalctl -xe" for details. # journalctl -xe .. Nov 04 12:50:22 zabbix zabbix_server[2442265]: zabbix_server [2442265]: wrong value of "MaxHousekeeperDelete" in config file "/etc/zabbix/zabbix_server.conf", line 438 Nov 04 12:50:22 zabbix systemd[1]: zabbix-server.service: Control process exited, code=exited status=1 Nov 04 12:50:22 zabbix systemd[1]: zabbix-server.service: Failed with result 'exit-code' |
Оказывается, максимальный лимит 1 млн, его и поставил.
К сожалению даже такой большой лимит не принес улучшения перформанса, по всей видимости логика очистки не использует его для зависимых SQL запросов. Спустя минут 30, я заметил разницу в кол-ве записей, но она составила всего 6 млн.
в логе zabbix-server, появлялось сообщение, что всего 150к записей было очищено за цикл выполнения
1 2 3 4 5 6 7 8 9 10 11 |
tail -n 50 /var/log/zabbix_server.log 2443110:20231104:132121.624 forced execution of the housekeeper 2443110:20231104:132121.624 executing housekeeper 2443110:20231104:132125.512 housekeeper [deleted 150983 hist/trends, 0 items/triggers, 12 events, 0 problems, 0 sessions, 0 alarms, 0 audit, 0 autoreg_host, 0 records in 3.883729 sec, idle for 1 hour(s)] 2443110:20231104:132136.653 forced execution of the housekeeper 2443110:20231104:132136.653 executing housekeeper 2443110:20231104:132140.202 housekeeper [deleted 150573 hist/trends, 0 items/triggers, 68 events, 0 problems, 0 sessions, 0 alarms, 0 audit, 0 autoreg_host, 0 records in 3.547258 sec, idle for 1 hour(s)] |
Поэтому как и раньше запустил триггер houskeeper-а через watch и оставил его в покое на какое-то время
Перепровкерив через часа 4-е, я заметил что активная чистка прекратилась и по zabbix_server.log, с каждым запуском чистилось всего 40-60 записей.
В таблице history осталось 40 млн записей, что составило пятую часть от того, что было раньше.
Размер таблиц сцущественно сократился
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
MariaDB [zabbix]> SELECT TABLE_NAME AS `Table`, -> ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)` -> FROM information_schema.TABLES -> WHERE TABLE_SCHEMA = "zabbix" -> AND ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) > 5 -> ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC; +--------------+-----------+ | Table | Size (MB) | +--------------+-----------+ | history | 4949 | | history_uint | 3077 | | trends | 154 | | trends_uint | 116 | | history_text | 37 | | items | 12 | | history_str | 11 | +--------------+-----------+ |
однако размер свободного места не уменьшился
1 2 3 4 5 |
# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 38G 29G 6,9G 81% / |
так же видно, что всего свободного места осталось порядка 6,9 Гб. К счастью, этого будет достаточно чтобы сделать OPTIMIZE (при этой команде, таблица оптимизируется, но создается ее копия, т.е. для оптимизации history нужно как минимум 4949 Мб). Стопаем заббикс и запускаем оптимизацию поочередно.А заодно меняем в конфиге значение выборок для чистки с 1 млн на значение по-умолчанию 5000.
1 2 3 4 5 6 7 8 |
# systemctl stop zabbix-server # nano /etc/zabbix/zabbix_server.conf ### Option: MaxHousekeeperDelete # No more than 'MaxHousekeeperDelete' rows (corresponding to [tablename], [field], [value]) MaxHousekeeperDelete=5000 |
дальше логинимся в mysql и делаем оптимизацию таблиц начиная с меньших, чтобы освободить больше места для больших.
1 2 3 4 5 6 7 |
OPTIMIZE TABLE history_text; OPTIMIZE TABLE trends_uint; OPTIMIZE TABLE trends; OPTIMIZE TABLE history_uint; OPTIMIZE TABLE history; |
При выполнении видим сообщение вроде такого
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
MariaDB [zabbix]> OPTIMIZE TABLE history_uint; +---------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history_uint | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history_uint | optimize | status | OK | +---------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (1 min 46.492 sec) MariaDB [zabbix]> OPTIMIZE TABLE history; +----------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history | optimize | status | OK | +----------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (2 min 44.706 sec) |
в конце проверяем сколь появилось места, в моем случае диск был занят на 81% (29 Gb), а посл оптимизации занятого места стало всего 26% (9,2 Gb)
1 2 3 4 5 |
# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 38G 9,2G 27G 26% / |
не забываем запустить заббикс серве обратно
1 2 3 |
# systemctl start zabbix-server |
На этом приключения не закончились и при попытке залогиниться получил ошибку
- The Zabbix database version does not match current requirements. Your database version: 6000000. Required version: 5050072. Please contact your system administrator.
гугление помогло понять, что надо обновить и другие пакеты zabbix (тк обновил zabbix-server)
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 26 27 28 29 30 |
# yum list --installed | grep zabbix zabbix-agent.x86_64 6.0.23-rc1.release1.el8 @zabbix zabbix-nginx-conf.noarch 6.0.0-0.4alpha4.el8 @zabbix zabbix-release.noarch 5.5-1.el8 @System zabbix-selinux-policy.x86_64 6.0.0-0.4alpha4.el8 @zabbix zabbix-server-mysql.x86_64 6.0.23-rc1.release1.el8 @zabbix zabbix-sql-scripts.noarch 6.0.0-0.4alpha4.el8 @zabbix zabbix-web.noarch 6.0.0-0.4alpha4.el8 @zabbix zabbix-web-deps.noarch 6.0.0-0.4alpha4.el8 @zabbix zabbix-web-mysql.noarch 6.0.0-0.4alpha4.el8 @zabbix # dnf upgrade zabbix-* Last metadata expiration check: 0:03:08 ago on Sat 04 Nov 2023 08:04:37 PM CET. Dependencies resolved. =============================== Package Architecture Version Repository Size =============================== Upgrading: zabbix-nginx-conf noarch 6.0.23-rc1.release1.el8 zabbix 27 k zabbix-selinux-policy x86_64 6.0.23-rc1.release1.el8 zabbix 304 k zabbix-sql-scripts noarch 6.0.23-rc1.release1.el8 zabbix 7.8 M zabbix-web noarch 6.0.23-rc1.release1.el8 zabbix 8.2 M zabbix-web-deps noarch 6.0.23-rc1.release1.el8 zabbix 26 k zabbix-web-mysql noarch 6.0.23-rc1.release1.el8 zabbix 25 k Transaction Summary =============================== Upgrade 6 Packages |
чтобы не разбираться, что там именно надо перезапускать, я решил ребутнуть весь сервер и выполнил reboot.
1 2 3 |
# reboot |
После обновления и загрузки, все запустилось как надо и я попал в панель управления и нотификация об оставке места пометилась как Resolved.
Вот такие получились приключения, освободил место, апдейтнулся и избавился от бага с чистилкой.
--[добавлено]--
Пока ходил по интернетам туда-сюда, в одном старом комментарии нашел скрипт очистки. Думаю, его выполнение будет более эффективным чем ожидание housekeeper-а, но сам не проверял
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- intervals in days SET @history_interval = "Your History Interval in days"; SET @trends_interval = "the number of days you want to keep"; DELETE FROM alerts WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM acknowledges WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM events WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_str WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_text WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_log WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM trends WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60); DELETE FROM trends_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60); |
Author: | Tags: /
| Rating:
Leave a Reply