pgbackrest کے ساتھ incremental postgresql بیک اپ - ڈویلپر کی طرف سے نوجوان لڑاکا کے لیے ایک کورس

دستبرداری

میں ایک ڈویلپر ہوں۔ میں کوڈ لکھتا ہوں اور ڈیٹا بیس کے ساتھ صرف بطور صارف تعامل کرتا ہوں۔ میں کسی بھی طرح سے سسٹم ایڈمنسٹریٹر ہونے کا بہانہ نہیں کرتا، بہت کم ڈی بی اے۔ لیکن…

ایسا ہوا کہ مجھے postgresql ڈیٹا بیس کا بیک اپ ترتیب دینے کی ضرورت تھی۔ کوئی بادل نہیں - صرف SSH استعمال کریں اور یقینی بنائیں کہ سب کچھ پیسے مانگے بغیر کام کرتا ہے۔ ایسے معاملات میں ہم کیا کریں؟ یہ ٹھیک ہے، ہم پی جی ڈمپ کو کرون میں دھکیلتے ہیں، ہر روز آرکائیو میں ہر چیز کا بیک اپ لیتے ہیں، اور اگر ہم مکمل طور پر کھو جائیں، تو ہم اس آرکائیو کو کہیں دور بھیج دیتے ہیں۔

اس بار مشکل یہ تھی کہ منصوبے کے مطابق ڈیٹا بیس میں تقریباً +- 100 MB یومیہ اضافہ ہونا تھا۔ یقینا، چند ہفتوں کے بعد pgdump کے ساتھ ہر چیز کا بیک اپ لینے کی خواہش ختم ہو جائے گی۔ یہ وہ جگہ ہے جہاں اضافی بیک اپ بچاؤ میں آتے ہیں۔

دلچسپ؟ بلی میں خوش آمدید۔

انکریمنٹل بیک اپ بیک اپ کی ایک قسم ہے جب تمام سورس فائلوں کو کاپی نہیں کیا جاتا ہے، بلکہ صرف نئی اور وہ جو پچھلی کاپی کی تخلیق کے بعد سے تبدیل ہوئی ہیں۔

کسی بھی ڈویلپر کی طرح جو پوسٹگریس کی پیچیدگیوں کو سمجھنے کے لئے بالکل تیار نہیں تھا (اس وقت)، میں سبز بٹن تلاش کرنا چاہتا تھا۔ ٹھیک ہے، آپ جانتے ہیں، جیسے AWS، DigitalOcean میں: آپ نے ایک بٹن دبایا - آپ کو نقل ملا، آپ نے دوسرا دبایا - آپ نے بیک اپ سیٹ کیا، تیسرا - آپ نے ہر چیز کو کچھ گھنٹے پیچھے کر دیا۔ مجھے کوئی بٹن یا خوبصورت GUI ٹول نہیں ملا۔ اگر آپ کسی کو جانتے ہیں (مفت یا سستا)، تبصرے میں اس کے بارے میں لکھیں۔

گوگل کرنے کے بعد مجھے دو ٹولز ملے pgbarman и pgbackrest. میں صرف پہلی میں کامیاب نہیں ہوا (بہت کم دستاویزات، میں نے پرانے دستورالعمل کے مطابق ہر چیز کا پتہ لگانے کی کوشش کی)، لیکن دوسرے کے ساتھ دستاویزات برابر ثابت ہوئیں، لیکن خامیوں کے بغیر نہیں۔ ان لوگوں کے کام کو آسان بنانے کے لیے جنہیں اسی طرح کے کام کا سامنا ہے، یہ مضمون لکھا گیا تھا۔

اس مضمون کو پڑھنے کے بعد، آپ سیکھیں گے کہ کس طرح اضافی بیک اپ بنانا ہے، انہیں ریموٹ سرور (بیک اپ کے ساتھ ذخیرہ) میں محفوظ کرنا ہے اور مرکزی سرور پر ڈیٹا ضائع ہونے یا دیگر مسائل کی صورت میں انہیں بحال کرنا ہے۔

ٹریننگ

دستی کو دوبارہ تیار کرنے کے لیے آپ کو دو VPS کی ضرورت ہوگی۔ پہلا اسٹوریج ہوگا (وہ ذخیرہ جس پر بیک اپ اسٹور کیے جائیں گے)، اور دوسرا، حقیقت میں، سرور خود پوسٹگریس کے ساتھ (میرے معاملے میں، پوسٹگریس کا ورژن 11)۔

