---
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/ <nieuwe server>:/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
```