Categories
Database Backup

**

Andmebaasiadministraatorite (DBA) ja DevOps-inseneride jaoks, kes haldavad PostgreSQL-i tootmiskeskkonnas, on peaaegu nullilähedase taastepunkti eesmärgi (RPO) saavutamine esmatähtis ülesanne. PostgreSQL-i katastroofijärgse taastamise ja ajapunkti taastamise (PITR) võimaluste keskmes on Write-Ahead Logging (WAL). Kuigi WAL tagab ACID-ühilduvuse, logides tehingud enne nende kirjutamist andmefailidesse, on WAL-i arhiveerimine mehhanism, mis säilitab need logid pikaajaliseks varundamiseks ja replikatsiooniks.

Kuid WAL-i arhiveerimise konfigureerimine ei ole „seadista ja unusta“ tüüpi toiming. Valed konfiguratsioonid, vaikivad tõrked ja arhitektuursed arusaamatused võivad viia katastroofilise andmekao, „split-brain“ stsenaariumide või täielike andmebaasi katkestusteni.

Selles põhjalikus juhendis uurime PostgreSQL-i WAL-i arhiveerimise arhitektuuri, tuvastame kõige levinumad lõksud, mis viivad andmekaoni, ja toome välja tootmiskeskkonna parimad tavad, et tagada teie andmebaasi vastupidavus.

PostgreSQL-i WAL-i arhitektuuri mõistmine

Enne lõksudesse süvenemist on kriitilise tähtsusega mõista, kuidas PostgreSQL tehingulogisid käsitleb.

PostgreSQL kirjutab kõik muudatused WAL-i segmentidesse (vaikimisi 16 MB failid), mis asuvad pg_wal kataloogis (varasemates versioonides enne 10. versiooni pg_xlog). Iga tehing salvestatakse järjestikku, tähistatuna logijada numbriga (LSN).

Kui WAL-i segment täitub, lülitub PostgreSQL uuele. Et vältida pg_wal kataloogi lõputut kasvamist, taaskasutab või eemaldab PostgreSQL vanad WAL-i segmendid, kui neid pole enam vaja krahhijärgseks taastamiseks või replikatsiooniks.

WAL-i arhiveerimine sekkub sellesse taaskasutusprotsessi. Kui archive_mode on lubatud, käivitab PostgreSQL kasutaja määratud archive_command käsu (või kasutab archive_library funktsiooni PostgreSQL 15+ versioonis), et kopeerida lõpetatud WAL-i segment turvalisse teise asukohta enne selle kustutamist või ülekirjutamist.

Ajapunkti taastamise (PITR) teostamiseks on vaja kahte komponenti:
1. Kehtivat baasvarukoopiat.
2. Katkematut arhiveeritud WAL-failide ahelat baasvarukoopia ajast kuni soovitud taastamisajani.

Kui see WAL-i ahel on katkenud, siis teie PITR ebaõnnestub.

WAL-i arhiveerimise konfigureerimine tootmiskeskkonna jaoks

WAL-i arhiveerimise lubamiseks peate muutma oma postgresql.conf faili. Põhikonfiguratsioon nõuab wal_level seadistamist, archive_mode lubamist ja archive_command määratlemist.

# postgresql.conf
wal_level = replica             # 'replica' või 'logical' on arhiveerimiseks vajalik
archive_mode = on               # Lubab arhiveerimisprotsessi
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # Sunnib WAL-i vahetust iga 10 minuti järel

archive_command käsus:
* %p tähistab arhiveeritava WAL-faili täielikku teed.
* %f tähistab WAL-faili nime.

Kuigi ülaltoodud konfiguratsioon tundub lihtne, toob lihtsatele shell-käskudele tuginemine ettevõtte keskkondades kaasa märkimisväärseid riske.

Levinud lõksud WAL-i arhiveerimisel

Lõks 1: archive_command „vaikiv õnnestumine“

PostgreSQL tugineb täielikult archive_command väljumiskoodile. Kui käsk tagastab 0, eeldab PostgreSQL, et WAL-fail on turvaliselt arhiveeritud, ja jätkab algse faili taaskasutamist.

Levinud viga on kasutada käsku, mis tagastab 0 isegi siis, kui andmeid ei ole turvaliselt püsivasse mällu kirjutatud. Näiteks lihtne cp käsk võib tagastada õnnestumise kohe, kui andmed jõuavad sihtserveri operatsioonisüsteemi vahemällu. Kui sihtserveris katkeb vool enne vahemälu kettale kirjutamist, läheb WAL-fail kaduma, kuid PostgreSQL on oma kohaliku koopia juba kustutanud.

Risk: Katkenud WAL-i ahel ja võimetus teostada PITR-i, mis avastatakse alles katastroofi taastamise käigus.

Leevendus: Veenduge, et teie arhiveerimisskript nõuab sünkroonseid kirjutamisi. Kui kasutate standardseid shell-käske, kasutage tööriistu, mis garanteerivad andmete kirjutamise kettale, või kirjutage ümbris-skript, mis kontrollib faili suurust ja kontrollsummat pärast ülekannet.

