Zum Inhalt

Enterprise-Infrastruktur-Telemetrie: Zabbix 7 LTS, TimescaleDB Hypertables, Zabbix Agent 2 & PSK-Verschlüsselung

Erstellt: 06.11.2026 Aktualisiert: 06.11.2026

Management Summary: Während synthetische Verfügbarkeitstests nur aussagen, ob ein Endpunkt erreichbar ist, erfordert echte Systembeobachtbarkeit tiefgreifende Kernel-, Storage-, SMART-, systemd- und SNMP-Telemetrie mit prädiktiven Schwellenwerten. Diese Referenzarchitektur beschreibt das Produktiv-Deployment von Zabbix 7.0 LTS mit PostgreSQL 17 + TimescaleDB Hypertable-Kompression, dem Go-basierten Zabbix Agent 2 mit TLS Pre-Shared Key (PSK) Verschlüsselung, SNMPv3-Switch-Polling und flatterfreien Hysterese-Triggern.

  • TimescaleDB Hypertable-Kompression


    Partitioniert history- und trends-Tabellen in Zeit-Chunks mit nativer spaltenbasierter Kompression (~90 % Speicherersparnis) und sofortigem Chunk-Drop statt ressourcenintensiven SQL-DELETE-Schleifen.

  • Zabbix Agent 2 (Go-Architektur)


    Ersetzt veraltete C-Agenten durch den nebenläufigen Go-basierten zabbix-agent2 mit nativen Plugins für Docker, systemd, SMART (smartctl), PostgreSQL und Redis.

  • TLS-PSK Verschlüsselte Active Checks


    Authentifiziert und verschlüsselt alle Metrikübertragungen über Port 10050/10051 mit 256-Bit Pre-Shared Keys (TLSConnect=psk).

  • Prädiktive Hysterese-Trigger


    Verhindert flatternde Alarme durch Recovery-Expressions, timeleft()-Kapazitätsprognosen und Low-Level Discovery (LLD) Prototypen.


1. Architektur: Zabbix Server Worker, Agents & TimescaleDB

Zabbix 7 LTS setzt auf einen hochoptimierten C-Server-Daemon (zabbix_server) mit spezialisierten Worker-Pools (Poller, Trapper, HistorySyncer, Preprocessor, LLDManager), die kontinuierliche Datenströme in PostgreSQL + TimescaleDB schreiben:

%%{init: {'flowchart': {'wrappingWidth': 600, 'subGraphTitleMargin': {'top': 15, 'bottom': 15}}}}%%
flowchart TB
    subgraph MonitoredFleet["Überwachte Infrastruktur"]
        LinuxHost["Linux-Nodes (Zabbix Agent 2)<br/>Systemd + SMART + Docker<br/>TLS-PSK :10050/:10051"]
        Switch["Managed Core-Switches<br/>SNMPv3 authPriv (SHA/AES)"]
    end

    subgraph ZabbixCore["Zabbix 7.0 LTS Core Engine"]
        Pollers["Poller & Trapper Pool<br/>Preprocessors + LLD Engine"]
        VCache["ValueCache & HistoryCache<br/>Shared Memory Buffer"]
        WebUI["Zabbix Web Frontend<br/>Nginx + PHP-FPM"]
    end

    subgraph StorageTier["Time-Series Speicher-Backend"]
        TSDB[("PostgreSQL 17 + TimescaleDB<br/>Komprimierte Hypertable-Chunks")]
    end

    LinuxHost <-->|"Verschlüsselt TLS-PSK"| Pollers
    Switch -->|"SNMPv3 BulkWalk"| Pollers
    Pollers --> VCache
    VCache -->|"Batch Insert"| TSDB
    WebUI <--> TSDB

Warum TimescaleDB den "Housekeeper"-Flaschenhals löst

In standardmäßigen relationalen Datenbanken führt Zabbix' Housekeeper-Prozess massive DELETE FROM history WHERE clock < ...-Befehle aus. Auf größeren Installationen verursacht dies gravierende Tabellen-Fragmentierung, I/O-Spitzen und autovacuum-Überlastung. Mit TimescaleDB werden history und trends in Zeit-Chunks (z. B. 1 Tag) aufgeteilt. Das Bereinigen von Daten älter als 90 Tage ist eine atomare drop_chunks()-Metadaten-Operation ohne zeilenweises Löschen.


2. Produktiv-Stack: Zabbix 7.0 LTS + PostgreSQL 17 TimescaleDB

