نسخ احتياطي تزايدي postgresql مع pgbackrest - دورة مقاتلة شابة من مطور

تنصل

أنا مطور. أكتب رمزًا ، وأتفاعل مع قاعدة البيانات فقط كمستخدم. لا أتظاهر بأي حال من الأحوال بأنني مسؤول نظام ، وعلاوة على ذلك ، أنا dba. لكن…

لقد حدث أنني كنت بحاجة إلى تنظيم نسخة احتياطية من قاعدة بيانات postgresql. لا توجد سحاب - احتفظ بـ SSH واجعل كل شيء يعمل ولا تطلب المال. ماذا نفعل في مثل هذه الحالات؟ هذا صحيح ، نقوم بدفع pgdump إلى cron ، ونسخ كل شيء احتياطيًا إلى الأرشيف كل يوم ، وإذا تفرقنا تمامًا ، فإننا نرسل هذا الأرشيف في مكان ما بعيدًا.

هذه المرة ، تكمن الصعوبة في أنه وفقًا للخطط ، كان من المفترض أن تنمو قاعدة البيانات بحوالي + - 100 ميجابايت في اليوم. بالطبع ، بعد أسبوعين ، ستختفي الرغبة في عمل نسخة احتياطية من كل شيء باستخدام برنامج pgdump. هذا هو المكان الذي تصبح فيه النسخ الاحتياطية التزايدية في متناول اليد.

مثير للاهتمام؟ مرحبًا تحت القط.

النسخ الاحتياطي التزايدي هو نوع من النسخ الاحتياطي عندما لا يتم نسخ جميع ملفات المصدر ، ولكن فقط الملفات الجديدة والمتغيرة منذ إنشاء النسخة السابقة.

مثل أي مطور لم يكن راغبًا تمامًا (في ذلك الوقت) في فهم تعقيدات postgres ، كنت أرغب في العثور على زر أخضر. حسنًا ، كما تعلمون ، كما هو الحال في AWS ، DigitalOcean: لقد ضغطت على زر واحد - حصلت على النسخ المتماثل ، وضغطت على الثاني - أعددت النسخ الاحتياطية ، والثالث - كل شيء تراجع منذ ساعتين. لم أجد زرًا وأداة واجهة مستخدم رسومية جميلة. إذا كنت تعرف واحدة (مجانية أو رخيصة) - اكتب عنها في التعليقات.

Googling لقد وجدت أداتين com.pgbarman и com.pgbackrest. مع الأول ، لم أنجح ببساطة (وثائق رديئة للغاية ، حاولت التقاط كل شيء وفقًا للأدلة القديمة) ، لكن الثاني اتضح أنه على مستوى التوثيق ، ولكن ليس بدون عيب. لتبسيط عمل أولئك الذين يواجهون مهمة مماثلة ، تمت كتابة هذه المقالة.

بعد قراءة هذه المقالة ، سوف تتعلم كيفية عمل نسخ احتياطية تزايدي ، وحفظها على خادم بعيد (مستودع مع نسخ احتياطية) واستعادتها في حالة فقد البيانات أو مشاكل أخرى على الخادم الرئيسي.

تدريب

ستحتاج إلى اثنين من VPS لتشغيل الدليل. الأول سيكون المستودع (المستودع الذي ستكون عليه النسخ الاحتياطية) ، والثاني ، في الواقع ، الخادم نفسه مع postgres (في حالتي ، الإصدار 11 من postgres).

من المفترض أنه على الخادم الذي يحتوي على 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 يتطلب بيرل. ثَبَّتَ:

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 على خادم postgres التثبيت على أحد المستودعات (نعم ، يجب تثبيت pgbackrest على كلا الخادمين) ، ولكن في الفقرة السادسة ، الأمر الثاني والأخير:

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 / 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):

قم بإجراء الإعدادات اللازمة في ملف التكوين com.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

لاستعادة قاعدة البيانات إلى حالة آخر نسخة احتياطية كاملة ، استخدم الأمر دون تحديد recovery_target:

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

مهم! بعد الاسترداد ، قد يتضح أن قاعدة البيانات معلقة في وضع الاسترداد (ستكون هناك أخطاء مثل خطأ: لا يمكن تنفيذ 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

إضافة تعليق