sql >> Databáze >  >> RDS >> PostgreSQL

Začínáme s replikací streamování PostgreSQL

V tomto příspěvku na blogu se ponoříme do matic a šroubů nastavení Streaming Replication (SR) v PostgreSQL. Replikace streamování je základním stavebním kamenem pro dosažení vysoké dostupnosti ve vašem hostingu PostgreSQL a je vytvářena spuštěním konfigurace master-slave.

Terminologie Master-Slave

Hlavní/primární server

  • Server, který může zapisovat.
  • Nazývá se také server pro čtení/zápis.

Slave/Standby Server

  • Server, kde jsou data nepřetržitě synchronizována s hlavním serverem.
  • Nazývá se také záložní server nebo replika.
  • Server v teplém pohotovostním režimu je server, ke kterému se nelze připojit, dokud není povýšen na hlavní server.
  • Naproti tomu server v horkém pohotovostním režimu může přijímat připojení a obsluhuje dotazy pouze pro čtení. Po zbytek této diskuse se zaměříme pouze na servery v horkém pohotovostním režimu.

Data jsou zapsána na hlavní server a šířena na podřízené servery. V případě, že dojde k problému se stávajícím hlavním serverem, převezme řízení jeden z podřízených serverů a bude pokračovat v zapisování zajišťující dostupnost systému.

Replikace založená na přepravě WAL

Co je WAL?

  • WAL je zkratka pro zápis napřed.
  • Je to soubor protokolu, do kterého jsou zapsány všechny úpravy databáze předtím, než jsou aplikovány/zapsány do datových souborů.
  • WAL se používá k obnově po havárii databáze a zajišťuje integritu dat.
  • WAL se používá v databázových systémech k dosažení atomicity a trvanlivosti.

Jak se WAL používá pro replikaci?

Záznamy protokolu zápisu se používají k udržení synchronizace dat mezi databázovými servery. Toho je dosaženo dvěma způsoby:

Doprava protokolů na základě souborů

  • Soubory protokolu WAL jsou odesílány z hlavního serveru na záložní servery, aby byla data synchronizována.
  • Master může přímo zkopírovat protokoly do úložiště pohotovostního serveru nebo může úložiště sdílet s pohotovostními servery.
  • Jeden soubor protokolu WAL může obsahovat až 16 MB dat.
  • Soubor WAL je odeslán až poté, co dosáhne této hranice.
  • To způsobí zpoždění replikace a také zvýší pravděpodobnost ztráty dat, pokud hlavní server selže a protokoly nejsou archivovány

Streamování záznamů WAL

  • Části záznamů WAL jsou streamovány databázovými servery, aby byla data synchronizována.
  • Pohotovostní server se připojí k hlavnímu serveru, aby přijal části WAL.
  • Záznamy WAL jsou streamovány tak, jak jsou generovány.
  • Streamování záznamů WAL nemusí čekat na zaplnění souboru WAL.
  • To umožňuje záložnímu serveru zůstat aktuálnější, než je možné u odesílání protokolů založených na souborech.
  • Ve výchozím nastavení je streamovaná replikace asynchronní, i když také podporuje synchronní replikaci.

Obě metody mají svá pro a proti. Použití odesílání na základě souborů umožňuje okamžité obnovení a nepřetržitou archivaci, zatímco streamování zajišťuje okamžitou dostupnost dat na záložních serverech. PostgreSQL však můžete nakonfigurovat tak, aby používal obě metody současně a využíval výhod. V tomto blogu se soustředíme hlavně na replikaci streamování, abychom dosáhli vysoké dostupnosti PostgreSQL.

Jak nastavit replikaci streamování v PostgreSQL pro vysokou dostupnost Kliknutím na Tweet

Jak nastavit replikaci streamování?

Nastavení streamovací replikace v PostgreSQL je velmi jednoduché. Za předpokladu, že PostgreSQL je již nainstalován na všech serverech, můžete začít podle následujících kroků:

Konfigurace na hlavním uzlu

  • Inicializujte databázi na hlavním uzlu pomocí nástroje initdb.
  • Vytvořte roli/uživatele s oprávněními pro replikaci spuštěním příkazu níže. Po spuštění příkazu to můžete ověřit spuštěním \du a jejich seznam na psql.
    •   VYTVOŘTE UŽIVATELE REPLIKACE PŘIHLÁŠENÍ ŠIFROVANÉ HESLO '';
  • Nakonfigurujte vlastnosti související s replikací streamování v hlavním konfiguračním souboru PostgreSQL (postgresql.conf):
    # Možné hodnoty jsou replika|minimální|logické
    wal_level =replica# je vyžadováno pro funkci pg_rewind, když se pohotovostní režim nesynchronizuje s master
    wal_log_hints =on# nastavuje maximální počet souběžných připojení z pohotovostních serverů.
    max_wal_senders =3
    # Níže uvedený parametr se používá k tomu, aby sdělil masteru, aby ponechal minimální počet
    # segmentů protokolů WAL, aby nebyly smazány dříve, než je spotřebuje pohotovostní režim.
    # každý segment je vymazán. 16 MB
    wal_keep_segments =8
    # Níže uvedený parametr umožňuje připojení pouze pro čtení na uzlu, když je v
    # pohotovostní roli. Toto je ignorováno, když server běží jako hlavní.
    hot_standby =zapnuto
  • Přidejte záznam replikace do souboru pg_hba.conf, abyste umožnili replikační připojení mezi servery:
    # Povolit replikační připojení z localhost,
    # uživatelem s oprávněním replikace.
    # TYPE    DATABÁZE    USER    ADRESA    METODA
    replikace hostitele    replikace    repl_user    IP adresa (CIDR)    md5
  • Restartujte službu PostgreSQL na hlavním uzlu, aby se změny projevily.

Konfigurace na pohotovostním uzlu (uzlech)

  • Vytvořte základní zálohu hlavního uzlu pomocí nástroje pg_basebackup a použijte jej jako výchozí bod pro pohotovostní režim.
    # Vysvětlení několika možností používaných pro nástroj pg_basebackup# -X se používá k zahrnutí požadovaných souborů protokolu transakcí (souborů WAL) do zálohy
    #. Když zadáte stream, otevře se druhé připojení k serveru
    # a začne se streamovat transakční protokol současně se spuštěním zálohy.
    # -c je volba kontrolního bodu. Nastavení na rychlé vynutí, aby byl kontrolní bod
    # brzy vytvořen.
    # -W přinutí pg_basebackup před připojením
    # k databázi požádat o heslo.
    pg_basebackup -D  -h -X stream -c fast -U repl_user -W
  • Vytvořte konfigurační soubor replikace, pokud není přítomen (je vytvořen automaticky, pokud je v pg_basebackup uvedena volba -R):
    # Určuje, zda se má server spustit jako pohotovostní režim. Při replikaci streamování musí být
    # tento parametr nastaven na on.
    standby_mode =‘on’# Určuje připojovací řetězec, který se používá pro připojení pohotovostního serveru
    # s primárním/masterem.
    primary_conninfo ='host= port= user= password= application_name=”host_name”’# Určuje obnovení na konkrétní časovou osu. Výchozí nastavení je obnovit podle
    # stejné časové osy, která byla aktuální, když byla pořízena základní záloha.
    # Nastavení na nejnovější obnovení podle poslední nalezené časové osy
    # v archivu, což je užitečné na záložním serveru.
    recovery_target_timeline =‘nejnovější’
  • Spusťte pohotovostní režim.

Konfiguraci pohotovostního režimu je třeba provést na všech serverech v pohotovostním režimu. Jakmile je konfigurace hotová a je spuštěn pohotovostní režim, připojí se k hlavnímu zařízení a spustí se streamování protokolů. Tím se nastaví replikace a lze ji ověřit spuštěním příkazu SQL „SELECT * FROM pg_stat_replication; “.

