Հրաժարում պատասխանատվությունից
Ես ծրագրավորող եմ: Կոդ եմ գրում և տվյալների բազայի հետ շփվում եմ միայն որպես օգտատեր։ Ես ոչ մի կերպ չեմ ձևանում, որ համակարգային ադմինիստրատոր եմ, առավել ևս 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()"
Փաստորեն, հնարավոր է վերականգնել կոնկրետ կրկնօրինակը իր անունով: Այստեղ ես միայն
3. Սկսեք կլաստերը.
sudo pg_ctlcluster 11 main start
Կրկնօրինակը վերականգնելուց հետո մենք պետք է կատարենք երկրորդ կրկնօրինակում.
Պահեստ (pgbackrest օգտվող).
sudo pgbackrest --stanza=main backup
Այսքանը: Եզրափակելով՝ հիշեցնեմ, որ ես ոչ մի կերպ չեմ փորձում ավագ ԴԲԱ ձևանալ և ամենափոքր հնարավորության դեպքում կօգտագործեմ ամպերը։ Ներկայումս ես ինքս սկսում եմ ուսումնասիրել տարբեր թեմաներ, ինչպիսիք են կրկնօրինակումը, կրկնօրինակումը, մոնիտորինգը և այլն: և ես փոքր հաշվետվություններ եմ գրում արդյունքների մասին, որպեսզի փոքր ներդրում ունենամ համայնքում և ինքս ինձ համար փոքրիկ խաբեբաներ թողնելու համար:
Հետևյալ հոդվածներում ես կփորձեմ խոսել լրացուցիչ հնարավորությունների մասին՝ տվյալների վերականգնում մաքուր կլաստերի, կրկնօրինակների գաղտնագրում և հրապարակում S3-ում, կրկնօրինակում rsync-ի միջոցով:
Source: www.habr.com