Lõks 2: pg_wal partitsiooni ammendumine (WAL-i paisumine)

Kui archive_command ebaõnnestub (tagastab muu kui nulli väljumiskoodi) – võrguprobleemide, valede õiguste või täis sihtketta tõttu – jätab PostgreSQL WAL-faili pg_wal kataloogi ja proovib käsku lõputult uuesti.

Kuigi see hoiab ära andmekao, kuna arhiveerimata WAL-e ei kustutata, tekitab see tõsise kättesaadavuse riski. Kui pg_wal kataloog asub partitsioonil, mis täitub 100%-liselt, väljastab PostgreSQL PANIC vea ja jookseb kokku. Andmebaas ei käivitu uuesti enne, kui ruumi on vabastatud.

Risk: Täielik andmebaasi seisak täis pg_wal partitsiooni tõttu.

Leevendus:
1. Paigutage pg_wal alati eraldi kettapartitsioonile.
2. Rakendage pg_wal kataloogi suuruse agressiivne monitooring.
3. Jälgige pg_stat_archiver vaadet, et tuvastada ebaõnnestuvad arhiveerimiskäsud viivitamatult.

Lõks 3: Puudulikud baasvarukoopiad

Baasvarukoopia on kasutu ilma WAL-failideta, mis on loodud varundusprotsessi ajal. Kui teete failisüsteemi tasemel hetktõmmise või kasutate pg_basebackup ilma WAL-ide voogedastuseta (-X stream), peate tagama, et varundamise alguse ja lõpu vahel loodud WAL-failid on edukalt arhiveeritud.

Kui teie arhiveerija on aeglane või ebaõnnestub ja need konkreetsed WAL-failid lähevad kaduma, ei saa baasvarukoopiat viia järjepidevasse olekusse.

Risk: Rikutud või taastamatud baasvarukoopiad.

Leevendus: Kasutage pg_basebackup -X stream, et lisada vajalikud WAL-failid varukoopia koosseisu, või kasutage ettevõtte tasemel varunduslahendusi, mis haldavad automaatselt sõltuvust baasvarukoopiate ja WAL-segmentide vahel.

Lõks 4: Ajajoone segadus ja „split-brain“ stsenaariumid

Kui ooterežiimi server (standby) edutatakse primaarseks, suurendab PostgreSQL „ajajoone ID-d“ (WAL-faili nime esimene osa, nt 0000000200000001000000A4). See takistab uuel primaarsel serveril vana primaarse serveri WAL-ajaloo ülekirjutamist.

Kui aga vana primaarne server käivitatakse kogemata ilma nõuetekohase isoleerimiseta (split-brain stsenaarium), võib see proovida WAL-faile samasse arhiiviasukohta lükata, kasutades vana ajajoont. Kui teie archive_command kirjutab failid pimesi üle, võite oma arhiivihoidla rikkuda.

Risk: Ülekirjutatud WAL-failid, rikutud arhiivid ja taastamatud andmebaasid.

Leevendus: Teie archive_command ei tohi kunagi olemasolevat faili üle kirjutada. Pange tähele, et eelmises põhikonfiguratsioonis kasutasime test ! -f /mnt/nfs/archive/%f, et ebaõnnestuda selgesõnaliselt, kui fail on juba olemas.

Andmekao riskide maandamine: Tootmiskeskkonna parimad tavad

Oma PostgreSQL-i arhiveerimisstrateegia tugevdamiseks rakendage järgmisi parimaid tavasid.

1. Jälgige arhiveerimisprotsessi natiivselt

PostgreSQL pakub sisseehitatud vaadet pg_stat_archiver, mis jälgib teie arhiveerimisprotsessi õnnestumist ja ebaõnnestumist. Peaksite selle vaate integreerima oma monitooringusüsteemi (nt Prometheus, Datadog või Zabbix).

SELECT 
    archived_count,
    last_archived_wal,
    last_archived_time,
    failed_count,
    last_failed_wal,
    last_failed_time,
    stats_reset
FROM pg_stat_archiver;

Konfigureeritavad hoiatuste läved:
* Hoiata, kui failed_count suureneb.
* Hoiata, kui ajaerinevus now() ja last_archived_time vahel ületab teie RPO läve (nt 15 minutit), pidades silmas, et vähese liiklusega andmebaasidel võib loomulikult esineda viivitusi, kui archive_timeout pole seatud.

2. Kasutage archive_timeout

Andmebaasides, kus on väike kirjutamismaht, võib 16 MB WAL-faili täitumine võtta tunde. Kuni see täitub, seda ei arhiveerita. Kui server jookseb kokku ja kohalik ketas läheb kaduma, kaotate tundide jagu tehinguid.

archive_timeout = 600 (10 minutit) seadistamine sunnib PostgreSQL-i lülituma uuele WAL-failile ja arhiveerima praeguse, isegi kui see pole täis. See garanteerib, et teie RPO ei ületa 10 minutit, makstes selle eest veidi suurema salvestusruumi kasutamisega osaliselt täidetud WAL-failide tõttu.

3. Üleminek archive_library kasutamisele (PostgreSQL 15+)

Ajalooliselt käivitas archive_command iga WAL-faili jaoks uue shell-protsessi. Suure läbilaskevõimega keskkondades, kus genereeritakse sadu WAL-faile minutis, muutub shell-protsesside loomise koormus jõudluse kitsaskohaks.

PostgreSQL 15 tutvustas archive_library parameetrit, mis võimaldab WAL-i arhiveerimist hallata dünaamiliselt laaditavate C-moodulitega. See kõrvaldab shell-protsesside loomise koormuse ja pakub palju vastupidavamat ning suure jõudlusega arhiveerimismehhanismi. Kui kasutate PostgreSQL 15 või uuemat versiooni, otsige varundustööriistu, mis toetavad kohandatud arhiivimooduleid.

4. Testige regulaarselt ajapunkti taastamist (PITR)

Testimata varukoopia ei ole varukoopia; see on soov. Ainus viis kontrollida, kas teie WAL-i arhiveerimine toimib õigesti, kas teie WAL-i ahel on katkematu ja kas teie baasvarukoopiad on järjepidevad, on teostada rutiinseid, automatiseeritud PITR-i teste.

Käivitage ajutine eksemplar, taastage baasvarukoopia, konfigureerige restore_command arhiivist tõmbamiseks ja taastage andmebaas konkreetse ajatemplini. Kontrollige, kas andmebaas jõuab järjepidevasse olekusse ja avaneb ühendusteks.

Ettevõtte tasemel varundamine ja taastamine koos CloudSave’iga

Kohandatud shell-skriptide haldamine archive_command jaoks, WAL-i deduplikatsiooni käsitlemine ja tehingulogide turvalise, välistalletuse tagamine võib kiiresti muutuda IT-meeskondade jaoks operatiivseks koormaks.

Siinkohal pakub CloudSave märkimisväärset väärtust ettevõtte PostgreSQL-i keskkondadele. CloudSave integreerub otse PostgreSQL-i natiivsete varundus- ja WAL-i arhiveerimise API-dega, et kõrvaldada eespool mainitud käsitsi tehtavad vead.

Selle asemel, et kirjutada hapraid bash-skripte, pakub CloudSave vastupidavat, agendipõhist või agendivaba integratsiooni, mis:
* Garanteerib kohaletoimetamise: Asendab standardsed shell-käsud kontrollitud, kontrollsummaga valideeritud ülekannetega turvalisse välistalletusse või pilve.
* Hoiab ära WAL-i paisumise: Jälgib aktiivselt pg_wal kataloogi ja hoiatab administraatoreid ammu enne partitsiooni ammendumist.
* Automatiseerib PITR-i: Lihtsustab ajapunkti taastamist intuitiivse liidese kaudu. Valite täpse minuti, milleni soovite taastada, ja CloudSave hangib automaatselt õige baasvarukoopia ning voogedastab täpse WAL-failide jada, mis on vajalik sellesse olekusse jõudmiseks.
* Haldab ajajooni: Haldab arukalt PostgreSQL-i ajajoone ajalugu, tagades, et tõrkesiirded ja split-brain stsenaariumid ei rikuks teie varukoopiate hoidlat.

Delegeerides WAL-i haldamise raske töö CloudSave’ile, saavad andmebaasiadministraatorid keskenduda päringute optimeerimisele ja andmebaasi jõudlusele, teades, et nende RPO ja RTO SLA-d on kaitstud ettevõtte tasemel platvormiga.

Kokkuvõte

PostgreSQL-i WAL-i arhiveerimine on andmebaasi katastroofijärgse taastamise selgroog. Kuigi faili kopeerimine ühest kataloogist teise tundub lihtne, kujutavad äärmuslikud juhud – vaikivad tõrked, ketta ammendumine ja ajajoone lahknevused – tõsiseid riske andmete terviklikkusele.

Mõistes pg_wal arhitektuuri, vältides rangelt destruktiivseid archive_command konfiguratsioone, jälgides pg_stat_archiver vaadet ja kasutades ettevõtte tasemel varundusplatvorme nagu CloudSave, saate luua vastupidava PostgreSQL-i infrastruktuuri, mis suudab üle elada riistvaratõrked, inimlikud eksimused ja katastroofilised katkestused, kaotamata ühtegi kinnitatud tehingut.

Avastage PostgreSQL-i WAL-i arhiveerimise levinud lõksud, mis viivad andmekaoni. Õppige ekspertide DBA parimaid tavasid, konfiguratsiooninõuandeid ja seda, kuidas tagada usaldusväärne ajapunkti taastamine (PITR) ettevõtte andmebaaside jaoks.