Felhasználói eszközök

Eszközök a webhelyen


kubernetes:stackgres:monitoring

Összehasonlítás

A kiválasztott és az jelenlegi változat között az alábbi különbségek fordulnak elő:

Összehasonlító nézet hivatkozása

Előző változat mindkét oldalonElőző változat
Következő változat
Előző változat
kubernetes:stackgres:monitoring [2026/06/10 12:46] – riba.zoltankubernetes:stackgres:monitoring [2026/06/10 14:38] (aktuális) – riba.zoltan
Sor 1: Sor 1:
-====== Kubernetes StackGres ======+====== Kubernetes StackGres/PostgreSQL ======
  
-===== Állapot ellenőrzés, monitorozás =====+===== Állapot ellenőrzés =====
  
 ==== Kubernetes állapot ellenőrzés ==== ==== Kubernetes állapot ellenőrzés ====
Sor 325: Sor 325:
 +--------------+-------------+---------+-----------+----+-------------+-----+------------+-----+ +--------------+-------------+---------+-----------+----+-------------+-----+------------+-----+
 </code> </code>
- 
-===== Tesztelés ===== 
- 
  
 ==== PostgreSQL állapot ellenőrzés ==== ==== PostgreSQL állapot ellenőrzés ====
Sor 356: Sor 353:
 </code> </code>
  
-Részletesebb megjelenítés+== Részletesebb megjelenítés ==
  
 <code> <code>
Sor 414: Sor 411:
   * ''backend_start'' Replikációs kapcsolat létrejöttének ideje   * ''backend_start'' Replikációs kapcsolat létrejöttének ideje
   * ''backend_xmin'' Hot standby VACUUM védelemhez használt xmin.   * ''backend_xmin'' Hot standby VACUUM védelemhez használt xmin.
-  * ''state'' Replikáció állapota (''startup'' kapcsolat indul, ''catchup'' utoléri a leadert, ''streaming'' folyamatos replikáció, ''backup' base backup készül)+  * ''state'' Replikáció állapota (''startup'' kapcsolat indul, ''catchup'' utoléri a leadert, ''streaming'' folyamatos replikáció, ''backup'' base backup készül)
   * ''sent_lsn'' A leader eddig a pontig küldte ki a WAL rekordokat   * ''sent_lsn'' A leader eddig a pontig küldte ki a WAL rekordokat
   * ''write_lsn'' A replika eddig a pontig írta lemezre   * ''write_lsn'' A replika eddig a pontig írta lemezre
Sor 428: Sor 425:
 === Replika állapot ellenőrzés === === Replika állapot ellenőrzés ===
  
-Az ellenőrzés elvégezhető valamelyik replikán. A ''t'' azt jelenti, hogy a replikáció fut. Amennyiben ''f'' az eredmény, akkor a replikáció nem fut (ilen eset lehet, ha a lekérdezést a leader-en futtatjuk).+Az ellenőrzés elvégezhető valamelyik replikán. A ''t'' azt jelenti, hogy a replikáció fut. Amennyiben ''f'' az eredmény, akkor a replikáció nem fut (ilyen eset lehet, ha a lekérdezést a leader-en futtatjuk).
  
 <code> <code>
Sor 446: Sor 443:
 pg_is_in_recovery | f pg_is_in_recovery | f
 </code> </code>
 +
 +===== Monitorozás =====
 +
 +==== Monitor szkriptek ====
 +
 +=== PostgreSQL replikáció állapot ===
 +
 +A PostgreSQL állapotának ellenőrzését végző szkriptek első sorában meg kell adni a használni kívánt névteret.
 +
 +== POD-ok ellenőrzése ==
 +
 +<file bash 01-check-pods.sh>
 +#!/usr/bin/env bash
 +
 +NAMESPACE="lapodb-postgres"
 +
 +NOT_READY=$(kubectl get pods -n "$NAMESPACE" --no-headers | awk '
 +{
 +  split($2, ready, "/")
 +  if (ready[1] != ready[2] || $3 != "Running") {
 +    print
 +  }
 +}')
 +
 +if [ -n "$NOT_READY" ]; then
 +  echo "CRITICAL - Van olyan PostgreSQL pod, amiben legalább egy konténer nem megfelelő állapotban van"
 +  echo "$NOT_READY"
 +  exit 2
 +fi
 +
 +echo "OK - Minden pod és konténer megfelelő állapotban van"
 +
 +exit 0
 +</file>
 +
 +Futtatás eredménye
 +
 +<code>
 +$ ./01-check-pods.sh 
 +OK - Minden pod és konténer megfelelő állapotban van
 +</code>
 +
 +== StackGres/PostgreSQL replikáció ==
 +
 +<file bash 02-check-stackgres-postgresql-status.sh>
 +#!/usr/bin/env bash
 +
 +NAMESPACE="lapodb-postgres"
 +CLUSTER_PREFIX="pg-cluster"
 +EXPECTED_PODS=3
 +
 +PODS=$(kubectl get pods -n "$NAMESPACE" --no-headers 2>/dev/null | awk -v p="$CLUSTER_PREFIX" '$1 ~ "^"p"-[0-9]+$" {print $1}')
 +
 +if [ -z "$PODS" ] ; then
 +  echo "CRITICAL - Nincs PostgreSQL pod a namespace-ben: $NAMESPACE"
 +  exit 2
 +fi
 +
 +FIRST_POD=$(echo "$PODS" | head -n 1)
 +
 +PATRONI_STATUS="$(kubectl exec -n "$NAMESPACE" "$FIRST_POD" -c patroni -- patronictl list 2>/dev/null)"
 +
 +if [ -z "$PATRONI_STATUS" ] ; then
 +  echo "CRITICAL - Nem sikerült lekérdezni a Patroni állapotot"
 +  exit 2
 +fi
 +
 +READY_COUNT=0
 +POD_COUNT=0
 +LEADER_COUNT=0
 +REPLICA_COUNT=0
 +DETAILS=""
 +
 +for POD in $PODS ; do
 +    POD_COUNT=$((POD_COUNT + 1))
 +
 +    NODE=$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.spec.nodeName}' 2>/dev/null)
 +    PHASE=$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.status.phase}' 2>/dev/null)
 +    READY="$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{range .status.containerStatuses[*]}{.ready}{" "}{end}' 2>/dev/null | awk '{ready=0; total=0; for (i=1;i<=NF;i++) {total++; if ($i=="true") ready++} print ready "/" total}')"
 +    RESTARTS="$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{range .status.containerStatuses[*]}{.restartCount}{" "}{end}' 2>/dev/null | awk '{sum=0; for (i=1;i<=NF;i++) sum+=$i; print sum}')"
 +    ROLE="$(echo "$PATRONI_STATUS" | awk -F'|' -v pod="$POD" '$2 ~ pod {gsub(/^[ \t]+|[ \t]+$/, "", $4) ; print tolower($4)}')"
 +
 +    [ -z "$ROLE" ] && ROLE="unknown"
 +
 +    if [ "$PHASE" = "Running" ] && echo "$READY" | awk -F/ '{exit !($1==$2 && $2>0)}' ; then
 +        READY_COUNT=$((READY_COUNT + 1))
 +    fi
 +
 +    case "$ROLE" in
 +        leader)
 +            LEADER_COUNT=$((LEADER_COUNT + 1))
 +        ;;
 +        replica)
 +            REPLICA_COUNT=$((REPLICA_COUNT + 1))
 +        ;;
 +    esac
 +
 +    DETAILS="${DETAILS}${POD} role=${ROLE} node=${NODE} ready=${READY} phase=${PHASE} restarts=${RESTARTS}; "
 +done
 +
 +UNIQUE_NODES=$(for POD in $PODS ; do kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.spec.nodeName}{"\n"}' ; done | sort -u | wc -l)
 +
 +if [ "$POD_COUNT" -ne "$EXPECTED_PODS" ] ; then
 +    echo "CRITICAL - Pod szám eltérés: ${POD_COUNT}/${EXPECTED_PODS}. ${DETAILS}"
 +    exit 2
 +fi
 +
 +if [ "$READY_COUNT" -ne "$EXPECTED_PODS" ] ; then
 +    echo "CRITICAL - Nem minden pod ready: ${READY_COUNT}/${EXPECTED_PODS}. ${DETAILS}"
 +    exit 2
 +fi
 +
 +if [ "$LEADER_COUNT" -ne 1 ] ; then
 +    echo "CRITICAL - Leader darabszám hibás: ${LEADER_COUNT}. ${DETAILS}"
 +    exit 2
 +fi
 +
 +if [ "$REPLICA_COUNT" -lt 2 ] ; then
 +    echo "WARNING - Kevesebb mint 2 replica látszik: ${REPLICA_COUNT}. ${DETAILS}"
 +    exit 1
 +fi
 +
 +if [ "$UNIQUE_NODES" -lt "$EXPECTED_PODS" ] ; then
 +    echo "WARNING - Nem minden PostgreSQL pod külön node-on fut: ${UNIQUE_NODES}/${EXPECTED_PODS}. ${DETAILS}"
 +    exit 1
 +fi
 +
 +echo "OK - StackGres PostgreSQL rendben. Pods=${READY_COUNT}/${EXPECTED_PODS}, Leader=${LEADER_COUNT}, Replicas=${REPLICA_COUNT}, Nodes=${UNIQUE_NODES}/${EXPECTED_PODS}. ${DETAILS}"
 +
 +exit 0
 +</file>
 +
 +Futtatás eredménye
 +
 +<code>
 +$ ./02-check-stackgres-postgresql-status.sh 
 +OK - StackGres PostgreSQL rendben. Pods=3/3, Leader=1, Replicas=2, Nodes=3/3. pg-cluster-0 role=leader node=kube01 ready=5/5 phase=Running restarts=0; pg-cluster-1 role=replica node=kube03 ready=5/5 phase=Running restarts=13; pg-cluster-2 role=replica node=kube02 ready=5/5 phase=Running restarts=0;
 +</code>
 +
 +==== Riport szkriptek ====
 +
 +=== StackGres riport ===
 +
 +<file bash 00-report-stackgres-postgresql-status.sh>
 +#!/usr/bin/env bash
 +
 +NAMESPACE="lapodb-postgres"
 +
 +echo "====================================================="
 +echo "StackGres PostgreSQL klaszter állapot"
 +echo "Dátum: $(date)"
 +echo "====================================================="
 +
 +echo -e "\n=== Kubernetes node-ok ===\n"
 +kubectl get nodes -o wide
 +
 +
 +echo -e "\n=== PostgreSQL pod-ok ===\n"
 +kubectl get pods -n "$NAMESPACE" -o wide
 +
 +
 +echo -e "\n=== Patroni klaszter állapot ===\n"
 +LEADER_POD=$(kubectl get pods -n "$NAMESPACE" -o name | grep pg-cluster | head -1 | sed 's#pod/##')
 +kubectl exec -n "$NAMESPACE" "$LEADER_POD" -c patroni -- patronictl list 2>/dev/null || "ERROR: patronictl nem található"
 +
 +
 +echo -e "\n=== PostgreSQL pod-ok elhelyezkedése ===\n"
 +printf "%-20s %-10s %-15s %-8s %-8s\n" "POD" "ROLE" "NODE" "READY" "RESTARTS"
 +for POD in $(kubectl get pods -n "$NAMESPACE" -o name | grep pg-cluster | sed 's#pod/##') ; do
 +    NODE=$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.spec.nodeName}')
 +    READY=$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.status.containerStatuses[*].ready}' | awk '{c=0;for(i=1;i<=NF;i++) if($i=="true") c++; print c"/"NF}')
 +    RESTARTS=$(kubectl get pod "$POD" -n "$NAMESPACE" -o jsonpath='{.status.containerStatuses[*].restartCount}' | awk '{s=0;for(i=1;i<=NF;i++) s+=$i; print s}')
 +    ROLE=$(kubectl exec -n "$NAMESPACE" "$LEADER_POD" -c patroni -- patronictl list 2>/dev/null | awk -F'|' -v pod="$POD" '$2 ~ pod { gsub(/^[ \t]+|[ \t]+$/, "", $4) ; print tolower($4) }')
 +    printf "%-20s %-10s %-15s %-8s %-8s\n" "$POD" "${ROLE:-unknown}" "$NODE" "$READY" "$RESTARTS"
 +done
 +
 +
 +echo -e "\n=== Leader(ek) ===\n"
 +LEADERS=$(kubectl exec -n "$NAMESPACE" "$LEADER_POD" -c patroni -- patronictl list 2>/dev/null | awk -F'|' 'tolower($4) ~ /leader/ { gsub(/^[ \t]+|[ \t]+$/, "", $2) ; print $2 }')
 +echo "$LEADERS"
 +
 +echo -e "\n====================================================="
 +</file>
 +
 +Futtatás eredménye
 +
 +<code>
 +$ ./00-report-stackgres-postgresql-status.sh 
 +=====================================================
 +StackGres PostgreSQL klaszter állapot
 +Dátum: 2026. jún. 10., szerda, 15:10:21 CEST
 +=====================================================
 +
 +=== Kubernetes node-ok ===
 +
 +NAME     STATUS   ROLES                    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                           KERNEL-VERSION                          CONTAINER-RUNTIME
 +kube01   Ready    control-plane,postgres   38d   v1.36.0   192.168.110.161   <none>        AlmaLinux 10.1 (Heliotrope Lion)   6.12.0-124.52.3.el10_1.x86_64 (amd64)   containerd://2.2.3
 +kube02   Ready    control-plane,postgres   38d   v1.36.0   192.168.110.162   <none>        AlmaLinux 10.1 (Heliotrope Lion)   6.12.0-124.52.3.el10_1.x86_64 (amd64)   containerd://2.2.3
 +kube03   Ready    control-plane,postgres   38d   v1.36.0   192.168.110.163   <none>        AlmaLinux 10.1 (Heliotrope Lion)   6.12.0-124.52.3.el10_1.x86_64 (amd64)   containerd://2.2.3
 +
 +=== PostgreSQL pod-ok ===
 +
 +NAME           READY   STATUS    RESTARTS        AGE    IP            NODE     NOMINATED NODE   READINESS GATES
 +pg-cluster-0   5/5     Running   0               128m   10.244.0.9    kube01   <none>           <none>
 +pg-cluster-1   5/5     Running   13 (118m ago)   37d    10.244.2.16   kube03   <none>           <none>
 +pg-cluster-2   5/5     Running   0               39m    10.244.1.15   kube02   <none>           <none>
 +
 +=== Patroni klaszter állapot ===
 +
 ++ Cluster: pg-cluster (7635689612010042939) -------+----+-------------+-----+------------+-----+
 +| Member       | Host        | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
 ++--------------+-------------+---------+-----------+----+-------------+-----+------------+-----+
 +| pg-cluster-0 | 10.244.0.9  | Leader  | running   |  6 |             |     |            |     |
 +| pg-cluster-1 | 10.244.2.16 | Replica | streaming |  6 |   0/60002B0 |   0 |  0/60002B0 |   0 |
 +| pg-cluster-2 | 10.244.1.15 | Replica | streaming |  6 |   0/60002B0 |   0 |  0/60002B0 |   0 |
 ++--------------+-------------+---------+-----------+----+-------------+-----+------------+-----+
 +
 +=== PostgreSQL pod-ok elhelyezkedése ===
 +
 +POD                  ROLE       NODE            READY    RESTARTS
 +pg-cluster-0         leader     kube01          5/5      0       
 +pg-cluster-1         replica    kube03          5/5      13      
 +pg-cluster-2         replica    kube02          5/5      0       
 +
 +=== Leader(ek) ===
 +
 +pg-cluster-0
 +
 +=====================================================
 +</code>
 +
  
 ===== Tesztelés ===== ===== Tesztelés =====
Sor 591: Sor 819:
 </code> </code>
  
 +===== Mentés, helyreállítás =====
 +
 +=== Előkészítő műveletek ===
 +
 +== Felhasználó és adatbázis létrehozás ==
 +
 +A mentés teszteléséhez szükséges felhasználó és adatbázisok létrehozása.
 +
 +<code>
 +$ kubectl exec -n $NAMESPACE -it pg-cluster-0 -c postgres-util -- bash
 +bash-4.4$ createuser eesztuser
 +bash-4.4$ createdb -O eesztuser eesztdb
 +bash-4.4$ createdb -O eesztuser eesztdb_restore
 +bash-4.4$ exit
 +exit
 +</code>
 +
 +Teszt tábla létrehozása, adatok feltöltése
 +
 +<code>
 +$ kubectl exec -n $NAMESPACE -it pg-cluster-0 -c postgres-util -- psql -U eesztuser -d eesztdb
 +psql (18.3 (OnGres 18.3-build-6.49))
 +Type "help" for help.
 +
 +eesztdb=> CREATE TABLE backup_test (
 +eesztdb(>     id           BIGSERIAL PRIMARY KEY,
 +eesztdb(>     created_at   TIMESTAMPTZ NOT NULL DEFAULT now(),
 +eesztdb(>     username     VARCHAR(50) NOT NULL,
 +eesztdb(>     email        VARCHAR(100),
 +eesztdb(>     amount       NUMERIC(12,2),
 +eesztdb(>     active       BOOLEAN DEFAULT true,
 +eesztdb(>     note         TEXT
 +eesztdb(> );
 +CREATE TABLE
 +eesztdb=> INSERT INTO backup_test
 +eesztdb-> (username,email,amount,active,note)
 +eesztdb-> SELECT
 +eesztdb->     'user' || g,
 +eesztdb->     'user' || g || '@example.com',
 +eesztdb->     round((random()*10000)::numeric,2),
 +eesztdb->     random() > 0.2,
 +eesztdb->     md5(random()::text)
 +eesztdb-> FROM generate_series(1,10000) g;
 +INSERT 0 10000
 +eesztdb=> SELECT count(*) FROM backup_test;
 + count 
 +-------
 + 10000
 +(1 row)
 +
 +eesztdb=> \q
 +</code>
 +
 +==== Mentő szkript ====
 +
 +A szkript kiolvassa a használt névteret, és az elsődleges POD-ot.
 +
 +<file bash 03-stackgres-postgresql-backup.sh>
 +#!/usr/bin/env bash
 +
 +DEBUG=1
 +TIMESTAMP=$(date +%Y%m%d_%H%M%S)
 +
 +PGDATABASE=eesztdb
 +PGUSER=eesztuser
 +
 +NAMESPACE=$(kubectl get sgcluster --no-headers -A | awk '{ print $1 }')
 +PRIMARY=$(kubectl get pod -n $NAMESPACE -l app=StackGresCluster,role=primary -o jsonpath='{.items[0].metadata.name}')
 +
 +if [ $DEBUG -gt 0 ] ; then
 +    echo "NAMESPACE: $NAMESPACE"
 +    echo "PRIMARY: $PRIMARY"
 +fi
 +
 +if [ -z "$PRIMARY" ] ; then
 +    echo "Nem található primary pod"
 +    exit 1
 +fi
 +
 +kubectl exec -n "$NAMESPACE" "$PRIMARY" -c postgres-util -- pg_dump -U "$PGUSER" -d "$PGDATABASE" --no-owner --no-privileges > "$PGDATABASE"_"$TIMESTAMP".sql
 +</file>
 +
 +Futtatás eredménye
 +
 +<code>
 +$ ./03-stackgres-postgresql-backup.sh 
 +NAMESPACE: lapodb-postgres
 +PRIMARY: pg-cluster-0
 +
 +$ ls -1
 +eesztdb_20260610_162054.sql
 +</code>
 +
 +==== Helyreállító szkript ====
 +
 +A helyreállítás az ''eesztdb_restore'' adatbázist használja.
 +
 +<file bash 03-stackgres-postgresql-restore.sh>
 +#!/usr/bin/env bash
 +
 +DEBUG=1
 +
 +if [ $# -ne 1 ] ; then
 +    echo "Használat: $0 backupfile.sql"
 +    exit 1
 +fi
 +
 +BACKUP_FILE="$1"
 +
 +if [ ! -f "$BACKUP_FILE" ] ; then
 +    echo "Nem található a mentési fájl: $BACKUP_FILE"
 +    exit 1
 +fi
 +
 +PGDATABASE=eesztdb_restore
 +PGUSER=eesztuser
 +
 +NAMESPACE=$(kubectl get sgcluster --no-headers -A | awk '{ print $1 }')
 +PRIMARY=$(kubectl get pod -n "$NAMESPACE" -l app=StackGresCluster,role=primary -o jsonpath='{.items[0].metadata.name}')
 +
 +if [ $DEBUG -gt 0 ] ; then
 +    echo "NAMESPACE: $NAMESPACE"
 +    echo "PRIMARY: $PRIMARY"
 +    echo "BACKUP_FILE: $BACKUP_FILE"
 +fi
 +
 +if [ -z "$PRIMARY" ] ; then
 +    echo "Nem található primary pod"
 +    exit 1
 +fi
 +
 +kubectl exec -i -n "$NAMESPACE" "$PRIMARY" -c postgres-util -- psql -U "$PGUSER" -d "$PGDATABASE" < "$BACKUP_FILE"
 +</file>
 +
 +Futtatás eredménye
 +
 +<code>
 +$ ./03-stackgres-postgresql-restore.sh eesztdb_20260610_162054.sql 
 +NAMESPACE: lapodb-postgres
 +PRIMARY: pg-cluster-0
 +BACKUP_FILE: eesztdb_20260610_162054.sql
 +SET
 +SET
 +SET
 +SET
 +SET
 +SET
 + set_config 
 +------------
 + 
 +(1 row)
 +
 +SET
 +SET
 +SET
 +SET
 +SET
 +SET
 +CREATE TABLE
 +CREATE SEQUENCE
 +ALTER SEQUENCE
 +ALTER TABLE
 +COPY 10000
 + setval 
 +--------
 +  10000
 +(1 row)
 +
 +ALTER TABLE
 +</code>
 +
 +==== Ellenőrzés ====
 +
 +<code>
 +$ kubectl exec -n $NAMESPACE -it pg-cluster-0 -c postgres-util -- psql -U eesztuser -d eesztdb -c "SELECT count(*) FROM backup_test"
 + count 
 +-------
 + 10000
 +(1 row)
 +
 +$ kubectl exec -n $NAMESPACE -it pg-cluster-0 -c postgres-util -- psql -U eesztuser -d eesztdb_restore -c "SELECT count(*) FROM backup_test"
 + count 
 +-------
 + 10000
 +(1 row)
 +</code>
kubernetes/stackgres/monitoring.1781095594.txt.gz · legutóbbi módosítás: – Szerkesztő: riba.zoltan