היכרות עם מערכת הגיבוי wal-g PostgreSQL

WAL-G הוא כלי פשוט ויעיל לגיבוי PostgreSQL לעננים. מבחינת הפונקציונליות העיקרית שלו, הוא היורש של הכלי הפופולרי WAL-E, אבל נכתב מחדש ב-Go. אבל יש תכונה חדשה וחשובה ב-WAL-G - עותקי דלתא. עותקי דלתא WAL-G לאחסן דפי קבצים שהשתנו מאז גרסת הגיבוי הקודמת. WAL-G מיישמת לא מעט טכנולוגיות לגיבויים מקבילים. WAL-G מהיר בהרבה מ-WAL-E.

פרטים על איך wal-g עובד ניתן למצוא במאמר: אנחנו עושים אוברclock לגיבוי. הרצאה של Yandex

פרוטוקול האחסון S3 הפך פופולרי לאחסון נתונים. אחד היתרונות של S3 הוא יכולת הגישה באמצעות API, המאפשרת לארגן אינטראקציה גמישה עם האחסון, כולל גישת קריאה ציבורית, בעוד שעדכון המידע באחסון מתרחש רק על ידי אנשים מורשים.

ישנם מספר יישומים ציבוריים ופרטיים של אחסון הפועלים על פרוטוקול S3. היום נבחן פתרון פופולרי לארגון אחסון קטן - Minio.

שרת PostgreSQL יחיד מתאים לבדיקת wal-g, ו-Minio משמש כתחליף ל-S3.

שרת מיניו

התקנת מיניו

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, פדורה 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

אם אתה בודק על שרת אחד, עליך להגדיר מחדש את הפרמטר wal_level לארכיון עבור PostgreSQL פחות מגרסה 1, והעתק עבור PostgreSQL גרסה 10 ומעלה.

wal_level = archive

בואו נגבה את ארכיוני WAL כל 60 שניות באמצעות PostgreSQL עצמה. ב-prod, יהיה לך ערך 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 יתחיל את תהליך השחזור מה-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 הוא כלי שורת פקודה חינמי לעבודה עם נתונים המאוחסנים באחסון 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

כפי שניתן לראות, Brotli דומה בגודלו ל-LZMA, אך הגיבוי מתבצע בזמן LZ4.

צ'אט של קהילת PostgreSQL דוברת הרוסית: https://t.me/pgsql

אנא תן כוכב ל-Github אם אתה משתמש וול-ג

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster