Disclaimer
Jag Àr utvecklare. Jag skriver kod och interagerar med databasen endast som anvÀndare. Jag gör absolut inte ansprÄk pÄ att vara systemadministratör eller, Ànnu mer, DBA. Men...
Det sĂ„ att jag behövde organisera backup av en PostgreSQL-databas. Inga moln â hĂ„ll SSH och se till att allt fungerar utan att be om pengar. Vad gör vi i sĂ„dana fall? RĂ€tt, vi lĂ€gger pg_dump i cron, tar en backup varje dag i ett arkiv och om vi gĂ„r helt fel skickar vi det hĂ€r arkivet nĂ„gonstans lĂ„ngt bort.
Den hÀr gÄngen var det svÄrt eftersom databasen enligt planen skulle vÀxa med cirka ± 100 MB per dag. Naturligtvis, efter ett par veckor kommer önskan att backupa allt med pg_dump att försvinna. HÀr kommer inkrementella backuper till hjÀlp.
Intressant? VĂ€lkommen under kat.
Inkrementell backup Àr en typ av sÀkerhetskopia dÀr inte alla filer frÄn kÀllan kopieras, utan endast nya och Àndrade sedan den senaste kopian skapades.
Som vilken utvecklare som helst, som ABSOLUT inte ville (vid den tiden) sĂ€tta sig in i detaljerna i PostgreSQL, ville jag hitta den gröna knappen. Ni vet, som i AWS, DigitalOcean: tryck pĂ„ en knapp â du fĂ„r replikering, tryck pĂ„ den andra â du stĂ€ller in backuper, den tredje â allt Ă„terstĂ€lls ett par timmar tillbaka. Jag hittade inga knappar eller nĂ„gon vacker GUI-verktyg. Om ni kĂ€nner till nĂ„got sĂ„dant (gratis eller billigt) â skriv gĂ€rna en kommentar.
Efter att ha googlat hittade jag tvÄ verktyg pgbarman och pgbackrest. Med det första fick jag bara inte till det (mycket bristfÀllig dokumentation, försökte allt efter gamla manualer), men med det andra var dokumentationen pÄ rÀtt nivÄ, om Àn med brister. Denna artikel skrevs för att förenkla arbetet för dem som stÀlls inför en liknande uppgift.
Genom att lÀsa denna artikel kommer du att lÀra dig att göra inkrementella backuper, spara dem pÄ en fjÀrrserver (backup-repository) och ÄterstÀlla dem vid dataförlust eller andra problem pÄ huvudservern.
Förberedelse
För att följa manualen behöver du tvÄ VPS:er. Den första kommer att vara lagringsplatsen (repository dÀr backuperna kommer att ligga), och den andra Àr sjÀlva servern med PostgreSQL (i mitt fall version 11 av PostgreSQL).
Det förutsÀtts att du har root, en sudo-anvÀndare, postgres-anvÀndaren och att postgres Àr installerad pÄ servern med postgres (postgres-anvÀndaren skapas automatiskt vid installationen av postgresql), och pÄ repository-servern finns root och en sudo-anvÀndare (i manualen kommer anvÀndarnamnet pgbackrest att anvÀndas).
För att du ska stöta pĂ„ fĂ€rre problem nĂ€r du följer instruktionerna â skriver jag i kursiv stil var, med vilken anvĂ€ndare och med vilka rĂ€ttigheter jag utförde kommandot under skrivandet och granskningen av artikeln.
Installation av pgbackrest
Repository (anvÀndare pgbackrest):
1. Ladda ner arkivet med pgbackrest och flytta dess innehÄll till mappen /build:
sudo mkdir /build
sudo wget -q -O -
https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz |
sudo tar zx -C /build2. Installera de nödvÀndiga beroenden för byggandet:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev3. Bygg pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Kopiera den körbara filen till katalogen /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest krÀver att perl Àr installerad. Installera:
sudo apt-get install perl6. Skapa kataloger för loggar, ge dem specifika rÀttigheter:
sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf7. Kontrollera:
pgbackrest versionPostgres-server (sudo-anvÀndare eller root):
Installationsprocessen för pgbackrest pÄ servern med postgres Àr liknande installationsprocessen pÄ repositoryn (ja, pgbackrest mÄste installeras pÄ bÄda servrarna), men i punkt 6 ska den andra och sista kommandon:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.confersÀttas med:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confKonfigurera interaktionen mellan servrar via passwordless SSH
För att pgbackrest ska fungera korrekt, mÄste du konfigurera interaktionen mellan postgres-servern och repositoryn med en nyckel-fil.
Repository (anvÀndare pgbackrest):
Skapa ett nyckelpar:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""Varning! De ovanstÄende kommandona utförs utan sudo.
Postgres-server (sudo-anvÀndare eller root):
Skapa ett nyckelpar:
sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa
-t rsa -b 4096 -N ""Repository (sudo-anvÀndare):
Kopiera den offentliga nyckeln frÄn postgres-servern till repository-servern:
(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' &&
echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' &&
sudo ssh root@ cat /var/lib/postgresql/.ssh/id_rsa.pub) |
sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keysDet kommer att be om lösenordet för root-anvÀndaren. Du mÄste ange root-lösenordet för postgres-servern!
Postgres-server (sudo-anvÀndare):
Vi kopierar den offentliga nyckeln frÄn repositoryt till postgres-servern:
(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' &&
echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' &&
sudo ssh root@ cat /home/pgbackrest/.ssh/id_rsa.pub) |
sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys
Det kommer att be om lösenordet för root-anvÀndaren. Du mÄste ange root-lösenordet för repositoryt!
Kontrollerar:
Repository (root-anvÀndare, för att hÄlla det rent):
sudo -u pgbackrest ssh postgres@Postgres-server (root-anvÀndare, för att hÄlla det rent):
sudo -u postgres ssh pgbackrest@Vi sÀkerstÀller att vi fÄr Ätkomst utan problem.
Konfigurering av postgres-server
Postgres-server (sudo-anvÀndare eller root):
1. Vi tillÄter att externa IP-adresser kan ansluta till postgres-servern. För detta redigerar vi filen postgresql.conf (finns i mappen /etc/postgresql/11/main), genom att lÀgga till raden:
listen_addresses = '*'Om en sĂ„dan rad redan finns â kommentera den dĂ„ eller stĂ€ll in parametrens vĂ€rde som â*â.
I filen pg_hba.conf (finns ocksÄ i mappen /etc/postgresql/11/main) lÀgger vi till följande rader:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5dÀr:
hostssl/host - vi ansluter via SSL (eller inte)
alla - tillÄter anslutning till alla databaser
alla - anvÀndarnamnet som tillÄts ansluta (alla)
0.0.0.0/0 - nÀtmasken frÄn vilken man kan ansluta
md5 - metoden för lösenordskryptering2. Vi gör de nödvÀndiga instÀllningarna i postgresql.conf (den ligger i mappen /etc/postgresql/11/main) för att pgbackrest ska fungera:
archive_command = 'pgbackrest --stanza=main archive-push %p' # DÀr main Àr namnet pÄ klustret. Vid installation av postgres skapas automatisk klustret main.
archive_mode = on
max_wal_senders = 3
wal_level = replica3. Vi gör de nödvÀndiga instÀllningarna i konfigurationsfilen för pgbackrest (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=4. Vi startar om postgresql:
sudo service postgresql restartKonfigurering av repository-servern
Repository (pgbackrest anvÀndare):
Vi gör de nödvÀndiga instÀllningarna i konfigurationsfilen pgbackrest
(/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-host=
pg1-path=/var/lib/postgresql/11/main
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Parameter som anger hur mÄnga fullstÀndiga sÀkerhetskopior som ska sparas. Det vill sÀga, om du har tvÄ fullstÀndiga sÀkerhetskopior och skapar en tredje - kommer de tvÄ första att raderas tillsammans med inkrementen.
start-fast=y # PÄbörjar sÀkerhetskopiering omedelbart, du kan lÀsa om denna parameter hÀr https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingSkapa lagring
Repository (pgbackrest anvÀndare):
Vi skapar ett nytt lagringsutrymme för klustret main:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Kontroll
Postgres-server (sudo-anvÀndare eller root):
Kontrollerar pÄ postgres-servern:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info checkRepository (pgbackrest anvÀndare):
Kontrollerar pÄ lagringsservern:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkVi ser till att vi ser raden "check command end: completed successfully" i utskriften.
Trött? Vi gÄr vidare till det mest intressanta.
Gör en sÀkerhetskopiering
Repository (pgbackrest anvÀndare):
1. Utför sÀkerhetskopiering:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Vi försÀkrar oss om att sÀkerhetskopian har skapats:
ls /var/lib/pgbackrest/backup/main/Pgbackrest kommer att skapa den första fullstÀndiga sÀkerhetskopian. Om du vill kan du köra sÀkerhetskopieringskommandot igen och bekrÀfta att systemet skapar en inkrementell sÀkerhetskopian.
Om du vill göra en fullstÀndig sÀkerhetskopian igen, ange dÄ en extra flagga:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backupOm du vill ha detaljerad utskrift i terminalen, ange ocksÄ:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupà terstÀll sÀkerhetskopian
Postgres-server (sudo-anvÀndare eller root):
1. StÀnger av det aktuella klustret:
sudo pg_ctlcluster 11 main stop2. à terstÀll frÄn sÀkerhetskopian:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Starta klustret:
sudo pg_ctlcluster 11 main startEfter att sÀkerhetskopian har ÄterstÀllts behöver vi göra en ny sÀkerhetskopiering:
Repository (pgbackrest anvÀndare):
sudo pgbackrest --stanza=main backupDetta Àr allt. Som avslutning vill jag pÄminna om att jag pÄ inget sÀtt försöker framstÄ som en senior DBA och vid minsta möjlighet kommer jag att anvÀnda molntjÀnster. Just nu börjar jag sjÀlv studera olika Àmnen som sÀkerhetskopiering, replikering, övervakning osv. och skriver smÄ rapporter om resultaten för att bidra till gemenskapen och skapa smÄ minnen för mig sjÀlv.
I kommande artiklar tÀnker jag berÀtta om ytterligare funktioner - ÄterstÀllning av data till ett rent kluster, kryptering av sÀkerhetskopior och publicering pÄ S3, sÀkerhetskopior via rsync.
KĂ€lla: habr.com
