پشتیبان گیری افزایشی postgresql با pgbackrest - دوره ای برای یک مبارز جوان از توسعه دهنده

سلب مسئولیت

من یک توسعه دهنده هستم. من فقط به عنوان کاربر کد می نویسم و ​​با پایگاه داده تعامل دارم. من به هیچ وجه وانمود نمی کنم که یک مدیر سیستم هستم، خیلی بیشتر از آن یک dba. ولی…

این اتفاق افتاد که من نیاز به سازماندهی یک نسخه پشتیبان از پایگاه داده postgresql داشتم. بدون ابر - فقط از SSH استفاده کنید و مطمئن شوید که همه چیز بدون درخواست پول کار می کند. در چنین مواقعی چه کنیم؟ درست است، ما pgdump را به cron فشار می دهیم، هر روز از همه چیز در آرشیو نسخه پشتیبان تهیه می کنیم و اگر کاملا گم شدیم، این آرشیو را به جایی دورتر می فرستیم.

این بار مشکل این بود که طبق برنامه ریزی ها قرار بود پایگاه داده حدود +- 100 مگابایت در روز رشد کند. البته بعد از چند هفته تمایل به پشتیبان گیری از همه چیز با pgdump از بین می رود. اینجاست که بک آپ های افزایشی به کمک می آیند.

جالب هست؟ به گربه خوش آمدید

پشتیبان گیری افزایشی نوعی پشتیبان است که در آن همه فایل های منبع کپی نمی شوند، بلکه فقط فایل های جدید و آنهایی که از زمان ایجاد نسخه قبلی تغییر کرده اند، کپی می شوند.

مانند هر توسعه دهنده ای که مطلقاً (در آن زمان) تمایلی به درک پیچیدگی های postgres نداشت، می خواستم دکمه سبز رنگ را پیدا کنم. خوب، می دانید، مانند AWS، DigitalOcean: شما یک دکمه را فشار دادید - شما Replication دریافت کردید، دومی را فشار دادید - پشتیبان تهیه کردید، سومی - همه چیز را چند ساعت به عقب برگردانید. من یک دکمه یا یک ابزار رابط کاربری گرافیکی زیبا پیدا نکردم. اگر یکی (رایگان یا ارزان) را می شناسید، در نظرات در مورد آن بنویسید.

بعد از گوگل دو تا ابزار پیدا کردم pgbarman и pgbackrest. من به سادگی در مورد اول موفق نشدم (مستندات بسیار پراکنده، سعی کردم همه چیز را طبق دستورالعمل های قدیمی بفهمم)، اما در مورد دوم مستندات همتراز بود، اما نه بدون نقص. برای ساده کردن کار کسانی که با کار مشابهی روبرو هستند، این مقاله نوشته شده است.

پس از مطالعه این مقاله، نحوه تهیه نسخه پشتیبان افزایشی، ذخیره آنها در یک سرور راه دور (مخزن با پشتیبان) و بازیابی آنها در صورت از دست رفتن اطلاعات یا مشکلات دیگر در سرور اصلی را خواهید آموخت.

پرورش

برای بازتولید دفترچه راهنما به دو VPS نیاز دارید. اولین مورد ذخیره سازی (مخزنی که پشتیبان ها در آن ذخیره می شوند) و دومی در واقع خود سرور با postgres (در مورد من نسخه 11 postgres) خواهد بود.

فرض بر این است که در سرور با postgres شما root، sudo user، postgres و خود postgres نصب شده است (هنگام نصب postgresql کاربر postgres به طور خودکار ایجاد می شود) و در سرور مخزن کاربر 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

در این مرحله از شما رمز عبور کاربر root خواسته می شود. باید رمز کاربری روت سرور 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

در این مرحله از شما رمز عبور کاربر root خواسته می شود. شما باید رمز عبور کاربر اصلی مخزن را دقیقا وارد کنید!

ما بررسی می کنیم:

مخزن (کاربر ریشه، برای خلوص آزمایش):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

سرور Postgres (کاربر ریشه، برای خلوص آزمایش):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

ما مطمئن می شویم که بدون مشکل دسترسی داریم.

راه اندازی سرور postgres

سرور Postgres (کاربر sudo یا روت):

1. اجازه دهید از IP های خارجی به سرور postgres ضربه بزنیم. برای این کار فایل را ویرایش کنید 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 یا روت):

ما در سرور 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

همین. در خاتمه یادآوری می کنم که به هیچ وجه سعی نمی کنم وانمود کنم که ارشد dba هستم و در کوچکترین فرصتی از ابرها استفاده خواهم کرد. در حال حاضر من خودم شروع به مطالعه موضوعات مختلف از جمله پشتیبان گیری، تکرار، مانیتورینگ و ... می کنم. و من گزارش های کوچکی در مورد نتایج می نویسم تا سهم کوچکی در جامعه داشته باشم و برگه های تقلب کوچک را برای خودم بگذارم.

در مقالات بعدی سعی خواهم کرد در مورد ویژگی های اضافی صحبت کنم - بازیابی اطلاعات در یک خوشه تمیز، رمزگذاری پشتیبان گیری و انتشار در S3، پشتیبان گیری از طریق rsync.

منبع: www.habr.com

اضافه کردن نظر