GNU/Linux >> Znalost Linux >  >> Debian

Jak nastavit PostgreSQL Streaming Replication s replikačními sloty na Debianu 10

PostgreSQL je výkonný a na funkce bohatý systém správy relačních databází (RDBMS). Je zdarma a s otevřeným zdrojovým kódem a vyvíjí se od roku 1996. Postgres nabízí různé způsoby archivace a replikace dat, jedním z nich je streamingová replikace. V tomto režimu primární (hlavní) instance zpracovává hlavní aktivní databázi a provádí operace. Sekundární (podřízená) instance zkopíruje všechny změny z primární, přičemž zachová identickou kopii aktivní databáze. Sekundární server může také přijímat dotazy pouze pro čtení. Pokud primární server selže, sekundární server může opustit pohotovostní režim a fungovat jako nový hlavní server (toto se nazývá převzetí služeb při selhání).

Replikace PostgreSQL se obvykle spoléhá na protokolování napřed (WAL), proces protokolování dat se mění před jejich zápisem na disk. Tyto záznamy WAL jsou pak buď zkopírovány do druhého uzlu jako soubory (zasílání protokolů na základě souborů), nebo přímo streamovány mezi uzly (streamingová replikace). Ve většině případů tato možnost zkracuje zpoždění pro přijetí změn na hlavním uzlu pohotovostním uzlem.

Problém s použitím replikace datových proudů bez odesílání protokolů založených na souborech je ten, že sekundární server může postrádat některé záznamy WAL, pokud je primární server zahodí příliš brzy. Toto riziko může snížit řada konfiguračních parametrů, ale často jsou spojeny se zbytečnými náklady na úložiště. Řešením jsou replikační sloty, což je funkce poskytovaná společností Postgres, která zajišťuje, že primární server zahodí záznamy WAL až poté, co je přijme pohotovostní uzel.

Nastavíme streamovací replikaci s replikačními sloty na dvou uzlech Debianu 10.

Požadavky

  • Dvě identické instance Debianu 10.
  • Přístup uživatele root k oběma instancím.
  • Proměnná prostředí $EDITOR by měla být nastavena v obou případech.

Krok 1:Instalace PostgreSQL

Aktualizujte a restartujte oba uzly:

apt update
apt upgrade -y
reboot

Nainstalujte Postgres na oba uzly a ujistěte se, že je PostgreSQL povoleno a spuštěno:

apt install -y postgresql
systemctl enable --now [email protected]

POZNÁMKA:Při aktualizaci PostgreSQL je podle jejich dokumentace bezpečnější aktualizovat nejprve pohotovostní režim.

Krok 2:Počáteční konfigurace

Ve výchozím nastavení PostgreSQL naslouchá pouze na rozhraní zpětné smyčky a není externě přístupný. Změňte adresu naslouchání na obou uzlech úpravou postgresql.conf:

$EDITOR /etc/postgresql/11/main/postgresql.conf

Najděte následující řádek:

#listen_addresses = 'localhost'

Změňte jej na:

listen_addresses = 'node_ip_address,127.0.0.1'

Pokud oba uzly sdílejí stejnou místní síť, můžete pro node_ip_address použít soukromé adresy, ačkoli Postgres nebude přístupný na internetu. V opačném případě použijte veřejné adresy.

Uložte změnu a restartujte obě instance:

systemctl restart [email protected]

Krok 3:Hlavní konfigurace

Tento krok se týká pouze primárního/master serveru.

Otevřete terminál Postgres:

sudo -u postgres psql

Pohotovostní uzel bude používat uživatele pro připojení k hlavnímu zařízení. Vytvořte jej:

postgres=# CREATE ROLE replicator LOGIN REPLICATION ENCRYPTED PASSWORD 'replicator_password';

Poté vytvořte replikační slot a ukončete:

postgres=# SELECT * FROM pg_create_physical_replication_slot('replicator');
postgres=# \q

V zájmu jednoduchosti jsou role replikace i slot pojmenovány „replikátor“, i když nemusí být totožné.

Dále vytvořte záznam v pg_hba.conf, který umožní uživateli replikátoru připojit se z pohotovostního režimu k hlavnímu serveru. Otevřete jej:

$EDITOR /etc/postgresql/11/main/pg_hba.conf

Na konec připojte následující řádek:

host	replication	replicator	standby_ip_address/32		md5

Restartujte hlavní instanci:

systemctl restart [email protected]

Krok 4:Základní záloha

Příkazy v tomto kroku by měly být prováděny na sekundárním/slave serveru.

Nejprve zastavte Postgres na sekundárním uzlu:

systemctl stop [email protected]

Zálohujte starý datový adresář:

mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.bak

Pomocí následujícího příkazu naklonujte datový adresář hlavního zařízení do podřízeného:

pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator

Budete vyzváni k zadání hesla. Zadejte heslo, které jste zvolili pro roli replikátoru při jejím vytváření na hlavním serveru. Po dokončení přenosu udělte vlastnictví datového adresáře uživateli postgres:

chown -R postgres:postgres /var/lib/postgresql/11/main

Krok 5:Konfigurace pohotovostního režimu

Tento krok se týká pouze sekundárního/podřízeného serveru.

Aktivujte pohotovostní režim v postgresql.conf:

$EDITOR /etc/postgresql/11/main/postgresql.conf

Najděte a odkomentujte následující řádek:

#hot_standby = on

Vytvořte soubor recovery.conf v datovém adresáři Postgres:

$EDITOR /var/lib/postgresql/11/main/recovery.conf

Povolit pohotovostní režim:

standby_mode = 'on'

Nastavte parametry připojení replikace pomocí pověření vytvořených na hlavním serveru:

primary_conninfo = 'host=master_ip_address port=5432 user=replicator password=replicator_password'

Nastavte název replikačního slotu, který jste vytvořili na hlavním serveru:

primary_slot_name = 'replicator'

Nastavte cestu k souboru spouštěče převzetí služeb při selhání:

trigger_file = '/var/lib/postgresql/11/main/failover.trigger'

Pokud je nastaven parametr trigger_file, Postgres opustí pohotovostní režim a spustí normální provoz jako primární server, když je tento soubor spouštěče vytvořen. Tento parametr není povinný.

Po vytvoření recovery.conf udělte vlastnictví uživateli postgres:

chown postgres:postgres /var/lib/postgresql/11/main/recovery.conf

Nyní můžete spustit Postgres:

systemctl start [email protected]

Nyní je v pohotovostním režimu a měl by replikovat jakoukoli novou transakci.

Testování

Testování replikace

Chcete-li replikaci otestovat, proveďte jakoukoli akci zápisu na hlavním serveru. Například vytvořte novou databázi na hlavním serveru:

sudo -u postgres psql -c "CREATE DATABASE replitest"

Počkejte několik sekund a poté vypište databáze na podřízeném zařízení:

sudo -u postgres psql -c "\l"

Měli byste vidět, že databáze replitest byla skutečně replikována pohotovostním serverem:

List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 replitest | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

Testování selhání

POZNÁMKA:Testování převzetí služeb při selhání, jak je uvedeno zde, bude po převzetí služeb při selhání vyžadovat resetování záložního serveru.

Protože je Postgres v pohotovostním režimu, neměli byste být schopni provést žádnou operaci zápisu na sekundárním uzlu před převzetím služeb při selhání. Spusťte například následující příkaz:

sudo -u postgres psql -c "CREATE DATABASE test"

Příkaz by měl selhat:

ERROR:  cannot execute CREATE DATABASE in a read-only transaction

Chcete-li signalizovat převzetí služeb při selhání, vytvořte spouštěcí soubor uvedený v recovery.conf

touch /var/lib/postgresql/11/main/failover.trigger

Počkejte několik sekund a poté zkuste provést operaci zápisu. Například:

sudo -u postgres psql -c "CREATE DATABASE test2"

Protože Postgres již nefunguje jako pohotovostní režim, operace bude úspěšná. Postgres také přejmenuje váš soubor recovery.conf na recovery.done a smaže spouštěcí soubor.

Chcete-li se vrátit do pohotovostního režimu, zastavte Postgres na (bývalém) sekundárním uzlu:

systemctl stop [email protected]

Resetujte datový adresář:

mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.2.bak
pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator
chown -R postgres:postgres /var/lib/postgresql/11/main

A znovu vytvořte recovery.conf:

cp /var/lib/postgresql/11/main.2.bak/recovery.done /var/lib/postgresql/11/main/recovery.conf

Nakonec restartujte Postgres:

systemctl start [email protected]

Sekundární instance je nyní zpět do pohotovostního režimu. V tomto okamžiku můžete replikaci znovu otestovat.

Dokončuje se

Odeberte všechny nepotřebné databáze na hlavním uzlu, například:

sudo -u postgres psql
postgres=# DROP DATABASE replitest;

A smažte staré datové adresáře ve vašem pohotovostním uzlu:

rm /var/lib/postgresql/11/main.bak -r
rm /var/lib/postgresql/11/main.2.bak -r

Debian
  1. Jak nastavit Rsyslog Server na Debianu 11

  2. Jak nastavit synchronní replikaci MariaDB Galera Multi-Master pomocí Debianu 10

  3. Jak nainstalovat PostgreSQL 11 / 10 na Debian 9 a Debian 8

  1. Jak nainstalovat PostgreSQL na Debian 11 / Debian 10

  2. Jak nastavit IP Failover s KeepAlived na Ubuntu a Debianu

  3. Jak nastavit poštovní server s Exim4 a DBMail na Debian 7 VPS

  1. Jak nastavit vsftpd na Debianu

  2. Jak nastavit Opencart pomocí LAMP (PHP, Apache, Mariadb) na Debianu 11

  3. Jak nainstalovat Drupal s PostgreSQL na Debian 8 VPS