αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ wal-g PostgreSQL

WAL-G αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ PostgreSQL αž‘αŸ…αž€αžΆαž“αŸ‹αž–αž–αž€αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž˜αž»αžαž„αžΆαžšαž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αžœαžΆαžœαžΆαž‚αžΊαž‡αžΆαž’αŸ’αž“αž€αžŸαŸ’αž“αž„αž˜αžšαžαž€αž§αž”αž€αžšαžŽαŸαžŠαŸαž–αŸαž‰αž“αž·αž™αž˜ WAL-Eαž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„ Go αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈαžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ WAL-G - αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„ delta αŸ” αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„ delta WAL-G αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αŸ†αž–αŸαžšαž“αŸƒαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αŸ†αžŽαŸ‚αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αž»αž“αŸ” WAL-G αž’αž“αž»αžœαžαŸ’αžαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαŸ” WAL-G αž›αžΏαž“αž‡αžΆαž„ WAL-EαŸ”

αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž› Wal-g αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αŸ– αž™αžΎαž„αžαŸ’αžšαž½αžαž›αžΎαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αŸ” αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Yandex

αž–αž·αž’αžΈαž€αžΆαžšαž€αžΆαžšαž•αŸ’αž‘αž»αž€ 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 αž€αŸ’αž“αž»αž„ rpm αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‚αž»αŸ†αžŠαŸ„αž™αžαŸ’αž‰αž»αŸ† (Anton Patsev) αŸ” Github, Fedora COPR.

αžαžΎαž’αŸ’αž“αž€αžŽαžΆαžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αž’αŸ‚αž€αž›αžΎ RPM αžŸαžΌαž˜αž”αŸ’αžšαžΎαž•αŸ’αž›αžΌαžœαž€αžΆαžš αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† αžŠαŸ„αž™αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αŸ”

αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„ wal-g binary, 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 - αž…αŸ†αž“αž½αž“αž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžŠαžΈαžŸαžŽαŸ’αžαž‚αžΊαž’αžαž·αž”αžšαž˜αžΆαž–αžΈαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž…αž˜αŸ’αž›αž„αžŠαžΈαžŸαžŽαŸ’αžαŸ” αž‘αžΆαŸ†αž„αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž–αžΈαžŠαžΈαžŸαžŽαŸ’αžαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž¬αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž delta αž–αžΈαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰αžŠαžΎαž˜αŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ‚αž„αžαŸ‚αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž€αŸ†αž–αž»αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‡αžΆαž“αž·αž…αŸ’αž…αŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

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

αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ ៑.

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

αž™αžΎαž„αž˜αžΎαž›αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αž€αŸ’αž“αž»αž„ database 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 αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž–αžΈ WALs αžŠαŸ‚αž›αž”αžΆαž“αž‘αž»αž€αž€αŸ’αž“αž»αž„αž”αŸαžŽαŸ’αžŽαžŸαžΆαžš αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž–αŸαž›αž“αŸ„αŸ‡αž‘αŸαžŠαŸ‚αž›αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΉαž„αž”αžΎαž€αŸ”

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 αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž–αžΈ WALs αžŠαŸ‚αž›αž”αžΆαž“αž‘αž»αž€αž€αŸ’αž“αž»αž„αž”αŸαžŽαŸ’αžŽαžŸαžΆαžš αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž–αŸαž›αž“αŸ„αŸ‡αž‘αŸαžŠαŸ‚αž›αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΉαž„αž”αžΎαž€αŸ”

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

αžŸαžΆαž€αž›αŸ’αž”αž„

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ 1GB αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡ https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αŸ†αž αŸ†αž’αž»αž„αž‘αžΉαž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž„αŸ’αž€αžΎαžαž‘αž·αž“αŸ’αž“αž“αŸαž™ 1GB αŸ”

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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