A streaming replikáció beállítása két PostgreSQL szerver között

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ább replica (PostgreSQL 9.6+) vagy hot_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 a pg_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 a synchronous_commit = on és a synchronous_standby_names = 'ANY 1 (standby_application_name)' paramétereket kell beállítani, ahol az application_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 egy trigger 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 a wal_level, max_wal_senders, hot_standby és primary_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

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük