Pgbackrest бүхий нэмэлт postgresql нөөцлөлт - хөгжүүлэгчийн залуу тулаанчдад зориулсан сургалт

Хариуцлага

Би хөгжүүлэгч хүн. Би код бичиж, мэдээллийн сантай зөвхөн хэрэглэгчийн хувиар харилцдаг. Ямар ч тохиолдолд би өөрийгөө системийн администратор гэж дүр эсгэдэггүй, бүр dba ч биш. Гэхдээ…

Тиймээс би postgresql мэдээллийн сангийн нөөцлөлтийг зохион байгуулах шаардлагатай болсон. Үүл байхгүй - зүгээр л SSH ашиглаж, мөнгө нэхэхгүйгээр бүх зүйл ажиллаж байгаа эсэхийг шалгаарай. Ийм тохиолдолд бид юу хийх вэ? Энэ нь зөв, бид pgdump-г cron руу түлхэж, бүх зүйлийг архивт нөөцөлж, хэрэв бид бүрэн алдагдсан бол бид энэ архивыг хаа нэгтээ илгээдэг.

Энэ удаад хэцүү зүйл бол төлөвлөгөөний дагуу мэдээллийн сан өдөрт +-100 МБ-аар өсөх ёстой байв. Мэдээжийн хэрэг, хэдэн долоо хоногийн дараа бүх зүйлийг pgdump ашиглан нөөцлөх хүсэл алга болно. Энд нэмэлт нөөцлөлтүүд аврах ажилд ирдэг.

Сонирхолтой юу? Муурт тавтай морил.

Өсөн нэмэгдэж буй нөөцлөлт нь бүх эх файлыг хуулж авдаггүй, зөвхөн шинэ файлууд болон өмнөх хуулбарыг үүсгэснээс хойш өөрчилсөн файлуудыг хуулбарлах нэг төрөл юм.

Postgres-ийн нарийн ширийнийг ойлгох хүсэлгүй байсан (тухайн үед) ямар ч хөгжүүлэгчийн нэгэн адил би ногоон товчлуурыг олохыг хүссэн. AWS, DigitalOcean шиг: та нэг товчлуурыг дарсан - хуулбарыг авсан, хоёр дахь товчлуурыг дарсан - нөөцлөлтийг тохируулсан, гурав дахь нь - та бүх зүйлийг хэдхэн цагийн дотор буцааж хийсэн. Би товчлуур эсвэл гоёмсог GUI хэрэгсэл олсонгүй. Хэрэв та нэгийг нь (үнэгүй эсвэл хямд) мэддэг бол энэ тухай коммент хэсэгт бичээрэй.

Google-ээр хайсны дараа би хоёр хэрэгсэл олсон 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 хэрэглэгч эсвэл root):

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 хэрэглэгч эсвэл root):

Түлхүүр хос үүсгэх:

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 хэрэглэгч эсвэл root):

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 хэрэглэгч эсвэл root):

Бид 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 хэрэглэгч эсвэл root):

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

Өгөгдлийн сангийн сүүлийн БҮРЭН нөөцлөлтийн төлөв рүү сэргээхийн тулд сэргээх_зорилтыг заалгүйгээр тушаалыг ашиглана уу:

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

сэтгэгдэл нэмэх