Ավելացվող postgresql կրկնօրինակումներ pgbackrest-ով - դասընթաց ծրագրավորողի կողմից երիտասարդ մարտիկի համար

Հրաժարում պատասխանատվությունից

Ես ծրագրավորող եմ: Կոդ եմ գրում և տվյալների բազայի հետ շփվում եմ միայն որպես օգտատեր։ Ես ոչ մի կերպ չեմ ձևանում, որ համակարգային ադմինիստրատոր եմ, առավել ևս dba: Բայց…

Այնպես ստացվեց, որ ինձ անհրաժեշտ էր կազմակերպել postgresql տվյալների բազայի կրկնօրինակում: Առանց ամպերի. պարզապես օգտագործեք SSH և համոզվեք, որ ամեն ինչ աշխատում է առանց գումար խնդրելու: Ի՞նչ ենք մենք անում նման դեպքերում։ Ճիշտ է, մենք pgdump-ը մղում ենք cron-ի մեջ, ամեն օր կրկնօրինակում ենք ամեն ինչ արխիվ, և եթե լրիվ կորչում ենք, այս արխիվը ուղարկում ենք հեռու մի տեղ:

Այս անգամ դժվարությունն այն էր, որ ըստ պլանների տվյալների բազան պետք է աճեր օրական մոտ +- 100 ՄԲ-ով։ Իհարկե, մի երկու շաբաթ անց pgdump-ով ամեն ինչ կրկնօրինակելու ցանկությունը կվերանա։ Այստեղ օգնության են հասնում լրացուցիչ կրկնօրինակները:

Հետաքրքի՞ր է: Բարի գալուստ կատու:

Ավելացվող կրկնօրինակումը կրկնօրինակման մի տեսակ է, երբ ոչ բոլոր սկզբնաղբյուր ֆայլերը պատճենվում են, այլ միայն նորերը և դրանք փոխվել են նախորդ պատճենի ստեղծումից հետո:

Ինչպես ցանկացած ծրագրավորող, ով բացարձակապես չէր ցանկանում (այն ժամանակ) հասկանալ postgres-ի բարդությունները, ես ուզում էի գտնել կանաչ կոճակը: Դե, գիտեք, ինչպես 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 օգտագործող կամ արմատ).

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 օգտագործող կամ արմատ).

Ստեղծեք բանալիների զույգ.

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 օգտագործող կամ արմատ).

1. Եկեք թույլ տանք թակել postgres սերվերը արտաքին IP-ներից: Դա անելու համար խմբագրեք ֆայլը postgresql.conf (գտնվում է /etc/postgresql/11/հիմնական թղթապանակում), դրան ավելացնելով տողը.

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 օգտագործող կամ արմատ).

Մենք ստուգում ենք 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 օգտագործող կամ արմատ).

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

Տվյալների բազան վերջին FULL կրկնօրինակի վիճակին վերականգնելու համար օգտագործեք հրամանը՝ չնշելով recovery_target.

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

Կարևոր. Վերականգնումից հետո կարող է պատահել, որ տվյալների բազան խրվի վերականգնման ռեժիմում (կլինեն սխալներ, ինչպիսիք են ERROR. չի կարող կատարել DROP DATABASE-ը միայն կարդալու գործարքում): Ճիշտն ասած, ես դեռ չեմ հասկացել, թե սա ինչի հետ է կապված։ Լուծումը հետևյալն է (հրամանի կատարումից հետո ձեզ հարկավոր է մի փոքր սպասել).

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

Փաստորեն, հնարավոր է վերականգնել կոնկրետ կրկնօրինակը իր անունով: Այստեղ ես միայն Ես կներկայացնեմ հղումը փաստաթղթերում այս հատկանիշի նկարագրությանը. Մշակողները խորհուրդ են տալիս զգուշությամբ օգտագործել այս տարբերակը և բացատրել, թե ինչու: Ես ինքս կարող եմ ավելացնել, որ ես օգտագործել եմ այն։ Եթե ​​իսկապես կարիք ունեք, համոզվեք, որ վերականգնումից հետո տվյալների բազան դուրս է գալիս վերականգնման ռեժիմից (ընտրեք pg_is_in_recovery() պետք է ցույց տա «f») և, ամեն դեպքում, վերականգնելուց հետո ամբողջական կրկնօրինակում կատարեք:

3. Սկսեք կլաստերը.

sudo pg_ctlcluster 11 main start

Կրկնօրինակը վերականգնելուց հետո մենք պետք է կատարենք երկրորդ կրկնօրինակում.

Պահեստ (pgbackrest օգտվող).

sudo pgbackrest --stanza=main backup

Այսքանը: Եզրափակելով՝ հիշեցնեմ, որ ես ոչ մի կերպ չեմ փորձում ավագ ԴԲԱ ձևանալ և ամենափոքր հնարավորության դեպքում կօգտագործեմ ամպերը։ Ներկայումս ես ինքս սկսում եմ ուսումնասիրել տարբեր թեմաներ, ինչպիսիք են կրկնօրինակումը, կրկնօրինակումը, մոնիտորինգը և այլն: և ես փոքր հաշվետվություններ եմ գրում արդյունքների մասին, որպեսզի փոքր ներդրում ունենամ համայնքում և ինքս ինձ համար փոքրիկ խաբեբաներ թողնելու համար:

Հետևյալ հոդվածներում ես կփորձեմ խոսել լրացուցիչ հնարավորությունների մասին՝ տվյալների վերականգնում մաքուր կլաստերի, կրկնօրինակների գաղտնագրում և հրապարակում S3-ում, կրկնօրինակում rsync-ի միջոցով:

Source: www.habr.com

Добавить комментарий