Дисклеймер
Аз съм разработчик. Пиша код, а взаимодействието ми с базата данни е само като потребител. Никога не претендирам да бъда системен администратор, а още по-малко – dba. Но…
Така се случи, че трябваше да организирам резервното копие на базата данни PostgreSQL. Никакви облаци – просто SSH и да направим всичко да работи без да иска пари. Какво правим в такива случаи? Верно, поставяме pgdump в cron, всеки ден архивираме всичко и ако нещата се влошат – изпратим архива на далечно място.
Този път трудността беше, че според плановете базата трябваше да нараства с около 100 MB на ден. Разбира се, след няколко седмици желанието да архивираме всичко с pgdump ще изчезне. Тук на помощ идват инкременталните бекъпи.
Интересно? Добре дошли под кат.
Инкрементален бекъп е вид резервно копие, при което се копират не всички файлове от източника, а само новите и променените от момента на създаването на предходното копие.
Както всеки разработчик, АБСОЛЮТНО не желаещ (в онзи момент) да се запознае с тънкостите на Postgres, исках да намеря зелен бутон. Знаете, като в AWS, DigitalOcean: натискаш един бутон – получаваш репликация, натискаш втори – настройваш бекъпи, трети – връщаш всичко назад с няколко часа. Не намерих бутон и красив инструмент с GUI. Ако знаете такъв (безплатен или евтин) – напишете в коментарите.
След малко търсене открих два инструмента pgbarman и pgbackrest. С първия не се получи (много оскъдна документация, опитвах да направя всичко по стари ръководства), а при втория документацията беше на ниво, но не и без недостатъци. За да улесня работата на тези, които ще се сблъскат с подобна задача, написах настоящата статия.
След прочитането на тази статия ще научите как да правите инкрементални бекъпи, да ги запазвате на отдалечен сървер (репозитория с бекъпи) и да ги възстановявате в случай на загуба на данни или други проблеми на основния сървер.
Подготовка
За да възпроизведете ръководството, ще ви трябват два VPS. Първият ще бъде хранилище (репозитория, на който ще стоят бекъпите), а вторият, също собствено, самият сървер с PostgreSQL (в моя случай версия 11 на PostgreSQL).
Предполага се, че на сървера с PostgreSQL имате root, sudo потребител, потребител postgres и самият PostgreSQL е инсталиран (потребителят 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 /build2. Инсталираме необходимите зависимости за компилация:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev3. Компилираме pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Копираме изпълнимия файл в директорията /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest изисква наличието на perl. Инсталираме:
sudo apt-get install perl6. Създаваме директории за логовете, задаваме им определени права:
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.conf7. Проверяваме:
pgbackrest versionPostgres сървър (sudo потребител или root):
Процесът на инсталиране на pgbackrest на сървър с postgres е аналогичен на процеса на инсталация в репозитория (да, 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Настройка на взаимодействието между сървърите чрез passwordless 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@ cat /var/lib/postgresql/.ssh/id_rsa.pub) |
sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keysНа тази стъпка ще поиска паролата на root потребителя. Трябва да се въведе именно паролата на 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@ cat /home/pgbackrest/.ssh/id_rsa.pub) |
sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys
На тази стъпка ще поиска паролата на root потребителя. Трябва да се въведе именно паролата на root потребителя на репозитория!
Проверяваме:
Репозитория (root потребител, за чистота на експеримента):
sudo -u pgbackrest ssh postgres@Postgres сървър (root потребител, за чистота на експеримента):
sudo -u postgres ssh pgbackrest@Убедете се, че получавате достъп без проблеми.
Настройка на postgres сървъра
Postgres сървър (sudo потребител или root):
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 = replica3. Ще направим необходимите настройки в конфигурационния файл pgbackrest (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=4. Рестартиране на postgresql:
sudo service postgresql restartНастройка на сървър-репозитория
Репозиторий (pgbackrest потребител):
Ще направим необходимите настройки в конфигурационния файл pgbackrest
(/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-host=
pg1-path=/var/lib/postgresql/11/main
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметър, указващ колко да се съхраняват пълни бекъпи. Т.е. ако имате два пълни бекъпа и създадете трети - първите два ще бъдат изтрити заедно с инкрементите.
start-fast=y # Започва резервното копиране незабавно, за повече информация за този параметър можете да прочетете тук https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingСъздаване на хранилище
Репозиторий (pgbackrest потребител):
Създаваме ново хранилище за клъстера main:
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 stop2. Възстановяваме се от бекъпа:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Стартираме клъстера:
sudo pg_ctlcluster 11 main startСлед възстановяване на бекъпа, е необходимо да направим нов бекъп:
Репозиторий (pgbackrest потребител):
sudo pgbackrest --stanza=main backupНа това всичко. В заключение, искам да напомня, че никога не се опитвам да се представя за senior dba и при най-малката възможност ще използвам облачни услуги. В момента започвам да изучавам различни теми като резервно копиране, репликации, мониторинг и т.н. и за резултатите пиша кратки отчети, за да направя малък принос в общността и да оставя за себе си някакви бележки.
В следващите статии ще се опитам да разкажа за допълнителни функции — възстановяване на данни на чист кластер, криптиране на резервни копия и публикуване в S3, резервни копия чрез rsync.
Източник: habr.com
