Devops's Blog

Оптимизация zabbixv6 3

Zabbix agent on ХХХХХХХ is unreachable for 5 minutes

Часто стал срабатывать триггер , что хосты агентов не доступны(и занимал весь дашборд) , хотя сетевых проблем нету. Сам появлялся и исчезал , в момент срабатывания мониторинг хостов не производился , когда триггер решался метрики появлялись в том числе и в момент провала imageВ момент срабатывания триггеров было видно , что на базе росли локи imageНачал смотреть в сторону базы , у меня postgresql, инструмент pghtop показывает запросы в реальном времени , в момент срабатывания триггеров pghtop показывал запросы select в исторические таблицы, которые висели по несколько минутimage Посмотрим сколько записей допустим в таблице history

zabbix=# SELECT count(*) FROM history;
   count
-----------
 277296209
(1 row)
		    
Соотвественно решение это сокращение хранения данных и метрик

Делаем временное решение или постоянное пишем скрипт , который будет чистить исторические данные за опеределенный период исключая некоторые хосты(и вставляем его в крон), но сначало отключим на zabbix сервере housekeeper и перезапутим сам сервис


HousekeepingFrequency=0
MaxHousekeeperDelete=0	

Исключаем в скрипте хосты monitoring_(1-4) и остальные метрики храним сутки


sql_func()
{
sql="delete from $table
     using items,hosts
     where hosts.host!='monitoring_4' and hosts.host!='monitoring_1' and hosts.host!='monitoring_2' and hosts.host!='monitoring_3' and $table.itemid=items.itemid and hosts.hostid=items.hostid
     and $table.clock < extract(epoch from to_char(CURRENT_DATE - INTERVAL '0 days', 'YYYY-MM-DD')::timestamp)::integer" 
}


TABLE_LIST=(
        history
        history_log
        history_str
        history_text
        history_uint
        trends
        trends_uint
)


log="/root/bin/clean_history_zabbix.log_$(date +%d-%m-%Y_%H-%M-%S)"
echo -n >$log
echo "bgin" - $(date +%d-%m-%Y_%H-%M-%S) >>$log
PGPASSWORD=12345678 psql -h 127.0.0.1 -U zabbix -d zabbix -c "SELECT * FROM timescaledb_information.hypertables" >>$log

for table in "${TABLE_LIST[@]}"; do
current_date=$(date +%d-%m-%Y_%H-%M-%S)
echo $current_date >>$log
echo $table >>$log
PGPASSWORD=12345678 psql -h 127.0.0.1 -U zabbix -d zabbix -c "SELECT count(*) FROM $table" >>$log
done


for table in "${TABLE_LIST[@]}"; do
sql_func
current_date=$(date +%d-%m-%Y_%H-%M-%S)
echo $current_date >>$log
echo $sql >>$log
PGPASSWORD=12345678 psql -qtAX -h 127.0.0.1 -U zabbix -d zabbix -c "$sql" 2>>$log
done
PGPASSWORD=12345678 psql -h 127.0.0.1 -U zabbix -d zabbix -c "SELECT * FROM timescaledb_information.hypertables" >>$log


for table in "${TABLE_LIST[@]}"; do
current_date=$(date +%d-%m-%Y_%H-%M-%S)
echo $current_date >>$log
echo $table >>$log
PGPASSWORD=12345678 psql -h 127.0.0.1 -U zabbix -d zabbix -c "SELECT count(*) FROM $table" >>$log
done


echo "end" - $(date +%d-%m-%Y_%H-%M-%S) >>$log


Так же заметил , что некоторые таблицы весили больше 5gb, так как у них связей не было по внешним ключам со стальными таблицами , можно сделать вывод , что они хранят только данные , удалил эти таблицы и пересоздал их(запросы на создания таблиц взял файла установки забикса)


auditlog
housekeeper

Модернизировал бекап базы , исключил данные из исторических таблиц


PGPASSWORD=12345678 /usr/pgsql-13/bin/pg_dump -Fc -h server.local  -U backup zabbix --exclude-table-data 'public.history' --exclude-table-data 'public.history_uint' --exclude-table-data 'public.history_log' --exclude-table-data 'public.history_str' --exclude-table-data 'public.history_text' --exclude-table-data 'public.trends' --exclude-table-data 'public.trends_uint' --exclude-table-data 'public.auditlog' > /opt/zabbix'_'`date +"%d-%m-%Y"`-d.sql.fc