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 TweetJak 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 ' ';
- VYTVOŘTE UŽIVATELE
- 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.