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

Jak používat pgBackRest k zálohování PostgreSQL a TimescaleDB

Vaše data jsou pravděpodobně tím nejcennějším majetkem ve společnosti, takže byste měli mít plán obnovy po havárii (DRP), abyste zabránili ztrátě dat v případě nehody nebo selhání hardwaru. Záloha je nejjednodušší formou DR. Nemusí to vždy stačit k zajištění přijatelného cíle bodu obnovení (RPO), ale je to dobrý první přístup. Také byste měli definovat cíl doby zotavení (RTO) podle požadavků vaší společnosti. Existuje mnoho způsobů, jak dosáhnout hodnoty RTO, záleží na cílech společnosti.

V tomto blogu uvidíme, jak používat pgBackRest pro zálohování PostgreSQL a TimescaleDB a jak používat jednu z nejdůležitějších funkcí tohoto zálohovacího nástroje, kombinaci úplných, přírůstkových a rozdílových záloh, k minimalizaci prostojů.

Co je pgBackRest?

Existují různé typy záloh pro databáze:

  • Logické:Záloha je uložena ve formátu čitelném pro člověka, jako je SQL.
  • Fyzická:Záloha obsahuje binární data.
  • Plná/Přírůstková/Diferenciální:Definice těchto tří typů záloh je implicitní v názvu. Úplná záloha je úplná kopie všech vašich dat. Přírůstková záloha zálohuje pouze data, která se změnila od předchozí zálohy, a rozdílová záloha obsahuje pouze data, která se změnila od provedení poslední úplné zálohy. Přírůstkové a rozdílové zálohy byly zavedeny jako způsob, jak snížit množství času a využití místa na disku, které je zapotřebí k provedení úplné zálohy.

pgBackRest je open source zálohovací nástroj, který vytváří fyzické zálohy s určitými vylepšeními ve srovnání s klasickým nástrojem pg_basebackup. Můžeme použít pgBackRest k provedení počáteční kopie databáze pro Streaming Replication pomocí existující zálohy, nebo můžeme použít možnost delta k přestavbě starého záložního serveru.

Některé z nejdůležitějších funkcí pgBackRest jsou:

  • Paralelní zálohování a obnovení
  • Místní nebo vzdálené ovládání
  • Plné, přírůstkové a rozdílové zálohy
  • Otočení zálohy a vypršení platnosti archivu
  • Kontrola integrity zálohy
  • Obnovení zálohy
  • Delta Restore
  • Šifrování

Nyní se podívejme, jak můžeme použít pgBackRest k zálohování našich databází PostgreSQL a TimescaleDB.

Jak používat pgBackRest

Pro tento test použijeme CentOS 7 jako OS a PostgreSQL 11 jako databázový server. Budeme předpokládat, že máte databázi nainstalovanou, pokud ne, můžete následovat tyto odkazy a nasadit PostgreSQL nebo TimescaleDB jednoduchým způsobem pomocí ClusterControl.

Nejprve musíme nainstalovat balíček pgbackrest.

$ yum install pgbackrest

pgBackRest lze použít z příkazového řádku nebo z konfiguračního souboru umístěného ve výchozím nastavení v /etc/pgbackrest.conf na CentOS7. Tento soubor obsahuje následující řádky:

[global]
repo1-path=/var/lib/pgbackrest
#[main]
#pg1-path=/var/lib/pgsql/10/data

Můžete zkontrolovat tento odkaz, abyste viděli, který parametr můžeme přidat do tohoto konfiguračního souboru.

Přidáme následující řádky:

[testing]
pg1-path=/var/lib/pgsql/11/data

Ujistěte se, že máte v souboru postgresql.conf přidánu následující konfiguraci (tyto změny vyžadují restart služby).

archive_mode = on
archive_command = 'pgbackrest --stanza=testing archive-push %p'
max_wal_senders = 3
wal_level = logical

Nyní provedeme základní zálohu. Nejprve musíme vytvořit „stanzu“, která definuje konfiguraci zálohování pro konkrétní databázový cluster PostgreSQL nebo TimescaleDB. Sekce stanza musí definovat cestu databázového klastru a hostitele/uživatele, pokud je databázový klastr vzdálený.

$ pgbackrest --stanza=testing --log-level-console=info stanza-create
2019-04-29 21:46:36.922 P00   INFO: stanza-create command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:46:37.475 P00   INFO: stanza-create command end: completed successfully (554ms)

A pak můžeme spustit příkaz check pro ověření konfigurace.

