پي جي بيڪريسٽ سان وڌندڙ پوسٽ گريسڪ ايل بيڪ اپ - ڊولپر کان نوجوان فائٽر لاءِ هڪ ڪورس

رد ڪرڻ

مان هڪ ڊولپر آهيان. مان ڪوڊ لکان ٿو ۽ ڊيٽابيس سان رابطو ڪريان ٿو صرف صارف جي طور تي. ڪنهن به طريقي سان مان ظاهر نٿو ڪريان ته هڪ سسٽم ايڊمنسٽريٽر هجڻ، تمام گهٽ هڪ ڊي بي. پر…

اهو ائين ٿيو آهي ته مون کي پوسٽ گريسڪ ايل ڊيٽابيس جي بيڪ اپ کي منظم ڪرڻ جي ضرورت هئي. ڪابه بادل نه آهي - صرف SSH استعمال ڪريو ۽ پڪ ڪريو ته هر شي ڪم ڪري ٿي بغير پئسن جي پڇڻ جي. اهڙين حالتن ۾ اسان ڇا ڪريون؟ اهو صحيح آهي، اسان pgdump کي ڪرون ۾ ڌڪيندا آهيون، هر روز آرڪائيو ۾ بيڪ اپ ڪندا آهيون، ۽ جيڪڏهن اسان مڪمل طور تي گم ٿي ويا آهيون، اسان هن آرڪائيو کي پري پري موڪليندا آهيون.

هن ڀيري ڏکيائي اها هئي ته منصوبن جي مطابق، ڊيٽابيس کي تقريباً +- 100 MB في ڏينهن وڌڻو هو. يقينن، ڪجهه هفتن کان پوءِ pgdump سان هر شي کي بيڪ اپ ڪرڻ جي خواهش غائب ٿي ويندي. هي آهي جتي واڌارو بيڪ اپ بچاء لاء اچي ٿو.

دلچسپ؟ ٻلي ۾ ڀليڪار.

واڌو بيڪ اپ هڪ قسم جو بيڪ اپ آهي جڏهن سڀئي ماخذ فائلون نقل نه ڪيون وينديون آهن، پر صرف نوان ۽ اهي جيڪي اڳئين ڪاپي جي ٺهڻ کان پوء تبديل ڪيا ويا آهن.

ڪنهن به ڊولپر وانگر جيڪو بلڪل ناپسنديده هو (ان وقت) پوسٽ گريس جي پيچيدگين کي سمجهڻ لاء، مون کي سائي بٽڻ ڳولڻ چاهيو. چڱو، توهان ڄاڻو ٿا، جهڙوڪ AWS، DigitalOcean ۾: توهان هڪ بٽڻ دٻايو - توهان نقل حاصل ڪيو، توهان ٻئي کي دٻايو - توهان بيڪ اپ سيٽ ڪيو، ٽيون - توهان هر شيء کي ڪجهه ڪلاڪن ۾ واپس ڪيو. مون کي هڪ بٽڻ يا هڪ خوبصورت GUI اوزار نه مليو. جيڪڏھن توھان ڄاڻو ٿا ھڪڙو (مفت يا سستو)، ان بابت لکندا تبصرن ۾.

گوگل ڪرڻ کان پوءِ مون کي ٻه اوزار مليا pgbarman и pgbackrest. مان صرف پهرين سان ڪامياب نه ٿي سگهيو آهيان (تمام گهڻو گهٽ دستاويز، مون پراڻي دستور مطابق هر شيء کي سمجهڻ جي ڪوشش ڪئي)، پر ٻئي سان گڏ دستاويز برابر ٿي ويا، پر بغير ڪنهن خامين جي. انهن جي ڪم کي آسان ڪرڻ لاء جيڪي هڪ جهڙي ڪم سان منهن ڏئي رهيا آهن، هي مضمون لکيو ويو آهي.

هن آرٽيڪل کي پڙهڻ کان پوءِ، توهان سکو ته ڪيئن وڌائجي بيڪ اپ ٺاهيو، انهن کي ريموٽ سرور ۾ محفوظ ڪيو (بڪ اپ سان گڏ مخزن) ۽ ڊيٽا جي نقصان يا مکيه سرور تي ٻين مسئلن جي صورت ۾ انهن کي بحال ڪيو.

جي تياري

دستياب کي ٻيهر تيار ڪرڻ لاءِ توهان کي ٻه VPS جي ضرورت پوندي. پهرين اسٽوريج هوندي (اها مخزن جنهن تي بيڪ اپ محفوظ ڪيا ويندا)، ۽ ٻيو، حقيقت ۾، سرور پاڻ پوسٽ گريس سان (منهنجي صورت ۾، پوسٽ گريس جو نسخو 11).

اهو فرض ڪيو ويو آهي ته سرور تي پوسٽ گريس سان توهان وٽ آهي روٽ، سوڊو يوزر، پوسٽ گريس يوزر ۽ پوسٽ گريس پاڻ انسٽال ٿيل آهي (پوسٽ گريس يوزر خودڪار طور تي ٺاهي وئي آهي جڏهن پوسٽ گريس کي انسٽال ڪيو وڃي)، ۽ مخزن جي سرور تي آهي روٽ ۽ سودو يوزر (دستي ۾ استعمال ڪندڙ جو نالو 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 صارف يا روٽ):

پوسٽ گريس سان سرور تي pgbackrest انسٽال ڪرڻ جو عمل مخزن تي انسٽاليشن جي عمل سان ملندڙ جلندڙ آهي (ها، pgbackrest ٻنهي سرورن تي نصب ٿيڻ گهرجي)، پر 6th پيراگراف ۾ ٻيو ۽ آخري حڪم:

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 صحيح طريقي سان ڪم ڪرڻ لاء، ضروري آهي ته پوسٽ گريس سرور ۽ مخزن جي وچ ۾ رابطي کي ترتيب ڏيڻ لاء اهم فائل استعمال ڪندي.

مخزن (يوزر pgbackrest):

هڪ اهم جوڙو ٺاهيو:

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

مهرباني ڪري ڏسو! اسان مٿي ڏنل حڪمن کي سوڊو کانسواءِ هلائيندا آهيون.

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 استعمال ڪندڙ):

پوسٽ گريس سرور جي عوامي ڪنجي کي مخزن سرور ڏانهن نقل ڪريو:

(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 سرور (sudo استعمال ڪندڙ):

پوسٽ گريس سان سرور ڏانهن مخزن پبلڪ ڪيچ کي نقل ڪريو:

(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 سرور (sudo صارف يا روٽ):

1. اچو ته ٻاهرين IPs کان پوسٽ گريس سرور تي دستڪ ڏيڻ جي اجازت ڏيو. ائين ڪرڻ لاء، فائل کي تبديل ڪريو 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 صارف يا روٽ):

اسان پوسٽ گريس سرور تي چيڪ ڪريون ٿا:

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

ڊيٽابيس کي بحال ڪرڻ لاءِ آخري مڪمل بيڪ اپ جي حالت ۾، حڪم استعمال ڪريو بغير وضاحت جي 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 ذريعي بيڪ اپ.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو