Vastutusest loobumine
Mina olen arendaja. Kirjutan koodi ja suhtlen andmebaasiga vaid kasutajana. Ma ei pretendeeri sugugi süsteemiadministraatori või eriti DBA ametikohale. Kuid…
Nii juhtus, et mul oli vaja korraldada PostgreSQL andmebaasi varundamine. Ilma igasuguste pilvedeta — hoia SSH ja tee nii, et kõik toimiks ja ei küsiks raha. Mida me sellistes olukordades teeme? Õige, paneme pgdumpsi cron’i, varundame iga päev kõik arhiivi ja kui asi viimasel ajal ära läheb — saadame selle arhiivi kuskile kaugemale.
Seekord seisnes raskus selles, et plaanide kohaselt pidi andmebaas kasvama umbes +- 100 MB päevas. Loomulikult kaob pärast paar nädalat soov varundada kõike pgdump’iga. Siin tulevad appi inkrementaalsed varundused.
Huvitav? Tere tulemast allapoole.
Inkrementaalne varukoopia on varukoopia tüüp, kus kopeeritakse mitte kõik allika failid, vaid ainult uued ja muudetud failid alates eelneva koopia loomise hetkest.
Nagu iga arendaja, kes EI soovi (tol hetkel) süveneda postgres'i nõkste, soovisin leida rohelist nuppu. Teate küll, nagu AWS-is, DigitalOceanis: vajutad ühte nuppu — saad replikatsiooni, vajutad teist — seadistad varukoopiad, kolmandat — kõik taastatakse paar tundi tagasi. Nuppe ja kena GUI tööriista ei leidnud. Kui te teate sellist (tasuta või odavat) — kirjutage sellest kommentaarides.
Otsides leidsin kaks tööriista pgbarman ja pgbackrest. Esimese tööga lihtsalt ei läinud (väga napp dokumentatsioon, proovisin kõike üles tõsta vanade käsiraamatute järgi), kuid teise dokumentatsioon oli tasemel, kuid mitte ilma puudusteta. Selleks, et lihtsustada töö tegemist neile, kes sellise ülesandega silmitsi seisavad, on see artikkel kirjutatud.
Seda artiklit lugedes õpite tegema inkrementaalseid varukoopiaid, salvestama neid eemalolevale serverile (varukoopiaid sisaldav repository) ja taastama neid, kui andmed kaovad või esinevad teised probleemid peamise serveriga.
Ettevalmistus
Manuaali järgimiseks vajate kahte VPS-i. Esimene on salvestus (varunduste hoidla), teine on PostgreSQL server (minu puhul PostgreSQL versioon 11).
Eeldatakse, et PostgreSQL serveris on teil root, sudo kasutaja, postgres kasutaja ja PostgreSQL on installitud (postgres kasutaja luuakse automaatselt PostgreSQL-i installimisel), ja hoidlas on root ja sudo kasutaja (manuaalis kasutatakse kasutajanime pgbackrest).
Et teil oleks vähem probleeme juhiste järgimisel — kursiivis mainin kus, millise kasutaja ja milliste õigustega ma käsklusi täitsin artikli kirjutamise ja kontrollimise ajal.
pgbackresti installimine
Hoidla (kasutaja pgbackrest):
1. Laadige alla pgbackresti arhiiv ja viige selle sisu kausta /build:
sudo mkdir /build
sudo wget -q -O -
https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz |
sudo tar zx -C /build2. Installige vajalikud sõltuvused:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev3. Koguge pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Koonime käivitatava faili katalooge /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest vajab perl'i. Paigaldame:
sudo apt-get install perl6. Loome logide kataloogid ja anname neile õigused:
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. Kontrollime:
pgbackrest versionPostgres server (sudo kasutaja või root):
Pgbackrest'i installimise protsess postgres serveris on sarnane installimise protsessiga repositoori (jah, pgbackrest peab olema mõlemal serveril), aga 6. punktis asenda teise ja viimase käsu:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.confjärgmiseks:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confServerite vahelise suhtluse seadistamine passwordless SSH kaudu
Et pgbackrest korralikult töötaks, on vajalik seadistada suhtlus postgres serveri ja repositoori vahel võtme-faili kaudu.
Hoidla (kasutaja pgbackrest):
Loome võtmete paari:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""Tähelepanu! Ülaltoodud käsud tuleb täita ilma sudo.
Postgres server (sudo kasutaja või root):
Loome võtmete paari:
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 kasutaja):
Kopeerime postgres serveri avaliku võtme repository serverisse:
(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_keysSelle sammu käigus küsitakse root kasutaja parooli. Sisestage kindlasti postgres serveri root kasutaja parool!
Postgres server (sudo kasutaja):
Kopeerime repository avaliku võtme postgres serverisse:
(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
Selle sammu käigus küsitakse root kasutaja parooli. Sisestage kindlasti repository root kasutaja parool!
Kontrollin:
Repository (root kasutaja, eksperimenti puhtuse huvides):
sudo -u pgbackrest ssh postgres@Postgres server (root kasutaja, eksperimenti puhtuse huvides):
sudo -u postgres ssh pgbackrest@Veendume, et saame probleemideta juurde pääseda.
Postgres serveri seadistamine
Postgres server (sudo kasutaja või root):
1. Разрешим «стучаться» на postgres сервер с внешних ip. Для этого отредактируем файл postgresql.conf (находится в папке /etc/postgresql/11/main), добавив в него строчку:
listen_addresses = '*'Если такая строка уже есть — либо раскомментируйте ее, либо установите значение параметра как ‘*’.
Failis pg_hba.conf (так же находится в папке /etc/postgresql/11/main) добавляем следующие строчки:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5kus:
hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля2. Внесем необходимые настройки в postgresql.conf (он находится в папке /etc/postgresql/11/main) для работы pgbackrest:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica3. Внесем необходимые настройки в файл конфигурации pgbackrest (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=<repository_server_ip>4. Перезагрузим postgresql:
sudo service postgresql restartНастройка сервера-репозитория
Репозиторий (pgbackrest пользователь):
Внесем необходимые настройки в файл конфигурации 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 # Parameeter, mis näitab, kui palju täisvarukoopiaid hoida. St, kui teil on kaks täisvarukoopiat ja te loote kolmanda - esimesed kaks eemaldatakse koos inkrementidega.
start-fast=y # Alustab varukoopiat kohe, selle parameetri kohta saate lugeda siit https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingLoo hoidla
Репозиторий (pgbackrest пользователь):
Loome uue hoidla klastrile main:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Kontrollimine
Postgres server (sudo kasutaja või root):
Kontrollime postgres serveris:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info checkРепозиторий (pgbackrest пользователь):
Kontrollime repository serveris:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkVeenduge, et väljundis on rida „check command end: completed successfully”.
Kuidas, olete väsinud? Liigume põnevama juurde.
Teeme varukoopia
Репозиторий (pgbackrest пользователь):
1. Teeme varukoopia:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Veenduge, et varukoopia on loodud:
ls /var/lib/pgbackrest/backup/main/Pgbackrest loob esimese täisvarukoopia. Soovi korral võite varukoopia käskluse uuesti käivitada ja veenduda, et süsteem loob inkrementaalse varukoopia.
Kui soovite teha täielikku varukoopiat uuesti, siis märkige täiendav lipp:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backupKui soovite konsoolis üksikasjalikku väljundit, märkige ka:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupTaastame varukoopia
Postgres server (sudo kasutaja või root):
1. Peatame töötava klastrit:
sudo pg_ctlcluster 11 main stop2. Taastame varukoopiast:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Käivitame klastrit:
sudo pg_ctlcluster 11 main startPärast varukoopia taastamist peame tegema uue varukoopia:
Репозиторий (pgbackrest пользователь):
sudo pgbackrest --stanza=main backupSellega on kõik. Lõpetuseks tahan meelde tuletada, et ma ei püüa mingil juhul esitada end senior DBA-na ning iga võimaluse korral kasutan pilve. Praegu hakkan ise uurima erinevaid teemasid nagu varundamine, replikatsioon, jälgimine jne ja tulemuste kohta kirjutan lühikesi aruandeid, et anda oma panus kogukonda ja jätta endale väikseid abimaterjale.
Järgmistes artiklites püüan rääkida lisafunktsioonidest — andmete taastamine puhtale klastrile, varukoopiate krüpteerimine ja S3-le avaldamine, varukoopiad rsynci kaudu.
Allikas: habr.com
