Vissza az eszközökhöz

Adatréteg

PostgreSQL

A PostgreSQL objektum-relációs adatbázis: MVCC tranzakciók, bővíthető mag pgvectorral, pg_dump és WAL mentés, valamint az üzemeltetés dokumentált korlátai.

3 perc olvasás

A PostgreSQL objektum-relációs adatbázis-kezelő rendszer (ORDBMS), amely a Berkeley-n fejlesztett POSTGRES kódból indult, és ma szabad licenccel érhető el. Az SQL szabvány nagy részét lefedi, és bővíthető: saját függvények, adattípusok, operátorok és indexmódszerek építhetők a magba. Nálunk ez a döntő tulajdonság, mert így a relációs adat és a vektoros keresés ugyanabban a tranzakciós rendszerben marad.

A PostgreSQL a konténeres adatrétegünk alapja: alkalmazásonként egy adatbázis, egy konténer, a perzisztens adat csatolt volume-on. A futási környezetet a Docker adja, az adat élettartama így független a konténerétől.

Hogyan biztosítja a konzisztenciát?

A válasz a többszörös verziójú konkurenciakezelés (MVCC): minden SQL utasítás pillanatképet lát az adatbázisról abból az időpontból, amikor elindult, függetlenül az alatta lévő sorok aktuális állapotától. Ez adja a tranzakcióelszigeteltséget: az olvasáshoz szerzett zár nem ütközik az íráshoz szerzett zárral, ezért az olvasás nem blokkolja az írást, és fordítva.

  • Read Committed az alapértelmezett szint: a lekérdezés csak a megkezdése előtt commitolt adatot látja, és egy tranzakció két egymást követő utasítása már más adatot is láthat.
  • Repeatable Read ennél szigorúbb, és a PostgreSQL megvalósításában phantom read sem fordulhat elő.
  • Serializable a Serializable Snapshot Isolation (SSI) technikán alapul; a dokumentáció szerint a predikátumzárak memóriahiánya növelheti a szerializációs hibák arányát.
  • A sorozatok kivételek: a sequence-ek és a serial oszlopok számlálója azonnal látszik más tranzakciókból, és nem gördül vissza, ha a tranzakció megszakad.

Kiterjesztések: itt lép be a pgvector

A CREATE EXTENSION egy kiterjesztés szkriptjét futtatja le az aktuális adatbázisban, és nyilvántartja a létrehozott objektumokat, hogy a DROP EXTENSION el tudja takarítani őket. A betöltés jellemzően superuser jogot kér, kivéve, ha a kiterjesztés a vezérlőfájljában megbízhatóként (trusted) van megjelölve; az elérhető kiterjesztések a pg_available_extensions nézetből listázhatók.

A pgvector vektoros hasonlóságkeresést ad a Postgreshez: egyszeres és félpontosságú, bináris és ritka vektorokat támogat, valamint L2, belső szorzat, koszinusz, L1, Hamming és Jaccard távolságot. Index nélkül pontos keresést végez, és minden sort végignéz; HNSW vagy IVFFlat indexszel közelítő keresésre váltunk, ami gyorsabb, de a visszaidézés (recall) romlik. A beágyazások így ugyanabban a tranzakciós rendszerben maradnak, mint a hozzájuk tartozó sorok.

Mentés és visszaállítás

A pg_dump konzisztens logikai exportot készít, és közben nem blokkolja a többi olvasót és írót: pg_dump dbname > dumpfile. A szöveges dumpot a psql tölti vissza, a tömörített custom (-Fc) és directory (-Fd) archívumot a pg_restore, és párhuzamos mentést csak a directory formátum támogat a -j kapcsolóval. A dokumentáció figyelmeztet: a visszatöltés a forrás superusereinek tetszőleges kódját futtatja, ezért megbízhatatlan forrású dumpot előbb át kell nézni.

A crash-biztonságot és a pont-idő szerinti helyreállítást (PITR) a write-ahead log adja: minden változás előbb a WAL-ba kerül, és csak utána az adatfájlokba, ezért egy commit csak a WAL lemezre írását igényli. A pg_wal szegmensfájljai alapból 16 MB-osak, és az archiválásuk egy fizikai bázismentéssel együtt bármely lefedett időpontra való visszaállítást lehetővé tesz. Az archiválást a wal_level, az archive_mode és az archive_command állítja be, és a dokumentáció szerint ezt még az első bázismentés előtt be kell állítani és tesztelni. A pg_dump és a pg_dumpall logikai mentés, ezért folyamatos archiváláshoz nem használható.

Üzemeltetési korlátok, amiket a projekt dokumentál

  • Kapcsolatok. A max_connections alapértéke jellemzően 100, és csak szerverindításkor állítható; növelése arányosan több megosztott memóriát és egyéb erőforrást foglal. A superuser_reserved_connections alapból 3, a reserved_connections alapból 0, a listen_addresses pedig csak a localhostot engedi.
  • Vacuum. Az UPDATE és a DELETE nem tünteti el azonnal a régi sorverziót, ezért rendszeres vacuumolás kell. A szabványos VACUUM a helyet újrafelhasználásra jelöli, de nem adja vissza az operációs rendszernek; a VACUUM FULL ezt megteszi, viszont ACCESS EXCLUSIVE zárat kér. Az autovacuum dinamikusan ütemez, VACUUM FULL-t soha nem indít, és a dokumentáció nem javasolja a kikapcsolását; ugyanez a kör véd a tranzakció-ID wraparound ellen.
  • Verziófrissítés. A minor kiadások nem változtatják az adatok tárolási formátumát, elég a binárisokat cserélni. A major kiadásoknál ez változhat: ilyenkor a pg_dumpall és a visszatöltés, vagy a pg_upgrade jön szóba, és a kiadási megjegyzések Migration szakaszát át kell olvasni. A pg_upgrade figyelmeztet: a frissítés a forrás superusereinek tetszőleges kódját futtatja.

Ezekkel a garanciákkal az adatbázis kiszámítható komponens. A karbantartási és mentési feladatokat nálunk az n8n ütemezi, az adatbázist olvasó ügynökök pedig a Hermes Agent alatt futnak.

Tovább olvasás

  • PostgreSQL 18 dokumentáció - a hivatalos kézikönyv, mindig az aktuális major verzióhoz.
  • pgvector - a vektoros keresés kiterjesztés forrása és README-je.
  • Routine Vacuuming - az automatikus vacuum, a táblák hízása és a wraparound elleni védelem részletei.

A CyberElectro a PostgreSQL-t konténerben, alkalmazásonként külön adatbázissal üzemelteti, vektoros kereséshez pedig a pgvector változatot használja.

Címkék
  • adatbázis
  • SQL
  • MVCC
  • kiterjesztés
  • pgvector