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.
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_connectionsalapé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. Asuperuser_reserved_connectionsalapból 3, areserved_connectionsalapból 0, alisten_addressespedig 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 apg_upgradejön szóba, és a kiadási megjegyzések Migration szakaszát át kell olvasni. Apg_upgradefigyelmeztet: 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.