یہ فرض کیا جاتا ہے کہ پوسٹگریس والے سرور پر آپ کے پاس روٹ، سوڈو صارف، پوسٹگریس صارف ہے اور پوسٹگریس خود انسٹال ہے (پوسٹگریس یوزر پوسٹگریس کیو ایل انسٹال کرتے وقت خود بخود بن جاتا ہے)، اور ریپوزٹری سرور پر روٹ اور سوڈو یوزر موجود ہے (دستی میں صارف کا نام 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 کو پرل کی ضرورت ہے۔ انسٹال کریں:

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

پوسٹگریس سرور (سوڈو صارف یا جڑ):

پوسٹگریس والے سرور پر پی جی بیکریسٹ انسٹال کرنے کا عمل ریپوزٹری پر انسٹالیشن کے عمل سے ملتا جلتا ہے (ہاں، پی جی بیکریسٹ دونوں سرورز پر انسٹال ہونا چاہیے) لیکن 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 کے صحیح طریقے سے کام کرنے کے لیے، کلیدی فائل کا استعمال کرتے ہوئے پوسٹگریس سرور اور ریپوزٹری کے درمیان تعامل کو ترتیب دینا ضروری ہے۔

ذخیرہ (صارف pgbackrest):

ایک کلیدی جوڑا بنائیں:

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

ہوشیار! ہم سوڈو کے بغیر مذکورہ کمانڈ چلاتے ہیں۔

پوسٹگریس سرور (سوڈو صارف یا جڑ):

ایک کلیدی جوڑا بنائیں:

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

اس مرحلے پر آپ سے روٹ صارف کا پاس ورڈ طلب کیا جائے گا۔ آپ کو پوسٹگریس سرور کے روٹ صارف کا پاس ورڈ درج کرنے کی ضرورت ہے!

پوسٹگریس سرور (سوڈو صارف):

پوسٹگریس کے ساتھ ریپوزٹری پبلک کلید کو سرور پر کاپی کریں:

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

پوسٹگریس سرور (جڑ صارف، تجربے کی پاکیزگی کے لیے):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

ہم اس بات کو یقینی بناتے ہیں کہ ہم بغیر کسی پریشانی کے رسائی حاصل کریں۔

پوسٹگریس سرور ترتیب دینا

پوسٹگریس سرور (سوڈو صارف یا جڑ):

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

Проверка

پوسٹگریس سرور (سوڈو صارف یا جڑ):

ہم پوسٹگریس سرور پر چیک کرتے ہیں:

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

بیک اپ بحال کرنا

پوسٹگریس سرور (سوڈو صارف یا جڑ):

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

درحقیقت، اس کے نام سے مخصوص بیک اپ کو بحال کرنا ممکن ہے۔ یہاں میں صرف ہوں۔ میں دستاویزات میں اس خصوصیت کی تفصیل کا لنک فراہم کروں گا۔. ڈویلپر اس اختیار کو احتیاط کے ساتھ استعمال کرنے کا مشورہ دیتے ہیں اور اس کی وجہ بتاتے ہیں۔ میں اپنے آپ سے شامل کرسکتا ہوں کہ میں نے اسے استعمال کیا۔ اگر آپ کو واقعی ضرورت ہے، تو یقینی بنائیں کہ ریکوری کے بعد ڈیٹا بیس ریکوری موڈ سے باہر نکلتا ہے (select pg_is_in_recovery() کو "f" دکھانا چاہیے) اور، صرف اس صورت میں، ریکوری کے بعد مکمل بیک اپ بنائیں۔

3. کلسٹر شروع کریں:

sudo pg_ctlcluster 11 main start

بیک اپ بحال کرنے کے بعد، ہمیں دوسرا بیک اپ انجام دینے کی ضرورت ہے:

ذخیرہ (pgbackrest صارف):

sudo pgbackrest --stanza=main backup

بس۔ آخر میں، میں آپ کو یاد دلانا چاہوں گا کہ میں کسی بھی طرح سے سینئر ڈی بی اے ہونے کا بہانہ کرنے کی کوشش نہیں کر رہا ہوں اور ذرا بھی موقع پر بادلوں کو استعمال کروں گا۔ فی الحال، میں خود مختلف عنوانات کا مطالعہ شروع کر رہا ہوں جیسے بیک اپ، نقل، نگرانی وغیرہ۔ اور میں نتائج کے بارے میں چھوٹی چھوٹی رپورٹیں لکھتا ہوں تاکہ کمیونٹی میں تھوڑا سا حصہ ڈالوں اور اپنے لیے چھوٹی چھوٹی دھوکہ دہی چھوڑوں۔

مندرجہ ذیل مضامین میں میں اضافی خصوصیات کے بارے میں بات کرنے کی کوشش کروں گا - صاف کلسٹر میں ڈیٹا کی وصولی، بیک اپ کی خفیہ کاری اور S3 پر شائع کرنا، rsync کے ذریعے بیک اپ۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں