Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² систСмата Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° wal-g PostgreSQL

WAL-G Π΅ прост ΠΈ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ инструмСнт Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° PostgreSQL Π² ΠΎΠ±Π»Π°Ρ†ΠΈΡ‚Π΅. По ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° основната си функционалност Ρ‚ΠΎΠΉ Π΅ наслСдник Π½Π° популярния инструмСнт WAL-E, Π½ΠΎ прСнаписан Π½Π° Go. Но ΠΈΠΌΠ° Π΅Π΄Π½Π° Π²Π°ΠΆΠ½Π° Π½ΠΎΠ²Π° функция Π² WAL-G - Π΄Π΅Π»Ρ‚Π° копия. Π΄Π΅Π»Ρ‚Π° копия WAL-G ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° страници с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° вСрсия Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°. WAL-G ΠΏΡ€ΠΈΠ»Π°Π³Π° доста Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΈ копия. WAL-G Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±ΡŠΡ€Π· ΠΎΡ‚ WAL-E.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ wal-g ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² статията: ΠžΠ²ΡŠΡ€ΠΊΠ»ΠΎΠΊΠ²Π°ΠΌΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π°. ЯндСкс лСкция

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŠΡ‚ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ S3 стана популярСн Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ. Π•Π΄Π½ΠΎ ΠΎΡ‚ прСдимствата Π½Π° S3 Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Ρ‡Ρ€Π΅Π· API, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ гъвкаво взаимодСйствиС със ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° информацията Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° само ΠΎΡ‚ ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π»ΠΈΡ†Π°.

Има няколко ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΈ ΠΈ частни прилоТСния Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° S3. ДнСс Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ популярно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° малък склад - Minio.

Π•Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ PostgreSQL ΡΡŠΡ€Π²ΡŠΡ€ Π΅ подходящ Π·Π° тСстванС Π½Π° wal-g, Π° Minio сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ замСститСл Π½Π° S3.

Минио ΡΡŠΡ€Π²ΡŠΡ€

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° Minio

yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ AccessKey ΠΈ SecretKey Π² /etc/minio/minio.conf

vi /etc/minio/minio.conf

Ако няма Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ nginx ΠΏΡ€Π΅Π΄ΠΈ Minio, Ρ‚ΠΎΠ³Π°Π²Π° трябва Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ Minio

systemctl start minio

ΠžΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° ΡƒΠ΅Π± интСрфСйса Π½Π° Minio http://ip-адрСс-сСрвСра-minio:9000 ΠΈ ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΡ„Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ pg-backups).

DB ΡΡŠΡ€Π²ΡŠΡ€

Бглобявам WAL-G Π² ΠΎΠ±ΠΎΡ€ΠΎΡ‚ΠΈ (Антон ΠŸΠ°Ρ†Π΅Π²). Github, Fedora COPR.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ нямат RPM-Π±Π°Π·ΠΈΡ€Π°Π½Π° систСма, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π°Ρ‚Π° инструкции Ρ‡Ρ€Π΅Π· ΠΌΠΎΠ½Ρ‚Π°ΠΆ.

Π—Π°Π΅Π΄Π½ΠΎ с двоичния Ρ„Π°ΠΉΠ» wal-g, rpm ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° скриптовС, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° /etc/wal-gd/server-s3.conf.

backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ wal-g.

yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° вСрсията Π½Π° wal-g.

wal-g --version
wal-g version v0.2.14

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ /etc/wal-gd/server-s3.conf, Π·Π° Π΄Π° отговаря Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ΄ΠΈ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ с Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ‚ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ Π² дирСкторията с Π΄Π°Π½Π½ΠΈ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°Ρ€ΠΈΡ‡Π°Π½Π° PGDATA

#!/bin/bash

export PG_VER="9.6"

export WALE_S3_PREFIX="s3://pg-backups" # Π±Π°ΠΊΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создали Π² S3
export AWS_ACCESS_KEY_ID="xxxx" # AccessKey ΠΈΠ· /etc/minio/minio.conf 
export AWS_ENDPOINT="http://ip-адрСс-сСрвСра-minio:9000"
export AWS_S3_FORCE_PATH_STYLE="true"
export AWS_SECRET_ACCESS_KEY="yyyy" # SecretKey ΠΈΠ· /etc/minio/minio.conf

export PGDATA=/var/lib/pgsql/$PG_VER/data/
export PGHOST=/var/run/postgresql/.s.PGSQL.5432 # Π‘ΠΎΠΊΠ΅Ρ‚ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ PostgreSQL

