Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ бэкапы postgresql с pgbackrest β€” курс ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ Π±ΠΎΠΉΡ†Π° ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

ДисклСймСр

Π― β€” Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Π― ΠΏΠΈΡˆΡƒ ΠΊΠΎΠ΄, с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽ лишь ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π― Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΡŽ Π½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎΡΡ‚ΡŒ систСмного администратора ΠΈ, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, dba. Но…

Π’Π°ΠΊ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ postgresql Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Никаких ΠΎΠ±Π»Π°ΠΊΠΎΠ² β€” Π΄Π΅Ρ€ΠΆΠΈ SSH ΠΈ сдСлай, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΈ Π½Π΅ просило Π΄Π΅Π½Π΅Π³. Π§Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Π² Ρ‚Π°ΠΊΠΈΡ… случаях? ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΠΈΡ…Π°Π΅ΠΌ pgdump Π² cron, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь бэкапим всС Π² Π°Ρ€Ρ…ΠΈΠ² ΠΈ Ссли совсСм Ρ€Π°Π·ΠΎΡˆΠ»ΠΈΡΡŒ β€” отправляСм этот Π°Ρ€Ρ…ΠΈΠ² ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ подальшС.

Π’ этот Ρ€Π°Π· ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ состояла Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΏΠ»Π°Π½Π°ΠΌ Π±Π°Π·Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° расти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° +- 100 ΠœΠ‘ Π² дСнь. РазумССтся, ΡƒΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ нСдСль ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ всС pgdump’ΠΎΠΌ ΠΎΡ‚ΠΏΠ°Π΄Π΅Ρ‚. Π’ΡƒΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ приходят ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ бэкапы.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ? Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ бэкап β€” Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ всС Ρ„Π°ΠΉΠ»Ρ‹ источника, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° создания ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΏΠΈΠΈ.

Как ΠΈ любой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Π‘ΠžΠ’Π•Π Π¨Π•ΠΠΠž Π½Π΅ ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ (Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚) Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² тонкостях postgres я Ρ…ΠΎΡ‚Π΅Π» Π½Π°ΠΉΡ‚ΠΈ Π·Π΅Π»Π΅Π½ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ. Ну, Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Π² AWS, DigitalOcean: Π½Π°ΠΆΠ°Π» ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΎΠΏΠΊΡƒ β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΆΠ°Π» Π²Ρ‚ΠΎΡ€ΡƒΡŽ β€” настроил бэкапы, Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ β€” всС ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΠ» Π½Π° ΠΏΠ°Ρ€Ρƒ часов Π½Π°Π·Π°Π΄. Кнопки ΠΈ красивого GUIшного инструмСнта я Π½Π΅ нашСл. Если Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ (бСсплатный ΠΈΠ»ΠΈ Π΄Π΅ΡˆΠ΅Π²Ρ‹ΠΉ) β€” Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΠ± этом Π² коммСнтариях.

ΠŸΠΎΠ³ΡƒΠ³Π»ΠΈΠ² я нашСл Π΄Π²Π° инструмСнта pgbarman ΠΈ 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 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ 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):

ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки 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@<postgres_server_ip> 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@<repository_server_ip> 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_server_ip>

Postgres сСрвСр (root ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, для чистоты экспСримСнта):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

УбСТдаСмся, Ρ‡Ρ‚ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ.

Настройка 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 = 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 # ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сколько Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапов. Π’.Π΅. Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапа ΠΈ Π²Ρ‹ создаСтС Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ - ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ вмСстС с ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. 
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

УбСТдаСмся, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ Π²ΠΈΠ΄ΠΈΠΌ строку Β«check command end: completed successfullyΒ».

Устали? ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ самому интСрСсному.

Π”Π΅Π»Π°Π΅ΠΌ бэкап

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (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 --delta restore

3. ЗапускаСм кластСр:

sudo pg_ctlcluster 11 main start

ПослС восстановлСния бэкапа Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ бэкап:

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (pgbackrest ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ):

sudo pgbackrest --stanza=main backup

На этом всС. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ…ΠΎΡ‡Ρƒ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠ· сСбя senior dba ΠΈ ΠΏΡ€ΠΈ малСйшСй возмоТности Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΠΊΠ°. Π’ настоящСС врСмя сам Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹ Π²Ρ€ΠΎΠ΄Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования, Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΉ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ Ρ‚.ΠΏ. ΠΈ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΏΠΈΡˆΡƒ нСбольшиС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹, Π΄Π°Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСбольшой Π²ΠΊΠ»Π°Π΄ Π² сообщСство ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ для сСбя нСбольшиС ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠΈ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΈΡ‡Π°Ρ… β€” восстановлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° чистый кластСр, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ бэкапов ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½Π° S3, бэкапы Ρ‡Π΅Ρ€Π΅Π· rsync.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com