--- 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 ```