A modern informatikai rendszerekben az adatok az egyik legértékesebb erőforrást jelentik. Ennek megfelelően kritikus fontosságú az adatbázisok folyamatos rendelkezésre állása és az adatok sértetlensége. A PostgreSQL, mint a világ egyik legfejlettebb nyílt forráskódú relációs adatbázis-kezelő rendszere, számos robusztus funkciót kínál e célok eléréséhez. Ezek közül az egyik legfontosabb a streaming replikáció, amely lehetővé teszi az adatok valós idejű szinkronizálását több szerver között. Ebben a cikkben részletesen bemutatjuk, hogyan állíthatja be a streaming replikációt két PostgreSQL szerver között, lépésről lépésre haladva, hogy adatbázisa magas rendelkezésre állását és katasztrófa-helyreállítási képességét biztosítsa.
Mi az a Streaming Replikáció és Miért Fontos?
A streaming replikáció egy olyan mechanizmus, amely lehetővé teszi, hogy egy PostgreSQL adatbázis összes tranzakcióját valós időben továbbítsuk egy úgynevezett „primer” (elsődleges) szerverről egy vagy több „standby” (tartalék) szerverre. Ez a folyamat a WAL (Write-Ahead Log) fájlok, azaz a tranzakciós naplók folyamatos streamelésével történik. Amint egy tranzakció lezajlik a primer szerveren, annak WAL rekordjai azonnal elküldésre kerülnek a standby szerver(ek)re, ahol azok újra lejátszásra kerülnek, ezzel biztosítva a standby adatbázis naprakész állapotát.
A streaming replikáció beállítása számos előnnyel jár:
- Magas Rendelkezésre Állás (HA): Ha a primer szerver meghibásodik, a standby szerver pillanatok alatt átveheti a szerepét, minimalizálva az állásidőt.
- Adatvédelem és Katasztrófa-helyreállítás: Ha egy súlyos probléma (pl. hardverhiba, természeti katasztrófa) éri a primer szervert, a standby szerveren lévő adatok megmenthetők, vagy gyorsan üzembe helyezhetők.
- Terheléselosztás: A standby szerverek hot standby módban képesek csak olvasható lekérdezéseket fogadni, ezzel tehermentesítve a primer szervert, és javítva az alkalmazás teljesítményét.
- Adatbázis frissítés és karbantartás: Lehetővé teszi a null-downtime frissítéseket vagy karbantartási feladatokat, amikor az egyik szerver karbantartás alatt van, a másik továbbra is kiszolgálja a kéréseket.
Előfeltételek és Alapfogalmak
Mielőtt belekezdenénk a konfigurációba, győződjünk meg a következőkről:
- Két PostgreSQL szerver: Egy primer és egy standby szerver. Ideális esetben azonos hardverkonfigurációval és operációs rendszerrel.
- Azonos PostgreSQL verzió: A primer és standby szervereken futó PostgreSQL szoftvernek azonos főverziójúnak kell lennie (pl. mindkettő 15.x).
- Hálózati kapcsolat: A primer és standby szervereknek képesnek kell lenniük kommunikálni egymással a PostgreSQL porton (alapértelmezés szerint 5432).
- SSH hozzáférés: A parancsok futtatásához és a fájlok másolásához.
- PostgreSQL felhasználó: Egy erre a célra létrehozott replikációs felhasználóra lesz szükségünk.
Néhány alapfogalom, amit érdemes megérteni:
wal_level
: Meghatározza, hogy milyen szintű információ kerüljön be a WAL-ba. Replikációhoz legalábbreplica
(PostgreSQL 9.6+) vagyhot_standby
(régebbi verziók) értékre van szükség.max_wal_senders
: A primer szerveren, ez a paraméter szabályozza, hány egyidejű WAL küldő folyamat futhat. A standby szerverek és apg_basebackup
is egy-egy ilyen folyamatot igényel.hot_standby
: A standby szerveren engedélyezi az írásvédett lekérdezéseket.primary_conninfo
: A standby szerveren konfigurálja a primer szerverhez való csatlakozási paramétereket.
1. lépés: Primer Szerver Konfigurálása
Először a primer szervert kell felkészítenünk a replikációra.
1.1. postgresql.conf
Módosítások
Keresse meg a PostgreSQL adatkönyvtárában (gyakran /var/lib/postgresql/<verzió>/main
) található postgresql.conf
fájlt, és módosítsa a következő paramétereket:
# Engedélyezi a külső kapcsolatokat
listen_addresses = '*'
# Szükséges a replikációhoz
wal_level = replica
# Hány replikációs slot lehet nyitva
max_wal_senders = 10 # Vagy a szükséges szám, plusz a pg_basebackup-nak 1
# Ennyi idő után mentse a WAL fájlokat
wal_keep_size = 1024 # MB-ban, vagy amennyi WAL fájlt meg akar tartani
# Hot standby engedélyezése (bár ez a standby-n kell)
# archive_mode és archive_command csak WAL archíváláshoz kell, de hasznos lehet
# archive_mode = on
# archive_command = 'cp %p /mnt/wal_archive/%f'
A wal_keep_size
fontos, mert biztosítja, hogy a primer szerver elegendő WAL fájlt tartson meg ahhoz, hogy a standby szerver felzárkózzon, még egy rövid hálózati megszakítás után is. Túl alacsony érték esetén a standby „elveszítheti” a primert.
1.2. pg_hba.conf
Módosítások
Ugyanebben a könyvtárban található a pg_hba.conf
fájl, amely a klienshitelesítést szabályozza. Ide kell felvennünk egy sort, amely engedélyezi a replikációs felhasználónk számára a csatlakozást a standby szerver IP-címéről:
# Allow replication connections from standby server
host replication replicator 192.168.1.10/32 md5
Cserélje le az 192.168.1.10
-et a standby szerver tényleges IP-címére, és a replicator
-t a használni kívánt replikációs felhasználónévre.
1.3. Replikációs Felhasználó Létrehozása
Csatlakozzon a primer szerver PostgreSQL adatbázisához (pl. psql -U postgres
), és hozzon létre egy felhasználót a REPLICATION
attribútummal:
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'jelszavam';
1.4. Primer Szerver Újraindítása
A módosítások érvénybe lépéséhez újra kell indítani a PostgreSQL szolgáltatást a primer szerveren:
sudo systemctl restart postgresql
2. lépés: Standby Szerver Előkészítése és Alapmentés (Base Backup)
Most, hogy a primer szerver készen áll, készítsünk egy alapmentést a standby szerverre.
2.1. Állítsa Le a PostgreSQL-t a Standby Szerveren
Mielőtt bármilyen adatot másolnánk, állítsa le a PostgreSQL szolgáltatást a standby szerveren:
sudo systemctl stop postgresql
2.2. Törölje a Meglévő Adatkönyvtárat (Ha Létezik)
Ha a standby szerveren már van egy PostgreSQL adatkönyvtár, azt el kell távolítani, mivel a pg_basebackup
létrehozza a sajátját. Győződjön meg róla, hogy a helyes szerveren van!
sudo rm -rf /var/lib/postgresql/<verzió>/main/*
2.3. Alapmentés Készítése a pg_basebackup
Segítségével
A pg_basebackup
eszköz segítségével másoljuk le a primer szerver teljes adatkönyvtárát a standby szerverre. Ezt a standby szerverről kell futtatni:
sudo -u postgres pg_basebackup -h 192.168.1.20 -D /var/lib/postgresql/<verzió>/main -U replicator -v -P --wal-method=stream
Magyarázat az opciókhoz:
-h 192.168.1.20
: A primer szerver IP-címe.-D /var/lib/postgresql/<verzió>/main
: A cél adatkönyvtár a standby szerveren.-U replicator
: A primer szerveren létrehozott replikációs felhasználó.-v
: Részletes kimenet.-P
: Folyamatjelző sáv.--wal-method=stream
: A WAL fájlok streamelése a mentés során.
A parancs kérni fogja a replicator
felhasználó jelszavát. Adja meg.
3. lépés: Standby Szerver Konfigurálása
Az alapmentés elkészítése után konfiguráljuk a standby szervert, hogy csatlakozzon a primerhez.
3.1. Konfiguráció a postgresql.conf
-ban (PostgreSQL 12+)
A PostgreSQL 12-es verziójától kezdve a recovery.conf
fájl elavult. Helyette a primary_conninfo
és a hot_standby
paramétereket közvetlenül a postgresql.conf
fájlba (vagy a postgresql.auto.conf
fájlba) kell beírni, és létre kell hozni egy üres standby.signal
fájlt az adatkönyvtárban.
Keresse meg a standby szerver postgresql.conf
fájlját, és módosítsa a következőket:
# Engedélyezi a külső kapcsolatokat
listen_addresses = '*'
# Ez kell, ha csak olvasható lekérdezéseket akarunk futtatni a standby-n
hot_standby = on
# Csatlakozási adatok a primer szerverhez
primary_conninfo = 'host=192.168.1.20 port=5432 user=replicator password=jelszavam'
# Opcionális: Szükséges lehet, ha a primer nem tud elegendő WAL-t megtartani
# restore_command = 'cp /mnt/wal_archive/%f %p'
# Ha archíválást is használunk és van archívum, ahonnan vissza tud állni a standby
Fontos: Cserélje ki az IP-címet, felhasználónevet és jelszót a tényleges adatokra. A jelszót általában nem javasolt közvetlenül a postgresql.conf
-ba írni éles környezetben; ehelyett használjon ~/.pgpass
fájlt a postgres
felhasználó számára.
Ezenkívül, hozzon létre egy üres standby.signal
fájlt a standby szerver adatkönyvtárában:
sudo touch /var/lib/postgresql/<verzió>/main/standby.signal
sudo chown postgres:postgres /var/lib/postgresql/<verzió>/main/standby.signal
3.2. Standby Szerver Indítása
Indítsa el a PostgreSQL szolgáltatást a standby szerveren:
sudo systemctl start postgresql
4. lépés: Replikáció Ellenőrzése
Gratulálunk! A replikáció beállítása megtörtént. Most ellenőrizzük, hogy minden megfelelően működik-e.
4.1. Ellenőrzés a Primer Szerveren
Csatlakozzon a primer szerver PostgreSQL adatbázisához, és ellenőrizze a pg_stat_replication
nézetet:
psql -U postgres -c "SELECT pid, application_name, client_addr, state, sync_state, sync_priority FROM pg_stat_replication;"
Látnia kell egy sort, amely a standby szervert képviseli, streaming
állapotban. A sync_state
lehet async
(aszinkron) vagy sync
(szinkron), attól függően, hogy hogyan konfigurálta a szinkron replikációt.
4.2. Ellenőrzés a Standby Szerveren
Csatlakozzon a standby szerver PostgreSQL adatbázisához, és ellenőrizze a következő funkciókat:
psql -U postgres -c "SELECT pg_is_in_recovery();"
psql -U postgres -c "SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();"
A pg_is_in_recovery()
függvénynek t
(true) értéket kell visszaadnia. A pg_last_wal_receive_lsn()
és pg_last_wal_replay_lsn()
értékeknek közel azonosnak kell lenniük, és folyamatosan növekedniük kell, jelezve, hogy a standby szerver fogadja és újra játssza a WAL tranzakciókat.
Próbáljon meg létrehozni egy adatbázist vagy táblát a primer szerveren, majd ellenőrizze, hogy az megjelenik-e a standby szerveren (de ne próbáljon meg adatot módosítani a standby-n, mert az csak olvasható).
Haladó Témák és Megfontolások
Replikációs késés (Replication Lag)
Fontos monitorozni a replikációs késést, ami azt jelzi, hogy mennyire maradt le a standby a primer mögött. Ezt a primer szerveren a pg_stat_replication
nézet segítségével, vagy a standby szerveren a pg_last_wal_replay_lsn()
függvény és a primer szerveren található aktuális LSN összehasonlításával tehetjük meg.
Szinkron vs. Aszinkron Replikáció
- Aszinkron replikáció (alapértelmezett): A primer szerver azonnal nyugtázza a tranzakciót, amint azt a saját WAL-jába írta, anélkül, hogy megvárná, amíg a standby is megkapja és feldolgozza. Ez gyorsabb írási teljesítményt biztosít, de adatvesztés kockázatával járhat primer hiba esetén.
- Szinkron replikáció: A primer szerver csak akkor nyugtázza a tranzakciót, ha azt legalább egy standby szerver is megkapta és/vagy lemezre írta. Ez maximális adatbiztonságot nyújt, de lassabb írási teljesítményt eredményezhet. Beállításához a primer
postgresql.conf
-jában asynchronous_commit = on
és asynchronous_standby_names = 'ANY 1 (standby_application_name)'
paramétereket kell beállítani, ahol azapplication_name
a standby szerveren konfigurált név.
Failover és Switchover
- Failover: Akkor következik be, amikor a primer szerver meghibásodik, és a standby-t kell átállítani primer szerepkörbe. Ez általában manuális beavatkozást vagy automatikus failover eszközöket igényel. A standby-n futtatni kell a
pg_ctl promote
parancsot vagy létre kell hozni egytrigger
fájlt az adatkönyvtárban. - Switchover: Egy tervezett szerepcsere, amikor a jelenlegi primert leállítják és standby-vá teszik, miközben az egyik standby-t promótálják primer szerepkörbe. Ez lehetővé teszi a rendszer karbantartását állásidő nélkül.
Automatikus Failover Eszközök
Éles környezetben gyakran használnak harmadik féltől származó eszközöket az automatikus failover és a klaszter kezelésére. Ilyenek például a Patroni, a repmgr vagy a pg_auto_failover. Ezek az eszközök figyelik a klaszter állapotát, automatikusan kezelik a failovert, és egyszerűsítik a replikációs topológia fenntartását.
Hibaelhárítás
Ha a replikáció nem indul el, vagy nem működik megfelelően, ellenőrizze a következőket:
- Hálózati kapcsolat és tűzfal: Győződjön meg róla, hogy a szerverek elérik egymást a PostgreSQL porton (5432).
pg_hba.conf
: Ellenőrizze, hogy a replikációs felhasználó számára engedélyezett-e a csatlakozás a standby IP-címéről.postgresql.conf
: Ellenőrizze awal_level
,max_wal_senders
,hot_standby
ésprimary_conninfo
paramétereket.- Jelszavak és felhasználónevek: Győződjön meg róla, hogy a replikációs felhasználó jelszava és neve helyes.
- Naplófájlok: Nézze meg a primer és standby szerverek PostgreSQL naplófájljait (
pg_log
könyvtár az adatkönyvtárban) hibaüzenetekért. - Fájl jogosultságok: A PostgreSQL adatkönyvtárnak és tartalmának a
postgres
felhasználó tulajdonában kell lennie.
Összegzés
A PostgreSQL streaming replikáció beállítása egy alapvető lépés az adatbázisok magas rendelkezésre állásának és katasztrófa-helyreállítási képességének biztosításában. Bár elsőre bonyolultnak tűnhet, a fent leírt lépéseket követve viszonylag egyszerűen elvégezhető. Ne feledje, hogy éles környezetben mindig tesztelje a beállításokat, és fontolja meg automatikus failover eszközök használatát a rendszer robusztusságának növelése érdekében. A jól konfigurált replikációval jelentősen csökkentheti az adatvesztés kockázatát és minimalizálhatja az esetleges leállásokból eredő üzleti hatásokat.
Reméljük, ez az átfogó útmutató segít Önnek sikeresen beállítani a PostgreSQL streaming replikációját!
Leave a Reply