Pilguheit andmebaasi replikatsioonile suuremas mahus.. aga soodsalt. Spilo abil

Pilguheit andmebaasi replikatsioonile suuremas mahus.. aga soodsalt. Spilo abil

Craig Nielsen

Craig Nielsen

November 20, 2025

Ülevaade sellest, kuidas ja miks Postgres andmebaasiklaster töötab, miks seda valida ning kuidas see võib säästa raha ja elusid.

Kuidas Spilo/Patroni seadistab PostgreSQL-i ja WAL-G-d

Ülevaade

Spilo on Docker'i tõmmis, mis pakendab kokku PostgreSQL + Patroni + WAL-G/WAL-E. Kui Spilo konteiner käivitub, läbib see kindla alglaadimisprotsessi, mis loeb keskkonnamuutujaid ja genereerib konfiguratsioonifailid.

Seadistamise voog

Konteineri käivitus
     ↓
Keskkonnamuutujad (ConfigMap'ist)
     ↓
Spilo alglaadimise skript (/launch.sh)
     ↓
├── Genereerib Patroni konfiguratsiooni (/run/etc/patroni.yml)
│   └── Sisaldab PostgreSQL-i seadeid
│   └── Sisaldab WAL-G seadeid
│   └── Sisaldab varundamise ajakavasid
│
├── Käivitab Patroni
│   └── Patroni haldab PostgreSQL-i
│       └── Kirjutab postgresql.conf
│       └── Seadistab archive_command'i
│       └── Seadistab restore_command'i
│
└── Seadistab Cron'i tööd (kui varundamine on lubatud)
    └── Ajastab WAL-G varundamised

Samm-sammult: mis tegelikult toimub

1. Konteiner käivitub — alglaadimise skript käivitub

Spilo konteiner käivitab

/launch.sh
(või sarnase), mis on peamine alglaadimise skript.

Asukoht: Tavaliselt

/scripts/configure_spilo.py
või
/launch.sh

Mida see teeb:

  • Loeb KÕIK keskkonnamuutujad
  • Valideerib nõutud seaded
  • Teeb otsuseid nende keskkonnamuutujate põhjal

2. Genereerib Patroni konfiguratsiooni

Alglaadimise skript loob

/run/etc/patroni.yml
keskkonnamuutujate põhjal.

Näide genereeritud failist:

# /run/etc/patroni.yml
scope: acid-minimal-cluster
name: pod-name

postgresql:
  listen: 0.0.0.0:5432
  connect_address: pod-ip:5432
  data_dir: /home/postgres/pgdata/pgroot/data

  # Need tulevad keskkonnamuutujatest!
  parameters:
    archive_mode: "on"  # Seatud kui USE_WALG_BACKUP=true
    archive_timeout: 60s
    wal_level: replica
    # Kõige kriitilisem — archive_command genereeritakse keskkonnamuutujate põhjal:
    archive_command: "envdir /run/etc/wal-e.d/env wal-g wal-push %p"

  # Taastamiskäsk taastamiseks
  recovery_conf:
    restore_command: "envdir /run/etc/wal-e.d/env wal-g wal-fetch %f %p"

# Varundamise/WAL-G konfiguratsioon
postgresql:
  create_replica_methods:
    - basebackup_fast_xlog
  basebackup_fast_xlog:
    command: /scripts/basebackup.sh
    retries: 2

3. Genereerib WAL-G keskkonnafailid

Spilo loob kataloogi WAL-G konfiguratsiooniga:

/run/etc/wal-e.d/env/

Mis luuakse:

/run/etc/wal-e.d/env/
├── AWS_ACCESS_KEY_ID          # Sisaldab: minio
├── AWS_SECRET_ACCESS_KEY      # Sisaldab: minio123
├── AWS_ENDPOINT               # Sisaldab: http://mys3-hl.mys3:9000
├── AWS_REGION                 # Sisaldab: de01
├── AWS_S3_FORCE_PATH_STYLE    # Sisaldab: true
├── WALG_DISABLE_S3_SSE        # Sisaldab: true
├── WALG_S3_PREFIX             # Sisaldab: s3://postgresql/spilo/cluster-name/scope
└── WALE_S3_PREFIX             # Sisaldab: s3://postgresql/spilo/cluster-name/scope (vanema WAL-E jaoks)

See on KRIITILINE!

WALG_S3_PREFIX
või
WAL_S3_BUCKET
määrab, kuhu varukoopiad lähevad.

4. Koostab arhiveerimiskäsu

Keskkonnamuutujate põhjal genereerib Spilo PostgreSQL-i

archive_command'i
:

Kui USE_WALG_BACKUP=true:

archive_command = 'envdir /run/etc/wal-e.d/env wal-g wal-push %p'

Mida see teeb:

  • envdir /run/etc/wal-e.d/env
    — laeb kõik keskkonnamuutujad sellest kataloogist
  • wal-g wal-push %p
    — lükkab WAL-faili S3/MinIO-sse
  • %p
    — PostgreSQL asendab selle tegeliku WAL-faili teega

Kui USE_WALG_BACKUP=false:

archive_command = '/bin/true'  # Ei tee midagi, tagastab lihtsalt edu

5. Seadistab Cron'i tööd täisvarundamiseks

Kui

USE_WALG_BACKUP=true
ja
BACKUP_SCHEDULE
on seatud, loob Spilo cron'i töö:

Näide cron'i kirjest:

*/10 * * * * envdir /run/etc/wal-e.d/env wal-g backup-push /home/postgres/pgdata/pgroot/data

Selgitus:

  • */10 * * * *
    — iga 10 minuti järel (sinu BACKUP_SCHEDULE-st)
  • envdir /run/etc/wal-e.d/env
    — laeb keskkonna
  • wal-g backup-push
    — loob täisvarukoopia
  • /home/postgres/pgdata/pgroot/data
    — PostgreSQL-i andmekataloog

6. Käivitab Patroni

Seejärel Patroni:

  1. Loeb
    /run/etc/patroni.yml
  2. Käivitab PostgreSQL-i genereeritud konfiguratsiooniga
  3. Haldab pidevalt PostgreSQL-i (kõrgkäideldavus, tõrkesiire jne)
  4. Uuendab konfiguratsiooni vastusena muudatustele

7. PostgreSQL töötab genereeritud konfiguratsiooniga

PostgreSQL töötab nüüd järgmiste seadetega:

  • archive_mode = on
    (kui varundamine on lubatud)
  • archive_command = 'envdir /run/etc/wal-e.d/env wal-g wal-push %p'
  • Iga kord, kui WAL-fail on täis, kutsub PostgreSQL selle käsu välja
  • Käsk lükkab WAL-i MinIO-sse seadistatud lõpp-punktis

Mida Spilo tegelikult teeb:

  1. ✅ Loeb keskkonnamuutujaid käivitumisel
  2. ✅ Genereerib konfiguratsioonifailid (
    patroni.yml
    , WAL-G keskkonnafailid)
  3. ✅ Seadistab PostgreSQL-i
    archive_command'i
    vastavalt
    USE_WALG_BACKUP
    -ile
  4. ✅ Loob cron'i tööd täisvarundamiseks, kui lubatud
  5. ✅ Käivitab Patroni, mis käivitab PostgreSQL-i
  6. ❌ EI laadi ConfigMap'i muudatusi dünaamiliselt uuesti (nõuab pod'i taaskäivitust)

WAL-failide tihendusformaadid

Spilo/WAL-G saab kasutada erinevaid tihendusformaate:

  • .lzo — LZO (kiire, praegu kasutusel)
  • .lz4 — LZ4 (väga kiire)
  • .zst — Zstandard (parem tihendus)
  • .br — Brotli (kõrge tihendus)

Praegu kasutan LZO tihendust, mis on hea tasakaal kiiruse ja tihendusastme vahel.