Pgbackrest менен кошумча постgresql камдык көчүрмөлөрү - иштеп чыгуучунун жаш согушкерлери үчүн курс

Жоопкерчиликтен баш тартуу

Мен иштеп чыгуучумун. Мен код жазам жана маалымат базасы менен колдонуучу катары гана иштешем. Эч кандай жол менен мен өзүмдү системалык администратормун деп көрсөтпөйм. Бирок…

Ошентип, мен postgresql маалымат базасынын камдык көчүрмөсүн уюштурууга туура келди. Булуттар жок - жөн гана SSH колдонуңуз жана баары акча сурабастан иштеп жатканын текшериңиз. Мындай учурларда эмне кылабыз? Туура, биз pgdumpти cronго түртүп, бардыгын архивге күн сайын резервдик көчүрүп, эгер биз толугу менен жоголсок, бул архивди алыс жакка жөнөтөбүз.

Бул жолу кыйынчылык пландарга ылайык, маалымат базасы күнүнө болжол менен +- 100 МБга өсүшү керек болчу. Албетте, бир-эки жумадан кийин бардыгын pgdump менен камдык кылуу каалоосу жок болот. Бул жерде кошумча резервдик көчүрмөлөр жардамга келет.

Кызыктуубу? кош келиңиз.

Кошумча резервдик көчүрүү – бардык баштапкы файлдар көчүрүлбөй, жаңылары жана мурунку көчүрмөсү түзүлгөндөн бери өзгөртүлгөндөр гана көчүрүлгөн резервдик көчүрмөнүн бир түрү.

Постгрестин татаалдыктарын түшүнгүсү келбеген (ошол убакта) ар кандай иштеп чыгуучудай эле, мен жашыл баскычты тапкым келди. Билесизби, AWS, DigitalOcean сыяктуу: сиз бир баскычты бастыңыз - репликацияга ээ болдуңуз, экинчисин бастыңыз - камдык көчүрмөлөрдү түздүңүз, үчүнчүсү - бардыгын бир нече саатка артка жылдырдыңыз. Мен баскычты же кооз GUI куралын тапкан жокмун. Эгер сиз билсеңиз (акысыз же арзан), бул тууралуу комментарийге жазыңыз.

Гуглдан кийин мен эки курал таптым pgbarman и pgbackrest. Мен жөн гана биринчиси менен ийгиликке жеткен жокмун (өтө сейрек документация, мен бардыгын эски колдонмолорго ылайык чечүүгө аракет кылдым), бирок экинчисинде документтер талаптагыдай болуп чыкты, бирок кемчиликтери жок эмес. Окшош милдетке туш болгондордун ишин жөнөкөйлөтүү үчүн, бул макала жазылган.

Бул макаланы окугандан кийин, сиз кошумча резервдик көчүрмөлөрдү кантип жасоону, аларды алыскы серверге (резервдик көчүрмөлөрү бар репозиторийге) сактоону жана маалымат жоголгондо же негизги серверде башка көйгөйлөр болгондо аларды кантип калыбына келтирүүнү үйрөнөсүз.

үйрөтүү

Колдонмону кайра чыгаруу үчүн сизге эки VPS керек. Биринчиси - сактагыч (камдык көчүрмөлөр сактала турган репозиторий), экинчиси, чындыгында, сервердин өзү postgres (менин учурда, postgresтин 11-версиясы).

Postgres менен серверде сизде root, sudo колдонуучу, postgres колдонуучу жана postgres өзү орнотулган (postgres колдонуучусу postgresql орнотууда автоматтык түрдө түзүлөт), ал эми репозиторий серверинде root жана sudo колдонуучу бар (колдо) pgbackrest колдонуучу аты колдонулат).

Көрсөтмөлөрдү чыгарууда көйгөйлөрүңүз аз болушу үчүн, мен курсив менен жазам кайда, кайсы колдонуучу менен жана кандай укуктар менен буйрукту аткардым макаланы жазып жана текшерип жатканда.

pgbackrest орнотулууда

Репозиторий (колдонуучу pgbackrest):

1. Архивди pgbackrestтен жүктөп алып, анын мазмунун /build папкасына өткөрүңүз:

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

2. Монтаждоо үчүн зарыл болгон көз карандылыктарды орнотуңуз:

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

3. pgbackrest чогултуу:

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

4. Аткарылуучу файлды /usr/bin каталогуна көчүрүңүз:

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

5. Pgbackrest үчүн Perl керек. Орнотуу:

sudo apt-get install perl

6. Журналдар үчүн каталогдорду түзүңүз, аларга белгилүү укуктарды бериңиз:

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. Текшерүү:

pgbackrest version

Postgres сервери (sudo колдонуучусу же root):

Postgres менен серверге pgbackrest орнотуу процесси репозиторийдеги орнотуу процессине окшош (ооба, pgbackrest эки серверге тең орнотулушу керек), бирок 6-абзацта экинчи жана акыркы буйруктар менен:

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

менен алмаштыруу:

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

Сырсөзсүз SSH аркылуу серверлердин өз ара аракеттенүүсүн орнотуу

pgbackrest туура иштеши үчүн, ачкыч файлын колдонуу менен postgres сервери менен репозиторийдин ортосундагы өз ара аракеттенүүнү конфигурациялоо керек.

Репозиторий (колдонуучу pgbackrest):

ачкыч жуп түзүү:

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

Эскертүү! Биз жогорудагы буйруктарды sudo жок иштетебиз.