export WALG_UPLOAD_CONCURRENCY=2 # Кол-Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для Π·Π°ΠΊΠ°Ρ‡ΠΊΠΈ 
export WALG_DOWNLOAD_CONCURRENCY=2 # Кол-Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для скачивания
export WALG_UPLOAD_DISK_CONCURRENCY=2 # Кол-Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° дискС для Π·Π°ΠΊΠ°Ρ‡ΠΊΠΈ
export WALG_DELTA_MAX_STEPS=7
export WALG_COMPRESSION_METHOD=brotli # Какой ΠΌΠ΅Ρ‚ΠΎΠ΄ сТатия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ WAL-G, Π²ΠΈΠ΅ посочватС WALG_DELTA_MAX_STEPS - броят ΡΡ‚ΡŠΠΏΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π΅Π»Ρ‚Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΅ максимално спрямо Π±Π°Π·ΠΎΠ²ΠΎΡ‚ΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅, ΠΈ посочватС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π° Π·Π° Π΄Π΅Π»Ρ‚Π° ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅. Или ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΊΠΎΠΏΠΈΠ΅ ΠΎΡ‚ послСдната ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π° Π΄Π΅Π»Ρ‚Π°, ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π΄Π΅Π»Ρ‚Π° ΠΎΡ‚ оригиналния пълСн Π°Ρ€Ρ…ΠΈΠ². Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² случай, Ρ‡Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ сС промСня във Π²Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π΅Π΄Π½ΠΈ ΠΈ ΡΡŠΡ‰ΠΈ Π΄Π°Π½Π½ΠΈ сС промСнят постоянно.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.
noarch.rpm
yum install -y postgresql96 postgresql96-server mc

НСка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK

Ако тСстватС Π½Π° 1 ΡΡŠΡ€Π²ΡŠΡ€, Ρ‚ΠΎΠ³Π°Π²Π° трябва Π΄Π° ΠΏΡ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° wal_level, Π·Π° Π΄Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ Π·Π° PostgreSQL ΠΏΠΎΠ΄ вСрсия 10 ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π·Π° PostgreSQL вСрсия 10 ΠΈ ΠΏΠΎ-стара.

wal_level = archive

НСка Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ WAL Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° всСки 60 сСкунди, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ самия PostgreSQL. Π’ производството Ρ‰Π΅ ΠΈΠΌΠ°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° стойност Π·Π° archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # ΠšΠ°ΠΆΠ΄Ρ‹Π΅ 60 сСкунд Π±ΡƒΠ΄Π΅Ρ‚ выполнятся ΠΊΠΎΠΌΠ°Π½Π΄Π° archive_command.

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° PostgreSQL

systemctl start postgresql-9.6

Π’ ΠΎΡ‚Π΄Π΅Π»Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΏΡ€Π΅Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° PostgreSQL Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ: (ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Ρ‚Π΅ postgresql-Wed.log Π½Π° тСкущия).

tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Π”Π° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π½Π° psql.

su - postgres
psql

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π² psql

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ test1.

create database test1;

ΠŸΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към тСста Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

postgres=# c test1;

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π° indexing_table.

test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());

ДобавянС Π½Π° Π΄Π°Π½Π½ΠΈ.

Π”Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ с Π²ΠΌΡŠΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ. Π˜Π·Ρ‡Π°ΠΊΠ²Π°ΠΌΠ΅ 10-20 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ.

#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done

НС забравяйтС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ пълСн Π°Ρ€Ρ…ΠΈΠ².

su - postgres
/usr/local/bin/backup-push.sh

Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ записитС Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ test1

select * from indexing_table;
2020-01-29 09:41:25.226198+
2020-01-29 09:42:25.336989+
2020-01-29 09:43:25.356069+
2020-01-29 09:44:25.37381+
2020-01-29 09:45:25.392944+
2020-01-29 09:46:25.412327+
2020-01-29 09:47:25.432564+
2020-01-29 09:48:25.451985+
2020-01-29 09:49:25.472653+
2020-01-29 09:50:25.491974+
2020-01-29 09:51:25.510178+

ΠΠΈΠ·ΡŠΡ‚ Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅.

Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ списъка с пълни Π°Ρ€Ρ…ΠΈΠ²ΠΈ

/usr/local/bin/backup-list.sh

ВСстванС Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅

Пълно Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ с ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ WAL.

Π‘ΠΏΠΈΡ€Π°Π½Π΅ Π½Π° Postgresql.

Π˜Π·Ρ‚Ρ€ΠΈΠΉΡ‚Π΅ всичко ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° /var/lib/pgsql/9.6/data.

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ скрипта /usr/local/bin/backup-fetch.sh ΠΎΡ‚ потрСбитСля Π½Π° postgres.

su - postgres
/usr/local/bin/backup-fetch.sh

Π˜Π·Π²Π»ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ΠΎ.

Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ recovery.conf към ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° /var/lib/pgsql/9.6/data със слСдното ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ PostgreSQL. PostgreSQL Ρ‰Π΅ стартира процСса Π½Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ‚ архивирания WAL ΠΈ Π΅Π΄Π²Π° Ρ‚ΠΎΠ³Π°Π²Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Ρ‰Π΅ сС ΠΎΡ‚Π²ΠΎΡ€ΠΈ.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅.

Ако искамС Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΌΠΈΠ½ΡƒΡ‚Π°, Ρ‚ΠΎΠ³Π°Π²Π° добавямС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° recovery_target_time към recovery.conf - посочвамС Π² ΠΊΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'

Π‘Π»Π΅Π΄ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° indexing_table

 2020-01-29 09:41:25.226198+00
 2020-01-29 09:42:25.336989+00
 2020-01-29 09:43:25.356069+00
 2020-01-29 09:44:25.37381+00
 2020-01-29 09:45:25.392944+00

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ PostgreSQL. PostgreSQL Ρ‰Π΅ стартира процСса Π½Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ‚ архивирания WAL ΠΈ Π΅Π΄Π²Π° Ρ‚ΠΎΠ³Π°Π²Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Ρ‰Π΅ сС ΠΎΡ‚Π²ΠΎΡ€ΠΈ.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

ВСстванС

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ 1 GB, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ описано Ρ‚ΡƒΠΊ https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

НиС изисквамС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΊΠΎΡ„Π°Ρ‚Π° слСд Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° 1 GB Π΄Π°Π½Π½ΠΈ.

postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MB

s4cmd Π΅ Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π΅Π½ инструмСнт Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΌΠΈΡ€Π°Ρ‰ΠΈ сС Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Amazon S3. ΠŸΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π΅ написана Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Python ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми Windows, Ρ‚Π°ΠΊΠ° ΠΈ Π² Linux.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-адрСс-сСрвСра-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 ΠœΠ‘ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ lz4 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ WAL Π»ΠΎΠ³ΠΎΠ²

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π±Π΅ΠΊΠ°ΠΏ с lz4 - 1GB Π΄Π°Π½Π½Ρ‹Ρ…
time backup_push.sh
real 0m18.582s

Π Π°Π·ΠΌΠ΅Ρ€ S3 Π±Π°ΠΊΠ΅Ρ‚Π° послС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π±Π΅ΠΊΠ°ΠΏΠ°

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 ΠœΠ‘ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π΅ΠΊΠ°ΠΏ

LZMA

ПослС Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ 1Π“Π‘ Π΄Π°Π½Π½Ρ‹Ρ…
338413694       s3://pg-backups/wal_005/
338 ΠΌΠ± Π»ΠΎΠ³ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ lzma

ВрСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π±Π΅ΠΊΠ°ΠΏΠ°
time backup_push.sh
real    5m25.054s

Π Π°Π·ΠΌΠ΅Ρ€ Π±Π°ΠΊΠ΅Ρ‚Π° Π² S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 ΠΌΠ± Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π΅ΠΊΠ°ΠΏ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ lzma

Brotli

ПослС Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ 1Π“Π‘ Π΄Π°Π½Π½Ρ‹Ρ…
459229886       s3://pg-backups/wal_005/
459 ΠΌΠ± Π»ΠΎΠ³ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ brotli

ВрСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π±Π΅ΠΊΠ°ΠΏΠ°
real    0m23.408s

Π Π°Π·ΠΌΠ΅Ρ€ Π±Π°ΠΊΠ΅Ρ‚Π° Π² S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 ΠΌΠ± Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π΅ΠΊΠ°ΠΏ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ brotli

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π°.

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² систСмата Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° wal-g PostgreSQL

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Brotli Π΅ сравним ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ с LZMA, Π½ΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π² LZ4 Π²Ρ€Π΅ΠΌΠ΅.

Π§Π°Ρ‚ Π½Π° рускоговорящата PostgreSQL общност: https://t.me/pgsql

Моля, Π΄Π°ΠΉΡ‚Π΅ Π·Π²Π΅Π·Π΄Π° Π½Π° Github, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ wal-g

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€