From 679bc6992cdeae45500d806c91976fe35dacc106 Mon Sep 17 00:00:00 2001 From: Eli Winderickx Date: Tue, 23 Dec 2025 20:12:09 +0100 Subject: [PATCH] Zabbix upgrade --- posts/25-12-18-UpgradingZabbix.md | 220 ++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 posts/25-12-18-UpgradingZabbix.md diff --git a/posts/25-12-18-UpgradingZabbix.md b/posts/25-12-18-UpgradingZabbix.md new file mode 100644 index 0000000..a301373 --- /dev/null +++ b/posts/25-12-18-UpgradingZabbix.md @@ -0,0 +1,220 @@ +--- +title: "Zabbix upgraden in moeilijke omstandigheden" +excerpt: "Een Zabbix upgrade is simpel, tot er vanalles extra bij komt kijken" +date: "2025-02-18T12:00:00.000Z" +author: Eli Winderickx +hero_image: /ZabbixRebranding_cover.png +category: Zabbix,upgrades,Linux +--- +# Situering +We beginnen bij het begin. Een Zabbix 6.4 server op een Rocky Linux 8 server met een PostgreSQL 13 en een bijhorende oude TimeScaleDB versie. Dat is een hele boterham om aan te pakken. Daarnaast was de server ook stilaan End-of-life waardoor er een ander fysiek toestel werd voorzien. Niet alleen zijn er veel bewegende componenten die elk met hun complexiteit komen, er is ook nog een downtime waarmee rekening te houden. Door het geautomatiseerde proces binnen de omgeving, was Zabbix een centraal component. Nieuwe releases kunen niet plaatsvinden als Zabbix niet beschikbaar is. Gelukkig kon ik goed oefenen zodat we op D-day de hinder beperkt konden houden. Hieronder ben ik stap per stap aan de slag gegaan. + +# Backup maken +## De database op de oude server voorbereiden +Op de oude server was een oudere PostgreSQL versie voorzien en een TimeScaleDB die gelijktijdig voorzien werd. Specifiek aan TimeScaleDB is dat die heel kieskeurig is naar de versie van PostgreSQL en ook TimeScaleDB. Helaas kan ik met de oude versie niet meteen een migratie doen naar een moderner OS. Eerst moet er dus een upgrade gebeuren. De eenvoudigste oplossing was TimeScaleDB te upgraden. We kunnen deze software upgraden naar versie 2.15. Deze versie van TimeScaleDB is zowel op de oude server met PG 13 ondersteund maar ook PG16. Dit komt met een kleine downtime maar dat was in te plannen. + +```bash +sudo systemctl stop zabbix-server +sudo dnf install timescaledb-2-loader-postgresql-13-2.15.2-0.el8.x86_64 timescaledb-2-postgresql-13-2.15.2-0.el8.x86_64 +sudo systemctl restart postgresql-13.service +sudo -u postgres psql -d zabbix -X +ALTER EXTENSION timescaledb UPDATE; +``` + +## Database backup +Nu kunnen we de database overnemen. In de eerste plaats om de upgrade te testen maar uiteindelijk ook om de upgrade te doen. + +```bash +time pg_dump -j 16 -Fd -Z 0 -d zabbix -f /backup/zabbix/ +rsync -avP /backup/zabbix/ :/var/lib/postgresql/migratie +``` + +## Configuratie bestanden +We moeten uiteraard naast de databank ook de configuratie bestanden meenemen. Dat is zo voor Zabbix, NGINX, PostgreSQL en ook alternatieve scripts. Hier kan je die terugvinden: + +Zabbix: +- /etc/zabbix/ + - zabbix_server.conf.d/zabbix-server.conf + - zabbix_java_gateway.conf + - web/zabbix.conf.php + +Nginx: +- /etc/nginx/conf.d/ + - zabbix-nossl.conf + - zabbix-ssl.conf + - zabbix.conf +- /etc/ssl/ + - certs + +Postgres: +- /var/lib/pgsql/13/data + - postgresql.conf + - pg_hba.conf + - special.conf + - certs +Alertscripts: +- /usr/lib/zabbix/alertscripts + - smssender.php + + +# Nieuwe server +## Databank +Op de nieuwe server kunnen we nu ook de database installeren. Hiervoor kiezen we PostgreSQL 16. Dat is niet de laatste versie maar wel de versie die courant is in de organisatie. + +```bash +# Aparte datadisk voor databank +sudo lvcreate -L 1TiB --name pg_data vg_data +sudo mkfs.xfs /dev/mapper/vg_data-pg_data +sudo mkdir /var/lib/postgresql +sudo echo "UUID=$(lsblk -lf | grep "pg_data" | awk '{print $3}') /var/lib/postgresql xfs defaults 0 0" | sudo tee -a /etc/fstab +sudo systemctl daemon-reload +sudo mount -a + +# Installeer PostgreSQL 16 +sudo apt install apt install postgresql-16 + +# Configuratie aanpassen en tunen naar de Monitor server +sudo vim /etc/postgresql/16/main/conf.d/special.conf +sudo chown postgres:postgres /etc/postgresql/16/main/conf.d/special.conf +``` + +Nu PostgreSQL beschikbaar is, kunnen we ook TimeScaleDB installeren. Hiervoor kiezen we dezelfde versie als op de oude server, weliswaar voor PostgreSQL 16. + +```bash +## TimeScaleDB installeren als pakket +sudo apt install timescaledb-2-postgresql-16='2.15.2*' timescaledb-2-loader-postgresql-16='2.15.2*' + +# De configuratie moet nog een beetje verder getuned worden +sudo timescaledb-tune -conf-path /etc/postgresql/16/main + +# Service herstarten en database aanmaken met extentie +sudo systemctl restart postgresql.service +sudo -u postgres createuser --pwprompt zabbix +sudo -u postgres psql -c "DROP DATABASE IF EXISTS zabbix;" +sudo -u postgres createdb -O zabbix zabbix +sudo -u postgres psql -d zabbix -c "CREATE EXTENSION IF NOT EXISTS timescaledb;" +``` + +## Database herstel +Nu de software klaarstaat, kunnen we de database importeren. Voor TimeScaleDB, moeten we daar ook iets speciaals doen. + +```bash +tmux +sudo -u postgres psql -d zabbix -c "SELECT timescaledb_pre_restore();" +sudo -u postgres time pg_restore -d zabbix /var/lib/postgresql/migratie +sudo -u postgres psql -d zabbix -c "SELECT timescaledb_post_restore();" + +sudo -u postgres psql +\c zabbix +GRANT ALL privileges on all tables in schema public to zabbix; +GRANT ALL ON SCHEMA public TO zabbix; +``` + +Dat duurde even maar nu hebben we de database klaarstaan. In principe zouden we nu Zabbix 6.4 installeren en zou alles moeten werken. Uiteraard willen we verder landen dus doen we verder. De volgende stap is een database patch uitvoeren. Helaas is het niet eenvoudig met TimeScaleDB. Oudere data wordt gecomprimeerd. Dat moeten we eerst te niet doen voordat we de patch kunnen uitvoeren. + +```SQL +\c zabbix +-- Schakel de policies uit +SELECT remove_compression_policy('trends'); +SELECT remove_compression_policy('trends_uint'); +SELECT remove_compression_policy('history'); +SELECT remove_compression_policy('history_uint'); +SELECT remove_compression_policy('history_log'); +SELECT remove_compression_policy('history_str'); +SELECT remove_compression_policy('history_text'); + + +-- Alle gecomprimeerde chunks uitpakken +DO $$ +DECLARE + r RECORD; + hypertable TEXT; + start_time TIMESTAMP; + end_time TIMESTAMP; +BEGIN + start_time := clock_timestamp(); + + FOR hypertable IN + SELECT unnest(ARRAY[ + 'trends', + 'trends_uint', + 'history', + 'history_uint', + 'history_log', + 'history_str', + 'history_text' + ]) + LOOP + FOR r IN + SELECT format('%I.%I', chunk_schema, chunk_name) AS full_chunk_name + FROM timescaledb_information.chunks + WHERE is_compressed = true AND hypertable_name = hypertable + LOOP + RAISE NOTICE 'Decompressing chunk from %: %', hypertable, r.full_chunk_name; + EXECUTE format('SELECT decompress_chunk(''%s'');', r.full_chunk_name); + END LOOP; + END LOOP; + + end_time := clock_timestamp(); + RAISE NOTICE 'Total execution time: % seconds', EXTRACT(EPOCH FROM end_time - start_time); +END +$$; + +-- Compressie uitzetten +ALTER TABLE trends SET (timescaledb.compress=false); +ALTER TABLE trends_uint SET (timescaledb.compress=false); +ALTER TABLE history SET (timescaledb.compress=false); +ALTER TABLE history_uint SET (timescaledb.compress=false); +ALTER TABLE history_log SET (timescaledb.compress=false); +ALTER TABLE history_str SET (timescaledb.compress=false); +ALTER TABLE history_text SET (timescaledb.compress=false); + +-- Vereiste Datapatch uitvoeren +BEGIN; +ALTER TABLE trends + ALTER COLUMN value_min TYPE DOUBLE PRECISION, + ALTER COLUMN value_min SET DEFAULT '0.0000', + ALTER COLUMN value_avg TYPE DOUBLE PRECISION, + ALTER COLUMN value_avg SET DEFAULT '0.0000', + ALTER COLUMN value_max TYPE DOUBLE PRECISION, + ALTER COLUMN value_max SET DEFAULT '0.0000'; + +ALTER TABLE history + ALTER COLUMN value TYPE DOUBLE PRECISION, + ALTER COLUMN value SET DEFAULT '0.0000'; +COMMIT; +``` + + +## Zabbix installeren +Als je de juiste repo geactiveerd hebben, kan je Zabbix eenvoudig installeren. Als we Zabbix starten, zal eerst de database upgrade starten. Volg dit in het log bestand om zeker te zijn dat alles goed gegaan is. +```bash +apt install zabbix-server-pgsql zabbix-frontend-php php8.3-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2 zabbix-java-gateway zabbix-agent2-plugin-postgresql +systemctl enable zabbix-server zabbix-agent2 nginx php8.3-fpm +sudo tail -f /var/log/zabbix/zabbix_server.log +``` + +Zabbix 7.0 is nu actief en zou goed moeten werken. Let wel dat we nu niet gedaan hebben. We zitten nog steeds met een oude versie van TimeScaleDB. Hiervoor stoppen we best opnieuw Zabbix voordat we de upgrade doen. We gaan naar de laatst ondersteunde versie op moment van researchen. + +```bash +sudo systemctl stop zabbix-server +sudo apt install timescaledb-2-postgresql-16='2.18.2*' timescaledb-2-loader-postgresql-16='2.18.2*' +sudo apt install timescaledb-2-postgresql-16='2.21.3*' timescaledb-2-loader-postgresql-16='2.21.3*' +sudo systemctl start zabbix-server && sudo tail -f /var/log/zabbix/zabbix_server.log +``` + +Als je nu geen fouten ziet in het server log, ben je klaar. Voor mij waren er nog firewall problemen, ik moest de Zabbix proxies ook upgraden en dan werkt alles opnieuw. De Proxies moest ik upgraden omdat ik naar een nieuwe fysieke server verbind. Als ik een lokale upgrade deed, was dat niet nodig. + +## Whats next +- Zabbix agent: Deze zijn niet dringend want Zabbix 7.0 workt ook met de 6.4 agents +- SNMP: Een van de grote veranderingen is asynchroon data collection. Hiervoor moet in Zabbix frontend nog wijzigingen gebeuren om dit in orde te krijgen. + + +# Test +Als deel van mijn testen, moest ik mijn nieuwe server ook klaarzetten voor een nieuwe test of voor D-day. Dat was eenvoudig genoeg. + +```bash +sudo systemctl stop zabbix-server.service +sudo -u postgres psql -c "drop database zabbix;" +sudo apt purge timescaledb-2-postgresql-16 timescaledb-2-loader-postgresql-16 +``` \ No newline at end of file