Danasîna pergala hilanînê ya wal-g PostgreSQL

WAL-G amûrek hêsan û bandorker e ku ji bo piştguhkirina PostgreSQL li ser ewran. Di warê fonksiyona wê ya sereke de, ew mîrasgirê amûra populer e WAL-E, lê di Go de ji nû ve hatî nivîsandin. Lê di WAL-G de taybetmendiyek nû ya girîng heye - kopiyên delta. kopiyên delta WAL-G rûpelên pelên ku ji guhertoya hilanînê ya berê ve hatine guhertin hilînin. WAL-G gelek teknolojiyên ji bo paralelkirina paşkêşan pêk tîne. WAL-G ji WAL-E pir zûtir e.

Hûrguliyên ka wal-g çawa dixebite di gotarê de têne dîtin: Em hilanînê zêde dikin. Dersa Yandex

Protokola hilanîna S3 ji bo hilanîna daneyan populer bûye. Yek ji avantajên S3 şiyana gihîştina bi API-yê ye, ku dihêle hûn bi hilanînê re têkiliyek maqûl organîze bikin, tevî gihandina xwendina giştî, dema ku nûvekirina agahdariya di hilanînê de tenê ji hêla kesên destûrdar ve pêk tê.

Gelek pêkanînên hilanîna gelemperî û taybet hene ku protokola S3 bikar tînin. Îro em ê li çareseriyek populer ji bo organîzekirina depoya piçûk binêrin - Minio.

Serverek yek PostgreSQL ji bo ceribandina wal-g baş e, û Minio wekî şûna S3 tê bikar anîn.

Pêşkêşkara Minio

Sazkirina Minio

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

AccessKey û SecretKey di /etc/minio/minio.conf de biguherînin

vi /etc/minio/minio.conf

Heke hûn ê berî Minio nginx bikar neynin, wê hingê hûn hewce ne ku biguhezînin

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio dest pê dike

systemctl start minio

Biçe navrûya tevna Minio http://ip-адрес-сервера-minio:9000 û kelekek çêbikin (mînak, pg-backups).

server DB

WAL-G di rpm de ji hêla min ve hatî berhev kirin (Anton Patsev). Github, Fedora COPR.

Kî ne xwediyê pergalek RPM-based e, fermî bikar bîne talîmatên bi sazkirinê.

Li gel binarya wal-g, rpm nivîsarên ku guhêrbaran ji pelê /etc/wal-gd/server-s3.conf derdixin hene.

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

walg saz bikin.

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

Guhertoya wal-g kontrol dikin.

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

Li gorî hewcedariyên xwe /etc/wal-gd/server-s3.conf biguherînin.

Pelên veavakirinê û pelên daneyê yên ku ji hêla komek databasê ve têne bikar anîn bi kevneşopî di pelrêça daneya komê de, ku bi gelemperî wekî tê gotin, têne hilanîn. 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 # Какой метод сжатия использовать.

Dema mîhengkirina WAL-G-ê, hûn WALG_DELTA_MAX_STEPS destnîşan dikin - hejmara gavan ku paşgira deltayê ji paşgira bingehîn herî zêde ye, û polîtîkaya kopiya deltayê diyar dike. An hûn ji deltaya heyî ya paşîn kopiyek çêdikin, an jî hûn ji paşgira tevahî ya orîjînal deltayekê çêdikin. Ev pêdivî ye ku gava ku heman pêkhateya databasê her gav di databasa we de diguhere, heman dane bi domdarî diguhere.

Sazkirina databasê.

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

Em databasê dest pê dikin.

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

Heke hûn li ser serverek 1 ceribandinê dikin, wê hingê hûn hewce ne ku parametreya wal_level ji nû ve mîheng bikin da ku ji bo PostgreSQL ji guhertoya 10-an kêmtir, û ji bo PostgreSQL guhertoya 10 û kevntir replica arşîv bikin.

wal_level = archive

Werin em her 60 saniyeyan carekê bi karanîna PostgreSQL bixwe arşîvên WAL-ê hilînin. Li ser prod, hûn ê nirxek archive_timeout cûda hebe.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.

PostgreSQL dest pê dike

systemctl start postgresql-9.6

Di konsolek cihêreng de, em ji bo xeletiyan li têketinên PostgreSQL dinêrin: (postgresql-Wed.log bi ya heyî biguhezînin).

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

Ka em biçin psql.

su - postgres
psql

Di psql de databasek çêbikin

Di testa databasê1 de tabloyek çêbikin.

create database test1;

Veguhere testa databasê.

postgres=# c test1;

Em tabloya indexing_table diafirînin.

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

Daneyên zêde kirin.

Em dest bi danîna daneyan dikin. Em 10-20 deqeyan li bendê ne.

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

Pê bawer bin ku kopiyek tam çêbikin.

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

Em li tomarên di tabloyê de di testa databasê1 de dinêrin

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+

String dema niha ye.

Navnîşa paşkêşên tevahî bibînin

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

testkirina Recovery

Vejandina bêkêmasî bi gerandina hemî WAL-a berdest.

Postgresql rawestînin.

Her tiştî ji peldanka /var/lib/pgsql/9.6/data jêbirin.

Skrîpta /usr/local/bin/backup-fetch.sh wekî bikarhênerê postgres bimeşîne.

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

Vekêşana hilanînê qediya.

Recovery.conf bi naveroka jêrîn li peldanka /var/lib/pgsql/9.6/data zêde bikin.

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

Em PostgreSQL dest pê dikin. PostgreSQL dê ji WAL-ên arşîvkirî pêvajoya vegerandinê dest pê bike, û tenê hingê dê databas vebe.

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

Vejandin ji bo demek diyar.

Ger em dixwazin databasê heya deqeyek diyarkirî vegerînin, wê hingê em parametreya recovery_target_time li recovery.conf zêde dikin - em destnîşan dikin ku di kîjan demê de databasê were vegerandin.

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

Piştî başbûnê, li tabloya indexing_table binêre

 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

Em PostgreSQL dest pê dikin. PostgreSQL dê ji WAL-ên arşîvkirî pêvajoya vegerandinê dest pê bike, û tenê hingê dê databas vebe.

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

Îmtîhanê

Hilberîna databasek 1 GB ya ku li vir hatî destnîşan kirin https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Piştî çêkirina 1 GB daneyê daxwaza mezinahiya kelê.

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

s4cmd amûrek rêzika fermanê ya belaş e ku ji bo xebata bi daneyên ku di hilanîna Amazon S3 de rûdine. Vebijêrk bi zimanê bernamesaziya python hatiye nivîsandin, û ji ber vê yekê ew dikare hem di pergalên xebitandinê yên Windows û Linux de were bikar anîn.

Sazkirina 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

Berawirdkirina encamên li ser nexşeyê.

Danasîna pergala hilanînê ya wal-g PostgreSQL

Wekî ku hûn dikarin bibînin, Brotli bi mezinahiyê bi LZMA-yê re hevber e, lê paşvekişandin di dema LZ4 de pêk tê.

Sohbeta civata PostgreSQL ya rûsî-axêv: https://t.me/pgsql

Ger hûn bikar bînin ji kerema xwe stêrkek bidin Github wal-g

Source: www.habr.com

Add a comment