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

Егер сіз Minio алдында nginx қолданбайтын болсаңыз, өзгертуіңіз керек

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio іске қосылуда

systemctl start minio

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

МҚ сервері

Айналымдағы 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

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 нұсқасынан төмен мұрағаттау үшін wal_level параметрін және PostgreSQL 10 және одан жоғары нұсқасы үшін репликаны қайта конфигурациялау қажет.

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-де мәліметтер қорын жасаңыз

Деректер базасында кесте құру test1.

create database test1;

Дерекқор сынауына ауысыңыз.

postgres=# c test1;

Біз индекстеу_кестесін жасаймыз.

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

Бротли

После генерации 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 сақтық көшірме жүйесіне кіріспе

Көріп отырғаныңыздай, Бротли өлшемі бойынша LZMA-мен салыстыруға болады, бірақ сақтық көшірме LZ4 уақытында орындалады.

Орыс тілді PostgreSQL қауымдастығының чаты: https://t.me/pgsql

Егер пайдалансаңыз, Github-қа жұлдыз беріңіз валь-г

Ақпарат көзі: www.habr.com

пікір қалдыру