Inkrementaaliset postgresql-varmuuskopiot pgbackrestillä - kurssi nuorelle taistelijalle kehittäjältä

Vastuuvapauslauseke

Olen kehittäjä. Kirjoitan koodia ja olen vuorovaikutuksessa tietokannan kanssa vain käyttäjänä. En missään tapauksessa teeskentele olevani järjestelmänvalvoja, saati dba. Mutta…

Sattui niin, että minun piti järjestää postgresql-tietokannan varmuuskopio. Ei pilviä – käytä vain SSH:ta ja varmista, että kaikki toimii ilman rahaa. Mitä teemme tällaisissa tapauksissa? Aivan oikein, me työnnämme pgdumpin croniin, varmuuskopioimme kaiken arkistoon joka päivä, ja jos olemme täysin hukassa, lähetämme tämän arkiston jonnekin kauas.

Tällä kertaa vaikeutena oli se, että suunnitelmien mukaan tietokannan piti kasvaa noin +-100 MB päivässä. Tietysti muutaman viikon kuluttua halu varmuuskopioida kaikki pgdumpilla katoaa. Tässä avuksi tulevat inkrementaaliset varmuuskopiot.

Mielenkiintoista? Tervetuloa kissalle.

Inkrementaalinen varmuuskopiointi on varmuuskopiointityyppi, jossa kaikkia lähdetiedostoja ei kopioida, vaan vain uusia ja niitä, joita on muutettu edellisen kopion luomisen jälkeen.

Kuten kaikki kehittäjät, jotka olivat TÄYSIN haluttomia (tuohon aikaan) ymmärtämään postgresin monimutkaisuutta, halusin löytää vihreän painikkeen. No, tiedäthän, kuten AWS:ssä, DigitalOceanissa: painat yhtä painiketta - sait replikoinnin, painat toista - otit varmuuskopiot, kolmannen - käänsit kaiken taaksepäin pari tuntia. En löytänyt painiketta tai kaunista GUI-työkalua. Jos tiedät sellaisen (ilmainen tai halpa), kirjoita siitä kommentteihin.

Googlaamisen jälkeen löysin kaksi työkalua pgbarman и pgbackrest. Ensimmäisellä en yksinkertaisesti onnistunut (erittäin niukka dokumentaatio, yritin selvittää kaiken vanhojen ohjeiden mukaan), mutta toisella dokumentaatio osoittautui tasoksi, mutta ei ilman puutteita. Tämä artikkeli kirjoitettiin yksinkertaistamaan samanlaisen tehtävän edessä olevien työtä.

Luettuasi tämän artikkelin opit tekemään vaiheittainen varmuuskopioita, tallentamaan ne etäpalvelimelle (varastoon varmuuskopioineen) ja palauttamaan ne tietojen katoamisen tai muiden pääpalvelimen ongelmien varalta.

Koulutus

Käyttöoppaan toistamiseen tarvitset kaksi VPS:ää. Ensimmäinen on tallennustila (arkisto, johon varmuuskopiot tallennetaan), ja toinen itse asiassa itse palvelin postgresilla (minun tapauksessani postgresin versio 11).

Oletetaan, että palvelimella, jossa on postgres, on root, sudo user, postgres user ja itse postgres on asennettu (postgres-käyttäjä luodaan automaattisesti postgresql:n asennuksen yhteydessä) ja arkistopalvelimella on root ja sudo user (käsikirjassa käytetään käyttäjänimeä pgbackrest).

Jotta sinulla olisi vähemmän ongelmia ohjeiden toistamisessa, kirjoitan kursiivilla missä, millä käyttäjällä ja millä oikeuksilla suoritin komennon kun kirjoitat ja tarkistat artikkelia.

pgbackrestin asennus

Arkisto (käyttäjä pgbackrest):

1. Lataa arkisto pgbackrestistä ja siirrä sen sisältö /build-kansioon:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Asenna kokoonpanoon tarvittavat riippuvuudet:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. Pg-selkänojan kokoaminen:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. Kopioi suoritettava tiedosto /usr/bin-hakemistoon:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. Pgbackrest vaatii perl. Asentaa:

sudo apt-get install perl

6. Luo hakemistoja lokeille ja anna niille tietyt oikeudet:

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.conf

7. Tarkista:

pgbackrest version

Postgres-palvelin (sudo-käyttäjä tai root):

pgbackrestin asennus palvelimelle, jossa on postgres, on samanlainen kuin asennusprosessi arkistoon (kyllä, pgbackrest on asennettava molemmille palvelimille), mutta 6. kappaleessa toinen ja viimeinen komento:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

korvata:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Palvelinten välisen vuorovaikutuksen määrittäminen salasanattoman SSH:n kautta

Jotta pgbackrest toimisi oikein, on tarpeen määrittää postgres-palvelimen ja arkiston välinen vuorovaikutus avaintiedoston avulla.

Arkisto (käyttäjä pgbackrest):

Luo avainpari:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Varoitus! Suoritamme yllä olevat komennot ilman sudoa.

Postgres-palvelin (sudo-käyttäjä tai root):

Luo avainpari:

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 ""

Arkisto (sudo-käyttäjä):

Kopioi postgres-palvelimen julkinen avain arkistopalvelimelle:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Tässä vaiheessa sinulta kysytään root-käyttäjän salasanaa. Sinun on syötettävä postgres-palvelimen pääkäyttäjän salasana!

Postgres-palvelin (sudo-käyttäjä):

Kopioi arkiston julkinen avain palvelimelle postgresilla:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

Tässä vaiheessa sinulta kysytään root-käyttäjän salasanaa. Sinun on syötettävä täsmälleen arkiston pääkäyttäjän salasana!

tarkista:

Tietovarasto (juurikäyttäjä kokeen puhtauden vuoksi):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-palvelin (juurikäyttäjä, kokeilun puhtauden vuoksi):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Varmistamme, että pääsemme ilman ongelmia.

Postgres-palvelimen asentaminen

Postgres-palvelin (sudo-käyttäjä tai root):

1. Sallitaan ulkoisten IP-osoitteiden koputtaminen postgres-palvelimeen. Voit tehdä tämän muokkaamalla tiedostoa postgresql.conf (sijaitsee /etc/postgresql/11/main-kansiossa), lisää siihen rivi:

listen_addresses = '*'

Jos tällainen rivi on jo olemassa, poista se kommentista tai aseta parametrin arvoksi '*'.

Tiedostossa pg_hba.conf (sijaitsee myös kansiossa /etc/postgresql/11/main) lisää seuraavat rivit:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

jos:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Tehdään tarvittavat asetukset sisään postgresql.conf (se on kansiossa /etc/postgresql/11/main) jotta pgbackrest toimii:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Tehdään tarvittavat asetukset pgbackrest-määritystiedostoon (/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Lataa postgresql uudelleen:

sudo service postgresql restart

Arkistopalvelimen määrittäminen

Arkisto (pgbackrest-käyttäjä):

Tehdään tarvittavat asetukset asetustiedostoon pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Arkiston luominen

Arkisto (pgbackrest-käyttäjä):

Luo klusterille uusi tallennustila tärkein:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Postgres-palvelin (sudo-käyttäjä tai root):

Tarkistamme postgres-palvelimelta:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Arkisto (pgbackrest-käyttäjä):

Tarkistamme arkistopalvelimelta:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Varmistamme, että lähdössä näemme rivin "tarkista komennon loppu: suoritettu onnistuneesti".

Väsynyt? Siirrytään mielenkiintoisimpaan osaan.

Varmuuskopion tekeminen

Arkisto (pgbackrest-käyttäjä):

1. Suorita varmuuskopiointi:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Varmista, että varmuuskopio on luotu:

ls /var/lib/pgbackrest/backup/main/

Pgbackrest luo ensimmäisen täyden varmuuskopion. Halutessasi voit suorittaa varmuuskopiokomennon uudelleen ja varmistaa, että järjestelmä luo inkrementaalisen varmuuskopion.

Jos haluat tehdä täyden varmuuskopion uudelleen, määritä ylimääräinen lippu:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Jos haluat yksityiskohtaisen konsolin tulosteen, määritä myös:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

Varmuuskopion palauttaminen

Postgres-palvelin (sudo-käyttäjä tai root):

1. Pysäytä käynnissä oleva klusteri:

sudo pg_ctlcluster 11 main stop

2. Palauttaminen varmuuskopiosta:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Jos haluat palauttaa tietokannan viimeisen TÄYDEN varmuuskopion tilaan, käytä komentoa määrittämättä recovery_target:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore

Tärkeä! Palautuksen jälkeen voi tapahtua, että tietokanta juuttuu palautustilaan (saattaa virheitä, kuten VIRHE: ei voida suorittaa DROP DATABASEa vain luku -tapahtumassa). Rehellisesti sanottuna en ole vielä ymmärtänyt, mihin tämä liittyy. Ratkaisu on seuraava (sinun on odotettava hieman komennon suorittamisen jälkeen):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Itse asiassa on mahdollista palauttaa tietty varmuuskopio sen nimellä. Tässä minä vain olen Annan dokumentaatiossa linkin tämän ominaisuuden kuvaukseen. Kehittäjät neuvovat käyttämään tätä vaihtoehtoa varoen ja selittävät miksi. Voin lisätä itsestäni, että käytin sitä. Jos todella tarvitset, varmista, että tietokanta poistuu palautustilasta (valitse pg_is_in_recovery():n pitäisi näyttää "f") ja tee varmuuden vuoksi täydellinen varmuuskopio palautuksen jälkeen.

3. Käynnistä klusteri:

sudo pg_ctlcluster 11 main start

Varmuuskopion palauttamisen jälkeen meidän on suoritettava toinen varmuuskopiointi:

Arkisto (pgbackrest-käyttäjä):

sudo pgbackrest --stanza=main backup

Siinä kaikki. Lopuksi haluan muistuttaa, että en millään tavalla yritä teeskennellä olevani vanhempi dba ja aion käyttää pilviä pienimmällä mahdollisella tavalla. Tällä hetkellä aloitan itse opiskelemaan erilaisia ​​aiheita, kuten varmuuskopiointia, replikointia, seurantaa jne. ja kirjoitan pieniä raportteja tuloksista, jotta voisin antaa pienen panoksen yhteisölle ja jättää pieniä huijauslehtiä itselleni.

Seuraavissa artikkeleissa yritän puhua lisäominaisuuksista - tietojen palauttamisesta puhtaaseen klusteriin, varmuuskopioiden salauksesta ja julkaisemisesta S3:lle, varmuuskopioinnista rsyncin kautta.

Lähde: will.com

Lisää kommentti