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

Vytvoření nastavení replikace PostgreSQL na Debian / Ubuntu

PostgreSQL může pracovat samostatně na více počítačích se stejnou datovou strukturou, díky čemuž je perzistentní vrstva aplikace odolnější a připravená na nějakou neočekávanou událost, která by mohla ohrozit kontinuitu služby.

Myšlenkou je zlepšit dobu odezvy systému distribucí požadavků v síti „Round Robin“, kde každý přítomný uzel je klastr. V tomto typu nastavení není důležité, kterému z nich budou požadavky doručeny ke zpracování, protože odpověď by byla vždy stejná.

V tomto blogu vysvětlíme, jak replikovat cluster PostgreSQL pomocí nástrojů poskytovaných při instalaci programu. Použitá verze je PostgreSQL 11.5, aktuální stabilní,  obecně dostupná verze pro operační systém Debian Buster. U příkladů v tomto blogu se předpokládá, že již znáte Linux.

Programy PostgreSQL

Uvnitř adresáře /usr/bin/ je program zodpovědný za správu clusteru.

# 1. Lists the files contained in the directory
# 2. Filters the elements that contain 'pg_' in the name
ls /usr/bin/ | grep pg_

Činnosti prováděné prostřednictvím těchto programů lze provádět postupně nebo dokonce v kombinaci s jinými programy. Spuštění bloku těchto aktivit pomocí jediného příkazu je možné díky linuxovému programu, který se nachází ve stejném adresáři a který se nazývá make.

Pro seznam přítomných clusterů použijte program pg_lsclusters. Ke spuštění můžete také použít make. Jeho práce závisí na souboru s názvem Makefile, který musí být ve stejném adresáři, kde bude příkaz spuštěn.

# 1. The current directory is checked
pwd

# 2. Creates a directory
mkdir ~/Documents/Severalnines/

# 3. Enroute to the chosen directory
cd ~/Documents/Severalnines/

# 4. Create the file Makefile
touch Makefile

# 5. Open the file for editing

Definice bloku je uvedena níže, má název ls a jediný program, který má být spuštěn, pg_lsclusters.

# 1. Block name
ls:
# 2. Program to be executed
pg_lsclusters

Soubor Makefile může obsahovat více bloků a každý může spouštět tolik programů, kolik potřebujete, a dokonce přijímat parametry. Je bezpodmínečně nutné, aby řádky náležející k bloku provádění byly správné, místo mezer použijte k odsazení tabulky.

Použití make ke spuštění programu pg_lsclusters se provádí pomocí příkazu make ls.

# 1. Executes pg_lsclusters
make ls

Výsledek získaný v nedávné instalaci PostgreSQL přináší jeden cluster s názvem main alokovaný na portu 5432 operačního systému. Při použití programu pg_createcluster je nově vytvořenému clusteru přidělen nový port s hodnotou 5432 jako výchozím bodem, dokud není nalezen jiný ve vzestupném pořadí.

Logging předem (WAL)

Tento postup replikace spočívá v vytvoření zálohy funkčního clusteru, který nadále přijímá aktualizace. Pokud se to však provede na stejném stroji, mnoho výhod, které tato technika přináší, se ztratí.

Horizontální škálování systému zajišťuje větší dostupnost služby, protože pokud by se vyskytly nějaké problémy s hardwarem, nic by to nezměnilo, protože jsou tu další stroje připravené převzít zátěž.

WAL je termín používaný k reprezentaci interního komplexního algoritmu pro PostgreSQL, který zajišťuje integritu transakcí prováděných v systému. Odpovědnost za přístup k němu s oprávněním k zápisu však musí mít pouze jeden cluster.

Architektura má nyní tři různé typy clusterů:

  1. Primář odpovědný za zápis do WAL;
  2. replika připravená převzít primární post;
  3. Různé další repliky s povinností čtení WAL.

Operace zápisu jsou jakékoli aktivity, které mají za cíl upravit datovou strukturu, buď zadáním nových prvků, nebo aktualizací a odstraněním existujících záznamů.

Konfigurace clusteru PostgreSQL

Každý cluster má dva adresáře, jeden obsahuje jeho konfigurační soubory a druhý obsahuje protokoly transakcí. Ty jsou umístěny v /etc/postgresql/11/$(cluster) a /var/lib/postgresql/11/$(cluster) (kde $(cluster) je název clusteru).

Soubor postgresql.conf se vytvoří ihned po vytvoření clusteru spuštěním programu pg_createcluster a vlastnosti lze upravit pro přizpůsobení clusteru.

Přímá úprava tohoto souboru se nedoporučuje, protože obsahuje téměř všechny vlastnosti. Jejich hodnoty byly zakomentovány se symbolem # na začátku každého řádku a několik dalších řádků zakomentovaných obsahujících pokyny pro změnu hodnot vlastností.

Je možné přidat další soubor obsahující požadované změny, jednoduše upravte jednu vlastnost s názvem include, přičemž výchozí hodnotu #include =‘’ nahraďte include =‘postgresql.replication.conf’.

Před spuštěním clusteru potřebujete přítomnost souboru postgresql.replication.conf ve stejném adresáři, kde najdete původní konfigurační soubor, nazvaný postgresql.conf.

# 1. Block name
create:
# 2. Creates the cluster
pg_createcluster 11 $(cluster) -- --data-checksums
# 3. Copies the file to the directory
cp postgresql.replication.conf /etc/postgresql/11/$(cluster)/
# 4. A value is assigned to the property
sed -i "s|^#include = ''|include = 'postgresql.replication.conf'|g" /etc/postgresql/11/$(cluster)/postgresql.conf

Použití --data-checksums při vytváření clusteru dodává datům vyšší úroveň integrity, stojí trochu výkonu, ale je velmi důležité, aby se předešlo poškození souborů při přeneseny z jednoho clusteru do druhého.

Výše popsané procedury lze znovu použít pro jiné clustery, jednoduše předáním hodnoty $(cluster) jako parametru při provádění programu make.

# 1. Executes the block 'create' by passing a parameter
sudo make create cluster=primary

Nyní, když byla zavedena krátká automatizace úloh, zbývá udělat definici souboru postgresql.replication.conf podle potřeby pro každý cluster.

Replikace na PostgreSQL

Jsou možné dva způsoby replikace clusteru, jeden je úplný, druhý zahrnuje celý cluster (tzv. Streaming Replication) a další může být částečný nebo úplný (tzv. Logická replikace).

Nastavení, která je nutné zadat pro cluster, spadají do čtyř hlavních kategorií:

  • Hlavní server
  • Pohotovostní servery
  • Odesílající servery
  • Odběratelé

Jak jsme viděli dříve, WAL je soubor, který obsahuje transakce, které jsou prováděny v clusteru, a replikace je přenos těchto souborů z jednoho clusteru do druhého.

Uvnitř nastavení v souboru postgresql.conf můžeme vidět vlastnosti, které definují chování clusteru ve vztahu k souborům WAL, jako je velikost těchto souborů.

# default values
max_wal_size = 1GB
min_wal_size = 80MB

Další důležitá vlastnost s názvem max_wal_senders. Příslušnost ke clusteru s charakteristickými odesílajícími servery je množství procesů odpovědných za odesílání těchto souborů do jiných clusterů, které musí mít vždy vyšší hodnotu než počet clusterů, které závisí na jejich příjmu.

Soubory WAL mohou být uloženy pro přenos do clusteru, který se připojuje pozdě nebo který měl nějaké problémy s jeho přijímáním a potřebuje předchozí soubory ve vztahu k aktuálnímu času, přičemž specifikací je vlastnost wal_keep_segments kolik segmentů souboru WAL má cluster udržovat.

Replikační slot je funkce, která umožňuje klastru ukládat soubory WAL potřebné k poskytování dalších klastrů se všemi záznamy, přičemž má jako vlastnost možnost max_replication_slots.

# default values
max_wal_senders = 10
wal_keep_segments = 0
max_replication_slots = 10

Pokud je záměrem outsourcovat ukládání těchto souborů WAL, lze použít jiný způsob zpracování těchto souborů, nazývaný průběžná archivace.

Nepřetržité archivování

Tento koncept vám umožňuje nasměrovat soubory WAL do konkrétního umístění pomocí linuxového programu a dvou proměnných představujících cestu k souboru a jeho název, například %p a %f, respektive.

Tato vlastnost je ve výchozím nastavení zakázána, ale její použití lze snadno implementovat odebráním odpovědnosti clusteru za ukládání tak důležitých souborů a lze ji přidat do souboru postgresql.replication.conf.

P>
# 1. Creates a directory
mkdir ~/Documents/Severalnines/Archiving

# 2. Implementation on postgresql.replication.conf
archive_mode = on
archive_command = 'cp %p ~/Documents/Severalnines/Archiving/%f'

# 3. Starts the cluster
sudo systemctl start [email protected]

Po inicializaci clusteru může být nutné upravit některé vlastnosti a může být vyžadován restart clusteru. Některé vlastnosti však lze pouze znovu načíst bez nutnosti úplného restartu clusteru.

Informace o těchto tématech lze získat prostřednictvím komentářů v souboru postgresql.conf, které se zobrazují jako # (poznámka:změna vyžaduje restart).

Pokud se jedná o tento případ, jednoduchý způsob, jak to vyřešit, je pomocí linuxového programu systemctl, který se dříve používal ke spuštění clusteru, stačí pouze přepsat možnost restartovat.

Pokud není vyžadován úplný restart, může cluster sám znovu přiřadit své vlastnosti prostřednictvím dotazu spuštěného v sobě, pokud však na stejném počítači běží více clusterů, bude nutné předat parametr obsahující hodnotu portu, který je clusteru přidělen v operačním systému.

# Reload without restarting
sudo -H -u postgres psql -c ‘SELECT pg_reload_conf();’ -p 5433

Ve výše uvedeném příkladu vlastnost archive_mode vyžaduje restart, zatímco archive_command nikoli. Po tomto krátkém úvodu k tomuto tématu se podíváme na to, jak může replikovaný cluster zálohovat tyto archivované soubory WAL pomocí Point In Time Recovery (PITR).

Obnova replikace PostgreSQL v určitém okamžiku

Tento sugestivní název umožňuje klastru vrátit se do svého stavu z určitého časového období. To se provádí prostřednictvím vlastnosti nazvané recovery_target_timeline, která očekává, že obdrží hodnotu ve formátu data, jako je 2019-08-22 12:05 GMT, nebo přiřazení nejpozději, informující o potřebě obnovení až do posledního existujícího záznamu.

Program pg_basebackup při spuštění vytvoří kopii adresáře obsahujícího data z clusteru do jiného umístění. Tento program má tendenci přijímat více parametrů, přičemž jedním z nich je -R, který vytvoří soubor s názvem recovery.conf ve zkopírovaném adresáři, který zase není stejný jako ten, který obsahuje jiné konfigurační soubory, které jsme viděli dříve, jako je postgresql.conf .

Soubor recovery.conf ukládá parametry předané při provádění programu pg_basebackup a jeho existence je nezbytná pro implementaci replikace datových proudů, protože v něm může zpětná operace k nepřetržité archivaci být proveden.

# 1. Block name
replicate:
# 2. Removes the current data directory
rm -rf /var/lib/postgresql/11/$(replica)
# 3. Connects to primary cluster as user postgres
# 4. Copies the entire data directory
# 5. Creates the file recovery.conf
pg_basebackup -U postgres -d postgresql://localhost:$(primaryPort) -D /var/lib/postgresql/11/$(replica) -P -R
# 6. Inserts the restore_command property and its value
echo "restore_command = 'cp ~/Documents/Severalnines/Archiving/%f %p'" >> /var/lib/postgresql/11/$(replica)/recovery.conf
# 7. The same is done with recovery_target_timeline
echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/11/$(replica)/recovery.conf

Tento výše uvedený replikační blok musí být spuštěn uživatelem postgres operačního systému, aby se předešlo potenciálním konfliktům s tím, kdo je vlastníkem dat clusteru, postgres nebo root uživatele.

Replikovaný klastr stále stojí a snaží se úspěšně spustit replikaci, přičemž proces replikovaného klastru zvaný pg_walreceiver interaguje s primárním klastrem zvaným pg_walsender přes TCP spojení.

# 1. Executes the block ‘replicate’ by passing two parameters
sudo -H -u postgres make replicate replica=replica primaryPort=5433
# 2. Starts the cluster replica
sudo systemctl start [email protected]

Ověření stavu tohoto replikačního modelu, nazývaného Streaming Replication, se provádí dotazem spuštěným na primárním clusteru.

# 1. Checks the Streaming Replication created
sudo -H -u postgres psql -x -c ‘select * from pg_stat_replication;’ -p 5433

Závěr

V tomto blogu jsme si ukázali, jak nastavit asynchronní replikaci streamování mezi dvěma clustery PostgreSQL. Pamatujte však, že ve výše uvedeném kódu existují zranitelnosti, například použití uživatele postgres k provedení takové úlohy se nedoporučuje.

Replikace clusteru poskytuje několik výhod, pokud je používána správným způsobem a má snadný přístup k rozhraním API, která přicházejí do styku s clustery.


  1. Jak ACOS() funguje v MariaDB

  2. Co je jedinečné omezení v SQL Server - SQL Server / TSQL výukový program, část 95

  3. Připojte aplikace ODBC ve Windows k SugarCRM

  4. Jak přidat úvodní nuly k číslu v MySQL