wal-g PostgreSQL камдык тутумуна киришүү

ВАЛ-Г булуттар үчүн PostgreSQL камдык сактоо үчүн жөнөкөй жана натыйжалуу куралы болуп саналат. Негизги функционалдуулугу боюнча, ал популярдуу куралдын мураскору болуп саналат WAL-E, бирок Go менен кайра жазылган. Бирок WAL-Gде бир маанилүү жаңы өзгөчөлүк бар - дельта көчүрмөлөрү. дельта көчүрмөлөрү ВАЛ-Г мурунку камдык версиясынан бери өзгөргөн файлдардын барактарын сактаңыз. WAL-G камдык көчүрмөлөрдү параллелизациялоо үчүн көптөгөн технологияларды ишке ашырат. WAL-G WAL-Eге караганда бир топ ылдам.

wal-g кантип иштээри жөнүндө маалымат макалада тапса болот: Биз камдык көчүрмөнү overclock. Яндекс лекциясы

S3 сактоо протоколу маалыматтарды сактоо үчүн популярдуу болуп калды. S3 артыкчылыктарынын бири - бул API аркылуу кирүү мүмкүнчүлүгү, ал сактоочу менен ийкемдүү өз ара аракеттенүүнү, анын ичинде жалпыга ачык окуу мүмкүнчүлүгүн уюштурууга мүмкүндүк берет, ал эми сактагычтагы маалыматты жаңыртуу ыйгарым укуктуу адамдар тарабынан гана ишке ашат.

S3 протоколун колдонгон бир нече коомдук жана жеке сактоо программалары бар. Бүгүн биз кичинекей сактоону уюштуруу үчүн популярдуу чечимди карап чыгабыз - Minio.

Жалгыз PostgreSQL сервери wal-g тестирлөө үчүн жакшы, ал эми Minio S3 үчүн алмаштыруу катары колдонулат.

Minio сервер

Minio орнотуу

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

/etc/minio/minio.conf ичинде AccessKey жана SecretKeyди түзөтүңүз

vi /etc/minio/minio.conf

Эгер сиз Minio чейин nginx колдонбосоңуз, анда сиз өзгөртүүгө туура келет

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio ишке киргизилүүдө

systemctl start minio

Minio веб интерфейсине өтүңүз http://ip-адрес-сервера-minio:9000 жана чака түзүңүз (мисалы, pg-камдык көчүрмөлөр).

DB сервери

WAL-G мин rpm менен чогултулган (Антон Пацев). 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

Walg орнотуу.

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 серверде сынап жаткан болсоңуз, анда PostgreSQL 10 версиясынан азыраак жана PostgreSQL 10 жана андан улуу версиясы үчүн репликаны архивдөө үчүн wal_level параметрин кайра конфигурациялашыңыз керек.

wal_level = archive

Келгиле, PostgreSQLдин өзүн колдонуп, WAL архивдерин ар бир 60 секундада камдык көчүрмөсүн жасайлы. Продукцияда сизде башка 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де маалымат базасын түзүңүз

Берилиштер базасы тестинде таблица түзүңүз1.

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

Тест1 базасында таблицадагы жазууларды карайбыз

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.conf дегенге recovery_target_time параметрин кошобуз – биз маалымат базасын кайсы убакта калыбына келтириш керек экенин көрсөтөбүз.

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 ГБ маалымат базасын түзүү https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

1 ГБ дайындарды чыгаргандан кийин челектин өлчөмүн суроо.

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га жылдыз бериңиз вал-г

Source: www.habr.com

Комментарий кошуу