/opt/zabbix/compose.yaml
services:
  postgres-tsdb:
    image: timescale/timescaledb-ha:pg17
    container_name: zabbix-timescaledb
    restart: unless-stopped
    shm_size: "1g"
    environment:
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: "${ZBX_DB_PASSWORD}"
      POSTGRES_DB: zabbix
    command:
      - "postgres"
      - "-c"
      - "shared_buffers=1GB"
      - "-c"
      - "work_mem=32MB"
      - "-c"
      - "maintenance_work_mem=256MB"
      - "-c"
      - "max_connections=200"
    volumes:
      - ./pgdata:/home/postgres/pgdata/data:Z
    networks:
      - zbx_net

  zabbix-server:
    image: zabbix/zabbix-server-pgsql:alpine-7.0-latest
    container_name: zabbix-server
    restart: unless-stopped
    depends_on:
      - postgres-tsdb
    ports:
      - "10051:10051/tcp"
    environment:
      DB_SERVER_HOST: postgres-tsdb
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: "${ZBX_DB_PASSWORD}"
      POSTGRES_DB: zabbix
      ZBX_ENABLE_SNMP_TRAPS: "false"
      ZBX_STARTPOLLERS: 10
      ZBX_STARTPREPROCESSORS: 8
      ZBX_STARTLLDPROCESSORS: 4
      ZBX_CACHESIZE: 64M
      ZBX_HISTORYCACHESIZE: 64M
      ZBX_HISTORYINDEXCACHESIZE: 32M
      ZBX_TRENDCACHESIZE: 32M
      ZBX_VALUECACHESIZE: 128M
    networks:
      - zbx_net

  zabbix-web:
    image: zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest
    container_name: zabbix-web
    restart: unless-stopped
    depends_on:
      - postgres-tsdb
      - zabbix-server
    ports:
      - "127.0.0.1:8085:8080/tcp"
    environment:
      ZBX_SERVER_HOST: zabbix-server
      DB_SERVER_HOST: postgres-tsdb
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: "${ZBX_DB_PASSWORD}"
      POSTGRES_DB: zabbix
      PHP_TZ: "Europe/Berlin"
    networks:
      - zbx_net

networks:
  zbx_net:
    driver: bridge

TimescaleDB-Erweiterung und Hypertable-Schema nach der Initialisierung aktivieren:

TimescaleDB Hypertables & Kompression einrichten
# 1. TimescaleDB-Extension in der zabbix-Datenbank aktivieren
docker exec -i zabbix-timescaledb psql -U zabbix -d zabbix \
  -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;"

# 2. Zabbix TimescaleDB-Schema-Migrationsskript einspielen
docker exec -i zabbix-server cat /usr/share/doc/zabbix-sql-scripts/postgresql/timescaledb/schema.sql \
  | docker exec -i zabbix-timescaledb psql -U zabbix -d zabbix

3. Zabbix Agent 2 mit TLS-PSK & SMART/Docker-Plugins ausrollen

Installieren Sie auf zu überwachenden Hosts zabbix-agent2 und erzeugen Sie einen 256-Bit Pre-Shared Key (PSK):

Zabbix Agent 2 mit 256-Bit TLS-PSK bereitstellen
# 1. 256-Bit Hex PSK generieren
sudo mkdir -p /etc/zabbix/psk
openssl rand -hex 32 | sudo tee /etc/zabbix/psk/agent.psk
sudo chown -R zabbix:zabbix /etc/zabbix/psk
sudo chmod 0400 /etc/zabbix/psk/agent.psk

# 2. Berechtigungen für Docker-Socket und NVMe/SATA-SMART-Diagnose erteilen
sudo usermod -aG docker zabbix
cat << 'EOF' | sudo tee /etc/sudoers.d/zabbix-smartctl
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl
EOF
sudo chmod 0440 /etc/sudoers.d/zabbix-smartctl

In /etc/zabbix/zabbix_agent2.conf hinterlegen:

/etc/zabbix/zabbix_agent2.conf
Server=192.168.10.25
ServerActive=192.168.10.25
Hostname=proxmox-node-01.lan.nejat-hakan.de

# TLS-PSK für eingehende (Passive) und ausgehende (Active) Prüfungen erzwingen
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK_PROXMOX_NODE_01
TLSPSKFile=/etc/zabbix/psk/agent.psk

# Native Go-Plugins für Systemd, Docker und SMART aktivieren
Plugins.Smart.Path=/usr/sbin/smartctl

4. Flatterfreie Trigger mit Hysterese & Prognosen

Einfache Schwellenwerte (last(/host/system.cpu.util) > 85) erzeugen unnötige Alarme, wenn Werte um den Grenzwert schwanken. Zabbix 7 bietet Recovery Expressions und lineare Trendvorhersagen:

Praxiserprobte Zabbix 7 Trigger-Ausdrücke
# 1. Hysterese: Alarm bei 5m-Durchschnitt > 85 %, Entwarnung erst wenn 10m-Durchschnitt unter 70 % fällt
Problem Expression:  avg(/Linux by Zabbix agent/system.cpu.util, 5m) > 85
Recovery Expression: avg(/Linux by Zabbix agent/system.cpu.util, 10m) < 70

# 2. Speicherplatz-Vorhersage: Alarm, wenn lineare Regression volles Dateisystem innerhalb von 24h prognostiziert
Problem Expression:  last(/Linux by Zabbix agent/vfs.fs.dependent.size[/,pused]) > 80
                     and timeleft(/Linux by Zabbix agent/vfs.fs.dependent.size[/,pused], 6h, 100) < 24h

# 3. NVMe / SATA SMART Hardwarewarnung
Problem Expression:  last(/SMART by Zabbix agent 2/smart.disk.critical_warning[{#NAME}]) > 0

5. Verifikation & Diagnostik mit zabbix_get

Verbindung und Schlüsselabfrage vom Zabbix-Server über verschlüsseltes TLS-PSK testen:

TLS-PSK Handshake & SMART-Plugin via zabbix_get prüfen
# 1. Lokale Plugin-Schlüssel direkt auf dem Host testen
sudo zabbix_agent2 -t smart.disk.get
sudo zabbix_agent2 -t docker.containers

# 2. Agent 2 über TLS-PSK vom Zabbix-Server aus abfragen
docker exec zabbix-server zabbix_get \
  -s 192.168.10.20 -p 10050 \
  --tls-connect psk \
  --tls-psk-identity "PSK_PROXMOX_NODE_01" \
  --tls-psk-file /var/lib/zabbix/enc/agent.psk \
  -k "system.uname"