Ve výchozím nastavení je streamování replikace asynchronní. Pokud chcete, aby byl synchronní, můžete jej nakonfigurovat pomocí následujících parametrů:

# num_sync je počet synchronních pohotovostních režimů, ze kterých transakce
# musí čekat na odpovědi.
# standby_name je stejné jako hodnota application_name v recovery.conf
# Pokud mají být všechny pohotovostní servery považovány za synchronní, nastavte hodnotu '*'
# Pokud je třeba vzít v úvahu pouze konkrétní pohotovostní servery, zadejte je jako
# seznam standby_name oddělených čárkami .
# Název pohotovostního serveru pro tento účel je nastavení application_name pro
# pohotovostního režimu, jak je nastaveno v primárním_conninfo
# pohotovostního přijímače WAL.
synchronous_standby_names =‘num_sync ( standby_name [, ...] )’

Synchronous_commit musí být zapnuto pro synchronní replikaci a toto je výchozí nastavení. PostgreSQL poskytuje velmi flexibilní možnosti pro synchronní odevzdání a lze jej konfigurovat na úrovni uživatele/databáze. Platné hodnoty jsou následující:

  • Vypnuto – Potvrzení transakce je klientovi potvrzeno ještě předtím, než je záznam transakce skutečně vyprázdněn do souboru protokolu WAL v daném uzlu.
  • Místní –  Potvrzení transakce je klientovi potvrzeno až poté, co je záznam transakce vyprázdněn do souboru protokolu WAL v daném uzlu.
  • Vzdálený_zápis – Potvrzení transakce je klientovi potvrzeno až poté, co server(y) specifikovaný pomocí synchronous_standby_names potvrdí, že záznam transakce byl zapsán do mezipaměti disku, ale ne nutně po vyprázdnění do souboru protokolu WAL.
  • Zapnuto – Potvrzení transakce je klientovi potvrzeno až poté, co server(y) specifikovaný pomocí synchronous_standby_names potvrdí, že záznam transakce je vyprázdněn do souboru protokolu WAL.
  • Remote_apply – Potvrzení transakce je klientovi potvrzeno až poté, co server(y) specifikovaný pomocí synchronous_standby_names potvrdí, že záznam transakce je vyprázdněn do souboru protokolu WAL a je aplikován na databázi.

Nastavením synchronous_commit na off nebo local v režimu synchronní replikace bude fungovat jako asynchronní a může vám pomoci dosáhnout lepšího výkonu zápisu. To však bude představovat vyšší riziko ztráty dat a zpoždění čtení na záložních serverech. Pokud je nastaveno na remote_apply, zajistí okamžitou dostupnost dat na pohotovostních serverech, ale výkon zápisu se může snížit, protože by měl být aplikován na všech/zmíněných pohotovostních serverech.

Režim archivace můžete povolit, pokud plánujete používat průběžnou archivaci a obnovu v určitém okamžiku. I když to není povinné pro replikaci streamování, povolení režimu archivace má další výhody. Pokud režim archivace není zapnutý, musíme použít replikační sloty funkci nebo zajistit, aby wal_keep_segments hodnota je nastavena dostatečně vysoko na základě zatížení.

Další podrobnosti o vysoké dostupnosti v PostgreSQL naleznete v této vynikající prezentaci. V našem dalším příspěvku na blogu vás seznámíme se světem nástrojů používaných ke správě vysoké dostupnosti PostgreSQL pomocí streamingové replikace.


  1. Jak exportovat výsledky dotazu do souboru .txt při použití SQLcl (Oracle)

  2. Použití sledování kauzality k pochopení provádění dotazu

  3. Jak importuji soubor .sql do databáze mysql pomocí PHP?

  4. Referenční hodnota sériového sloupce v jiném sloupci při stejném INSERT