sql >> Database >  >> RDS >> PostgreSQL

Barman gebruiken voor PostgreSQL Disaster Recovery

Er moeten veel krachtige tools beschikbaar zijn als back-up- en hersteloptie voor PostgreSQL in het algemeen; Barman, PgBackRest, BART zijn om er in deze context een paar te noemen. Wat onze aandacht trok, was dat Barman een tool is die de productie-implementatie en markttrends snel inhaalt.

Of het nu een op docker gebaseerde implementatie is, back-up moet worden opgeslagen in een andere cloudopslag of zeer aanpasbare noodherstelarchitectuur nodig heeft - Barman is in al dergelijke gevallen een zeer sterke concurrent.

Deze blog onderzoekt Barman met weinig aannames over implementatie, maar dit mag in geen geval worden beschouwd als alleen mogelijke functies. Barman gaat veel verder dan wat we in deze blog kunnen vastleggen en moet verder worden onderzocht als 'back-up en herstel van PostgreSQL-instantie' wordt overwogen.

Aanname van DR Ready-implementatie 

RPO=0 heeft over het algemeen een prijs - synchrone standby-serverimplementatie zou daar vaak aan voldoen, maar dan heeft het vrij vaak invloed op de TPS van de primaire server.

Net als PostgreSQL biedt Barman talloze implementatie-opties om aan uw behoeften te voldoen als het gaat om RPO versus prestaties. Denk aan eenvoud van implementatie, RPO=0 of bijna nul impact op de prestaties; Barman past in iedereen.

We hebben de volgende implementatie overwogen om een ​​noodhersteloplossing voor onze back-up- en herstelarchitectuur op te zetten.

Afbeelding 1:PostgreSQL-implementatie met Barman

Er zijn twee sites (zoals in het algemeen voor rampherstelsites) - Site-X en Site-Y.

In Site-X is er:

  • Eén server 'pgServer' die een PostgreSQL-serverinstantie pgServer host en één OS-gebruiker 'postgres' 
    • PostgreSQL-instantie ook om een ​​superuser-rol 'bmuser' te hosten
  • Eén server 'bServer' die de Barman-binaire bestanden host en een OS-gebruiker 'bmuser'

In Site-Y is er:

  • Eén server 'geobServer' die de Barman-binaire bestanden host en een OS-gebruiker 'bmuser'

Er zijn meerdere soorten verbindingen bij deze configuratie betrokken.

  • Tussen 'bServer' en 'pgServer':
    • Management-plane-connectiviteit van Barman naar de PostgreSQL-instantie
    • rsync-connectiviteit om daadwerkelijke basisback-up uit te voeren van Barman naar de PostgreSQL-instantie
    • WAL-archivering met barman-wal-archive van de PostgreSQL-instantie naar Barman
    • WAL-streaming met pg_receivexlog bij Barman
  • Tussen 'bServer' en 'geobserver':
    • Synchronisatie tussen Barman-servers om geo-replicatie te bieden

Connectiviteit eerst 

De primaire connectiviteitsbehoeften tussen de servers zijn via ssh. Om het wachtwoordloze ssh-sleutels te maken, worden ssh-sleutels gebruikt. Laten we de ssh-sleutels maken en deze uitwisselen.

Op pgServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

Op bServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

Op geobServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

PostgreSQL-instantieconfiguratie 

Er zijn twee belangrijke dingen die we nodig hebben om een ​​postgres-instantie opnieuw samen te stellen:de basisdirectory en de WAL / Transactions-logboeken die daarna worden gegenereerd. Barman-server houdt ze intelligent bij. Wat we nodig hebben, is ervoor te zorgen dat de juiste feeds worden gegenereerd zodat Barman deze artefacten kan verzamelen.

Voeg de volgende regels toe aan postgresql.conf:

listen_addresses = '172.25.130.180'     #as per above deployment assumption

wal_level = replica                     #or higher 

archive_mode = on

archive_command = 'barman-wal-archive -U bmuser bserver pgserver %p'