Postgres сервери (sudo колдонуучусу же root):

ачкыч жуп түзүү:

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

Репозиторий (sudo колдонуучусу):

Postgres серверинин ачык ачкычын репозиторий серверине көчүрүңүз:

(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

Бул кадамда сизден түпкү колдонуучу үчүн сырсөз суралат. Сиз postgres серверинин түпкү колдонуучунун сырсөзүн киргизишиңиз керек!

Postgres сервери (sudo колдонуучусу):

Репозиторийдин ачык ачкычын postgres менен серверге көчүрүңүз:

(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

Бул кадамда сизден түпкү колдонуучу үчүн сырсөз суралат. Сиз репозиторийдин түпкү колдонуучунун сырсөзүн так киргизишиңиз керек!

текшерүү:

Репозиторий (тамыр колдонуучу, эксперименттин тазалыгы үчүн):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres сервери (тамыр колдонуучу, эксперименттин тазалыгы үчүн):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Биз көйгөйсүз жетүүбүзгө ынанабыз.

Postgres серверин орнотуу

Postgres сервери (sudo колдонуучусу же root):

1. Тышкы IPлерден postgres серверин тыкылдатууга уруксат берели. Бул үчүн, файлды түзөтүңүз postgresql.conf (/etc/postgresql/11/main папкасында жайгашкан), ага сапты кошуу:

listen_addresses = '*'

Эгерде мындай сап мурунтан эле бар болсо, аны комментарийден алып салыңыз же параметрдин маанисин '*' катары коюңуз.

Файлда pg_hba.conf (ошондой эле папкада жайгашкан /etc/postgresql/11/main) төмөнкү саптар менен толукталсын:

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

мында:

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 = replica

3. Келгиле, 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=<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

Репозиторий түзүү

Репозиторий (pgbackrest колдонуучусу):

Кластер үчүн жаңы сактагыч түзүңүз негизги:

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

карап чыгуу

Postgres сервери (sudo колдонуучусу же root):

Биз postgres серверинде текшеребиз:

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

Репозиторий (pgbackrest колдонуучусу):

Биз репозиторий серверинде текшеребиз:

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

Биз чыгарууда "текшерүү буйругунун соңу: ийгиликтүү аяктады" деген сапты көрөбүз.

Чарчадыңызбы? Эң кызыктуу бөлүгүнө өтөбүз.

Камдык көчүрмөнү түзүү

Репозиторий (pgbackrest колдонуучусу):

1. Камдык көчүрмөнү жасаңыз:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Камдык көчүрмө түзүлгөнүн текшериңиз:

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

Pgbackrest биринчи толук камдык көчүрмөсүн түзөт. Кааласаңыз, резервдик көчүрүү буйругун кайра иштетип, система кошумча камдык көчүрмөнү түзөөрүн текшерсеңиз болот.

Эгер сиз толук камдык көчүрмөнү кайра жасагыңыз келсе, анда кошумча белгини көрсөтүңүз:

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

Эгер сиз консолдун деталдуу чыгышын кааласаңыз, анда төмөнкүлөрдү белгилеңиз:

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

Камдык көчүрмөнү калыбына келтирүү

Postgres сервери (sudo колдонуучусу же root):

1. Иштеп жаткан кластерди токтотуу:

sudo pg_ctlcluster 11 main stop

2. Камдык көчүрмөдөн калыбына келтирүү:

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

Чтобы восстановить базу в состояние последнего ПОЛНОГО бэкапа используйте команду без указания recovery_target:

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

Важно! После восстановления может оказаться так, что база зависнет в режиме восстановления (будут ошибки в духе ERROR: cannot execute DROP DATABASE in a read-only transaction). Честно говоря, я еще не понял, с чем это связано. Решается следующим образом (нужно будет малость подождать после исполнения команды):

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

На самом деле, есть возможность восстановить конкретный бэкап по его имени. Здесь я лишь укажу ссылку на описание данной фичи в документации. Разработчики советуют использовать данный параметр с осторожностью и объясняют почему. От себя могу добавить, что я его использовал. Если очень нужно — убедитесь, что после восстановления база вышла из recovery mode (select pg_is_in_recovery() должен показать «f») и на всякий случай сделайте полный бэкап после восстановления.

3. Кластерди баштоо:

sudo pg_ctlcluster 11 main start

Камдык көчүрмөнү калыбына келтиргенден кийин, биз экинчи камдык көчүрмөнү аткарышыбыз керек:

Репозиторий (pgbackrest колдонуучусу):

sudo pgbackrest --stanza=main backup

Баары болду. Жыйынтыктап айтканда, мен өзүмдү улук дба катары көрсөтүүгө эч кандай аракет кылбай турганымды жана кичинекей мүмкүнчүлүктө булуттарды колдоно турганымды эскертип кетким келет. Учурда мен өзүм камдык көчүрмө, репликация, мониторинг ж.б.у.с ар кандай темаларды изилдей баштадым. жана мен коомчулукка аз да болсо салым кошуу максатында натыйжалар жөнүндө чакан отчетторду жазып, өзүмө кичинекей чийки баракчаларды калтырам.

Кийинки макалаларда мен кошумча функциялар жөнүндө айтууга аракет кылам - таза кластерге маалыматтарды калыбына келтирүү, камдык көчүрмөлөрдү шифрлөө жана S3ге жарыялоо, rsync аркылуу камдык көчүрмөлөр.

Source: www.habr.com

Комментарий кошуу