$ pgbackrest --stanza=testing --log-level-console=info check
2019-04-29 21:51:09.893 P00   INFO: check command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:51:12.090 P00   INFO: WAL segment 000000010000000000000001 successfully stored in the archive at '/var/lib/pgbackrest/archive/testing/11-1/0000000100000000/000000010000000000000001-f29875cffe780f9e9d9debeb0b44d945a5165409.gz'
2019-04-29 21:51:12.090 P00   INFO: check command end: completed successfully (2197ms)

Chcete-li provést zálohu, spusťte následující příkaz:

$ pgbackrest --stanza=testing --type=full --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=full
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 15:43:21": backup begins after the next regular checkpoint completes
INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
WARN: aborted backup 20190429-215508F of same type exists, will be cleaned to remove invalid files and resumed
INFO: backup file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: full backup size = 31.8MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000130
INFO: new backup label = 20190429-215508F
INFO: backup command end: completed successfully (12810ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (10ms)

Nyní máme zálohu dokončenou s výstupem „úspěšně dokončeno“, pojďme ji tedy obnovit. Zastavíme službu postgresql-11.

$ service postgresql-11 stop
Redirecting to /bin/systemctl stop postgresql-11.service

A ponechte datový adresář prázdný.

$ rm -rf /var/lib/pgsql/11/data/*

Nyní spusťte následující příkaz:

$ pgbackrest --stanza=testing --log-level-stderr=info restore
INFO: restore command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
INFO: restore backup set 20190429-215508F
INFO: restore file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: write /var/lib/pgsql/11/data/recovery.conf
INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
INFO: restore command end: completed successfully (10819ms)

Poté spusťte službu postgresql-11.

$ service postgresql-11 stop

A nyní máme naši databázi v provozu.

$ psql -U app_user world
world=> select * from city limit 5;
 id |      name      | countrycode |   district    | population
----+----------------+-------------+---------------+------------
  1 | Kabul          | AFG         | Kabol         |    1780000
  2 | Qandahar       | AFG         | Qandahar      |     237500
  3 | Herat          | AFG         | Herat         |     186800
  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800
  5 | Amsterdam      | NLD         | Noord-Holland |     731200
(5 rows)

Nyní se podívejme, jak můžeme provést rozdílovou zálohu.

$ pgbackrest --stanza=testing --type=diff --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=diff
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: last backup label = 20190429-215508F, version = 2.13
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 21:22:58": backup begins after the next regular checkpoint completes
INFO: backup start archive = 00000002000000000000000B, lsn = 0/B000028
WARN: a timeline switch has occurred since the last backup, enabling delta checksum
INFO: backup file /var/lib/pgsql/11/data/base/16429/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/16429/2608 (448KB, 8%) checksum 53bd7995dc4d29226b1ad645995405e0a96a4a7b
. . .
INFO: diff backup size = 40.1MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 00000002000000000000000B, lsn = 0/B000130
INFO: new backup label = 20190429-215508F_20190430-212258D
INFO: backup command end: completed successfully (23982ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (14ms)

Pro složitější zálohy můžete postupovat podle uživatelské příručky pgBackRest.

Jak jsme již zmínili dříve, ke správě záloh můžete použít příkazový řádek nebo konfigurační soubory.

Jak používat pgBackRest v ClusterControl

Od verze 1.7.2 přidal ClusterControl podporu pro pgBackRest pro zálohování databází PostgreSQL a TimescaleDB, takže se podívejme, jak to můžeme použít z ClusterControl.

Vytvoření zálohy

Pro tento úkol přejděte do ClusterControl -> Vyberte Cluster -> Záloha -> Vytvořit zálohu.

Můžeme vytvořit novou zálohu nebo nakonfigurovat plánovanou. V našem příkladu okamžitě vytvoříme jedinou zálohu.

Musíme zvolit jednu metodu, server, ze kterého se bude záloha přebírat, a kam chceme zálohu uložit. Můžeme také nahrát naši zálohu do cloudu (AWS, Google nebo Azure) povolením odpovídajícího tlačítka.

V tomto případě zvolíme metodu pgbackrestfull, abychom provedli počáteční plnou zálohu. Když vyberete tuto možnost, uvidíme následující červenou poznámku:

"Během prvního pokusu o vytvoření zálohy pgBackRest ClusterControl překonfiguruje uzel (nasadí a nakonfiguruje pgBackRest) a poté je třeba nejprve restartovat uzel db."

Vezměte to prosím v úvahu při prvním pokusu o zálohování.

Poté určíme použití komprese a úroveň komprese pro naši zálohu.

V sekci zálohování můžeme vidět průběh zálohování a informace, jako je metoda, velikost, umístění a další.

Postup pro vytvoření rozdílu přírůstkové zálohy je stejný. Potřebujeme pouze vybrat požadovanou metodu během vytváření zálohy.

Obnovení zálohy

Jakmile je záloha dokončena, můžeme ji obnovit pomocí ClusterControl. K tomu můžeme v naší sekci zálohování (ClusterControl -> Select Cluster -> Backup) vybrat "Restore Backup" nebo přímo "Restore" na záloze, kterou chceme obnovit.

Máme tři možnosti, jak zálohu obnovit. Můžeme obnovit zálohu ve stávajícím databázovém uzlu, obnovit a ověřit zálohu na samostatném hostiteli nebo ze zálohy vytvořit nový cluster.

Pokud zvolíme možnost Restore on Node, musíme zadat hlavní uzel, protože je to jediný uzel, do kterého lze zapisovat v clusteru.

Průběh obnovy můžeme sledovat v sekci Aktivita v našem ClusterControl.

Automatické ověření zálohy

Záloha není zálohou, pokud ji nelze obnovit. Ověřování záloh je něco, co mnoho lidí obvykle zanedbává. Podívejme se, jak může ClusterControl automatizovat ověřování záloh PostgreSQL a TimescaleDB a jak se vyhnout jakýmkoli překvapením.

V ClusterControl vyberte svůj cluster a přejděte do části „Záloha“ a poté vyberte „Vytvořit zálohu“.

Pro plánované zálohy je k dispozici funkce automatického ověření zálohy. Vyberme tedy možnost „Naplánovat zálohování“.

Při plánování zálohování musíme kromě výběru běžných možností, jako je metoda nebo úložiště, určit také plán/frekvenci.

V dalším kroku můžeme zkomprimovat naši zálohu a povolit funkci „Ověřit zálohu“.

K použití této funkce potřebujeme vyhrazeného hostitele (nebo virtuálního počítače), který není součástí clusteru.

ClusterControl nainstaluje software a obnoví zálohu v tomto hostiteli. Po obnovení můžeme v sekci ClusterControl Backup vidět ikonu ověření.

Doporučení

Existuje také několik tipů, které můžeme vzít v úvahu při vytváření našich záloh:

  • Uložte zálohu na vzdálené místo:Zálohu bychom neměli ukládat na databázový server. V případě selhání serveru bychom mohli přijít o databázi i zálohu zároveň.
  • Uchovávejte kopii nejnovější zálohy na databázovém serveru:To by mohlo být užitečné pro rychlejší obnovu.
  • Používejte přírůstkové/rozdílové zálohy:Chcete-li snížit dobu obnovy zálohy a využití místa na disku.
  • Zálohujte si WAL:Pokud potřebujeme obnovit databázi z poslední zálohy, pokud ji pouze obnovíte, ztratíte změny od vytvoření zálohy až do doby obnovení, ale pokud máme WAL, můžeme použít změny a můžeme použít PITR.
  • Používejte jak logické, tak fyzické zálohy:Obě jsou nutné z různých důvodů, například pokud chceme obnovit pouze jednu databázi/tabulku, nepotřebujeme fyzickou zálohu, potřebujeme pouze logickou zálohu. být ještě rychlejší než obnova celého serveru.
  • Pořizovat zálohy z pohotovostních uzlů (pokud je to možné):Abyste předešli nadměrnému zatížení primárního uzlu, je dobrým zvykem pořizovat zálohu z pohotovostního serveru.
  • Otestujte své zálohy:Potvrzení, že záloha byla provedena, nestačí k zajištění funkčnosti zálohy. Měli bychom jej obnovit na samostatném serveru a otestovat, abychom se vyhnuli překvapení v případě selhání.

Závěr

Jak jsme viděli, pgBackRest je dobrá volba, jak zlepšit naši strategii zálohování. Pomáhá vám chránit vaše data a mohlo by být užitečné dosáhnout RTO snížením prostojů v případě selhání. Přírůstkové zálohy mohou pomoci snížit množství času a úložného prostoru použitého pro proces zálohování. ClusterControl může pomoci zautomatizovat proces zálohování vašich databází PostgreSQL a TimescaleDB a v případě selhání je obnovit pomocí několika kliknutí.


  1. Měly by být nové sloupce indexu v klíči nebo zahrnuty?

  2. Datum Oracle

  3. Jak najdu duplikáty ve více sloupcích?

  4. Generování náhodného a jedinečného 8znakového řetězce pomocí MySQL