Archiefopdracht zorgt ervoor dat wanneer WAL moet worden gearchiveerd door een postgres-instantie, het hulpprogramma barman-wal-archive het naar de Barman Server verzendt. Opgemerkt moet worden dat het barman-cli-pakket daarom beschikbaar moet worden gesteld op 'pgServer'. Er is nog een andere optie om rsync te gebruiken als we het hulpprogramma barman-wal-archive niet willen gebruiken.

Voeg het volgende toe aan pg_hba.conf:

host     all                    all     172.25.130.186/32     md5

host     replication            all     172.25.130.186/32     md5

Het staat in feite een replicatie en een normale verbinding toe van 'bmserver' naar deze postgres-instantie.

Start nu gewoon de instantie opnieuw en maak een supergebruikersrol aan met de naam bmuser:

[email protected]$ pg_ctl restart

[email protected]$ createuser -s -P bmuser 

Indien nodig kunnen we vermijden om bmuser ook als supergebruiker te gebruiken; waarvoor privileges nodig zijn die aan deze gebruiker zijn toegewezen. Voor het bovenstaande voorbeeld hebben we bmuser ook als wachtwoord gebruikt. Maar dat is zo'n beetje alles, voor zover een PostgreSQL-instantieconfiguratie vereist is.

Barman-configuratie 

Barman heeft drie basiscomponenten in zijn configuratie:

  • Algemene configuratie 
  • Configuratie op serverniveau 
  • Gebruiker die de barman gaat leiden 

 In ons geval, aangezien Barman is geïnstalleerd met rpm, hebben we onze algemene configuratiebestanden opgeslagen op:

/etc/barman.conf

We wilden de configuratie op serverniveau opslaan in de homedirectory van bmuser, vandaar dat ons globale configuratiebestand de volgende inhoud had:

[barman]

barman_user = bmuser

configuration_files_directory = /home/bmuser/barman.d

barman_home = /home/bmuser

barman_lock_directory = /home/bmuser/run

log_file = /home/bmuser/barman.log

log_level = INFO

Primaire Barman-serverconfiguratie 

In de bovenstaande implementatie hebben we besloten om de primaire Barman-server in hetzelfde datacenter / dezelfde site te houden waar de PostgreSQL-instantie wordt bewaard. Het voordeel van hetzelfde is dat er minder vertraging is en sneller herstel indien nodig. Onnodig te zeggen dat er ook minder computer- en/of netwerkbandbreedte nodig is op de PostgreSQL-server.

Om Barman de PostgreSQL-instantie op de pgServer te laten beheren, moeten we een configuratiebestand toevoegen (we hebben pgserver.conf genoemd) met de volgende inhoud:

[pgserver]

description =  "Example pgserver configuration"

ssh_command = ssh [email protected]

conninfo = host=pgserver user=bmuser dbname=postgres

backup_method = rsync

reuse_backup = link

backup_options = concurrent_backup

parallel_jobs = 2

archiver = on

archiver_batch_size = 50

path_prefix = "/usr/pgsql-12/bin"



streaming_conninfo = host=pgserver user=bmuser dbname=postgres

streaming_archiver=on

create_slot = auto

En een .pgpass-bestand met de inloggegevens voor bmuser in de PostgreSQL-instantie:

echo 'pgserver:5432:*:bmuser:bmuser' > ~/.pgpass 

Om de belangrijke configuratie-items wat beter te begrijpen:

  • ssh_command :Wordt gebruikt om verbinding tot stand te brengen waarover rsync zal worden uitgevoerd 
  • conninfo :Verbindingsreeks om Barman verbinding te laten maken met de postgres-server
  • reuse_backup :om incrementele back-ups toe te staan ​​met minder opslagruimte 
  • backup_methode :methode om een ​​back-up te maken van de basismap
  • path_prefix :locatie waar pg_receivexlog binaire bestanden worden opgeslagen 
  • streaming_conninfo :verbindingsreeks die wordt gebruikt om WAL te streamen 
  • create_slot :om ervoor te zorgen dat slots zijn gemaakt door de postgres-instantie 

Passieve Barman-serverconfiguratie 

De configuratie van een geo-replicatiesite is vrij eenvoudig. Het enige dat nodig is, is een ssh-verbindingsinformatie waarover deze passieve node-site de replicatie zal doen.

Wat interessant is, is dat zo'n passief knooppunt in mix-modus kan werken; met andere woorden - ze kunnen fungeren als actieve Barman-servers om back-ups te maken voor PostgreSQL-sites en tegelijkertijd fungeren als een replicatie/cascade-site voor andere Barman-servers.

Aangezien in ons geval deze instantie van Barman (op Site-Y) slechts een passief knooppunt hoeft te zijn, hoeven we alleen het bestand /home/bmuser/barman.d/pgserver.conf aan te maken met de volgende configuratie:

[pgserver]

description =  "Geo-replication or sync for pgserver"

primary_ssh_command = ssh [email protected]

In de veronderstelling dat de sleutels zijn uitgewisseld en de globale configuratie op dit knooppunt is gedaan zoals eerder vermeld - we zijn zo goed als klaar met de configuratie.

En hier is onze eerste back-up en herstel 

Controleer op de bserver of het achtergrondproces om WAL te ontvangen is geactiveerd; en controleer vervolgens de configuratie van de server:

[email protected]$ barman cron

[email protected]$ barman check pgserver

De controle zou in orde moeten zijn voor alle substappen. Als dat niet het geval is, raadpleeg dan /home/bmuser/barman.log.

Geef een back-upopdracht op Barman om er zeker van te zijn dat er een basis DATA is waarop WAL kan worden toegepast:

[email protected]$ barman backup pgserver

Zorg ervoor dat de replicatie op de 'geobmserver' wordt gedaan door de volgende opdrachten uit te voeren:

[email protected]$ barman cron 

[email protected]$ barman list-backup pgserver

De cron moet in het crontab-bestand worden ingevoegd (indien niet aanwezig). Voor de eenvoud heb ik het hier niet getoond. Het laatste commando laat zien dat de back-upmap ook op de geobmserver is aangemaakt.

Laten we nu op de Postgres-instantie enkele dummy-gegevens maken:

[email protected]$ psql -U postgres -c "CREATE TABLE dummy_data( i INTEGER);"

[email protected]$ psql -U postgres -c "insert into dummy_data values ( generate_series (1, 1000000 ));"

De replicatie van de WAL van de PostgreSQL-instantie kan worden bekeken met het onderstaande commando:

[email protected]$ psql -U postgres -c "SELECT * from pg_stat_replication ;”

Om een ​​instantie opnieuw te maken op Site-Y, moet u er eerst voor zorgen dat WAL-records worden omgeschakeld. of dit voorbeeld om een ​​schoon herstel te maken:

[email protected]$ barman switch-xlog --force --archive pgserver

Laten we op de Site-X een standalone PostgreSQL-instantie ter sprake brengen om te controleren of de back-up verstandig is:

[email protected]$ barman cron 

barman recover --get-wal pgserver latest /tmp/data

Bewerk nu de postgresql.conf en de postgresql.auto.conf bestanden naar behoefte. Hieronder wordt uitgelegd welke wijzigingen voor dit voorbeeld zijn aangebracht:

  • postgresql.conf :listen_addresses heeft gereageerd om standaard localhost te worden
  • postgresql.auto.conf :sudo bmuser verwijderd uit restore_command 

Breng deze GEGEVENS op in /tmp/data en controleer het bestaan ​​van uw records.

Conclusie

Dit was slechts het topje van een ijsberg. Barman gaat veel dieper dan dit vanwege de functionaliteit die het biedt - b.v. fungeren als een gesynchroniseerde stand-by, hook-scripts enzovoort. Vanzelfsprekend moet de volledige documentatie worden onderzocht om deze te configureren volgens de behoeften van uw productieomgeving.


  1. Hoe SQLOPS op een Mac te installeren

  2. Observer Overhead en wachttype Symptomen

  3. Strings samenvoegen in SQL

  4. Update SQL met opeenvolgende nummering