הוא כלי פשוט ויעיל לגיבוי PostgreSQL לעננים. מבחינת הפונקציונליות העיקרית שלו, הוא היורש של הכלי הפופולרי , אבל נכתב מחדש ב-Go. אבל יש תכונה חדשה וחשובה ב-WAL-G - עותקי דלתא. עותקי דלתא לאחסן דפי קבצים שהשתנו מאז גרסת הגיבוי הקודמת. WAL-G מיישמת לא מעט טכנולוגיות לגיבויים מקבילים. WAL-G מהיר בהרבה מ-WAL-E.
פרטים על איך wal-g עובד ניתן למצוא במאמר:
פרוטוקול האחסון 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 וליצור דלי (לדוגמה, pg-backups).
שרת DB
WAL-G בסל"ד מורכב על ידי (אנטון פטסב). , .
למי שאין מערכת מבוססת 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 כמתואר כאן
בקשת גודל הדלי לאחר הפקת 1GB של נתונים.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd הוא כלי שורת פקודה חינמי לעבודה עם נתונים המאוחסנים באחסון S3 של אמזון. הכלי כתוב בשפת Python, מה שהופך אותו מתאים לשימוש במערכות הפעלה ו... Windowsו - Linux.
מתקין s4cmd
pip install s4cmdLZ4
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
השוואה בין תוצאות בתרשים.

כפי שניתן לראות, Brotli דומה בגודלו ל-LZMA, אך הגיבוי מתבצע בזמן LZ4.
צ'אט של קהילת PostgreSQL דוברת הרוסית:
אנא תן כוכב ל-Github אם אתה משתמש
מקור: www.habr.com
