WAL-G: PostgreSQL ДҚБЖ сақтық көшірмелері және қалпына келтіру

Сақтық көшірмелерді SQL қоқыстарына жасау бұрыннан белгілі ( pg_dump немесе pg_dumpall) жақсы идея емес. PostgreSQL ДҚБЖ сақтық көшірмесін жасау үшін пәрменді қолданған дұрыс pg_basebackup, ол WAL журналдарының екілік көшірмесін жасайды. Бірақ сіз көшірмені жасау және қалпына келтірудің бүкіл процесін зерттей бастағанда, бұл жұмыс істеуі үшін кем дегенде екі трициклді жазу керек екенін түсінесіз және жоғарыда да, төменнен де ауырсынуды тудырмау керек. Қайғыны жеңілдету үшін WAL-G әзірленді.

WAL-G PostgreSQL дерекқорларының сақтық көшірмесін жасауға және қалпына келтіруге арналған Go бағдарламасында жазылған құрал (және жақында MySQL/MariaDB, MongoDB және FoundationDB). Ол Amazon S3 жадымен (және аналогтары, мысалы, Yandex Object Storage), сонымен қатар Google Cloud Storage, Azure Storage, Swift Object Storage және жай ғана файлдық жүйемен жұмыс істеуді қолдайды. Бүкіл орнату қарапайым қадамдардан тұрады, бірақ бұл туралы мақалалар Интернетте шашыраңқы болғандықтан, басынан аяғына дейін барлық қадамдарды қамтитын толық нұсқаулық жоқ (Habre-де бірнеше хабарламалар бар, бірақ ол жерде көптеген ұпайлар жіберілген).

WAL-G: PostgreSQL ДҚБЖ сақтық көшірмелері және қалпына келтіру

Бұл мақала ең алдымен өз білімімді жүйелеу үшін жазылды. Мен DBA емеспін және мен өзімді бір жерде қарапайым тілде айта аламын, сондықтан кез келген түзетулер қабылданады!

Сонымен қатар, төмендегілердің барлығы маңызды екенін және Ubuntu 12.3 жүйесінде PostgreSQL 18.04 үшін тексерілгенін ескеремін, барлық пәрмендер артықшылықты пайдаланушы ретінде орындалуы керек.

параметр

Осы мақаланы жазу кезінде WAL-G тұрақты нұсқасы болып табылады v0.2.15 (2020 ж. наурыз). Бұл біз қолданатынымыз (бірақ егер сіз оны негізгі филиалдан өзіңіз жасағыңыз келсе, онда github репозиторийінде бұл үшін барлық нұсқаулар бар). Жүктеп алу және орнату үшін сізге қажет:

#!/bin/bash

curl -L "https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz" -o "wal-g.linux-amd64.tar.gz"
tar -xzf wal-g.linux-amd64.tar.gz
mv wal-g /usr/local/bin/

Осыдан кейін алдымен WAL-G конфигурациялау керек, содан кейін PostgreSQL өзі.

WAL-G орнату

Сақтық көшірмелерді сақтау мысалы үшін Amazon S3 пайдаланылады (себебі ол менің серверлеріме жақын және оны пайдалану өте арзан). Онымен жұмыс істеу үшін сізге «s3 шелегі» және кіру пернелері қажет.

WAL-G туралы алдыңғы мақалалардың барлығы қоршаған ортаның айнымалы мәндерін пайдаланатын конфигурацияны пайдаланды, бірақ бұл шығарылыммен параметрлерді мына жерде орналастыруға болады. .walg.json файлы postgres пайдаланушысының үй каталогында. Оны жасау үшін келесі bash сценарийін іске қосыңыз:

#!/bin/bash

cat > /var/lib/postgresql/.walg.json << EOF
{
    "WALG_S3_PREFIX": "s3://your_bucket/path",
    "AWS_ACCESS_KEY_ID": "key_id",
    "AWS_SECRET_ACCESS_KEY": "secret_key",
    "WALG_COMPRESSION_METHOD": "brotli",
    "WALG_DELTA_MAX_STEPS": "5",
    "PGDATA": "/var/lib/postgresql/12/main",
    "PGHOST": "/var/run/postgresql/.s.PGSQL.5432"
}
EOF
# обязательно меняем владельца файла:
chown postgres: /var/lib/postgresql/.walg.json

Барлық параметрлер туралы аздап түсіндірейін:

  • WALG_S3_PREFIX – сақтық көшірмелер жүктелетін S3 шелегіне апаратын жол (түбірге немесе қалтаға);
  • AWS_ACCESS_KEY_ID – S3 жүйесіндегі кіру кілті (сынақ серверінде қалпына келтірілген жағдайда, бұл кілттерде ReadOnly саясаты болуы керек! Бұл қалпына келтіру бөлімінде толығырақ сипатталған.);
  • AWS_SECRET_ACCESS_KEY – S3 жадындағы құпия кілт;
  • WALG_COMPRESSION_METHOD – қысу әдісі, Brotli қолданған дұрыс (өйткені бұл соңғы өлшем мен қысу/декомпрессия жылдамдығы арасындағы алтын орта);
  • WALG_DELTA_MAX_STEPS – толық сақтық көшірме жасау алдындағы «дельталар» саны (олар уақытты және жүктелген деректердің көлемін үнемдейді, бірақ қалпына келтіру процесін сәл баяулатуы мүмкін, сондықтан үлкен мәндерді пайдалану ұсынылмайды);
  • PGDATA – дерекқор деректері бар каталогқа жол (пәрменін орындау арқылы білуге ​​болады pg_lsclusters);
  • PGHOST – дерекқорға қосылу, жергілікті сақтық көшірмемен оны осы мысалдағыдай unix-розетка арқылы жасаған дұрыс.

Басқа параметрлерді құжаттамада табуға болады: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

PostgreSQL конфигурациялануда

Дерекқордағы мұрағатшы WAL журналдарын бұлтқа жүктеп алып, олардан қалпына келтіруі үшін (қажет болса) конфигурация файлында бірнеше параметрлерді орнату керек. /etc/postgresql/12/main/postgresql.conf. Жаңадан бастағандар үшін көз жеткізуіңіз керектөмендегі параметрлердің ешқайсысы басқа мәндерге орнатылмаған, осылайша конфигурация қайта жүктелгенде, ДҚБЖ бұзылмайды. Бұл параметрлерді мыналарды пайдаланып қосуға болады:

#!/bin/bash

echo "wal_level=replica" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_mode=on" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_command='/usr/local/bin/wal-g wal-push "%p" >> /var/log/postgresql/archive_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf
echo “archive_timeout=60” >> /etc/postgresql/12/main/postgresql.conf
echo "restore_command='/usr/local/bin/wal-g wal-fetch "%f" "%p" >> /var/log/postgresql/restore_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf

# перезагружаем конфиг через отправку SIGHUP сигнала всем процессам БД
killall -s HUP postgres

Орнатылатын параметрлердің сипаттамасы:

  • wal_level – WAL журналдарына қанша ақпарат жазу керек, «реплика» – барлығын жазу;
  • мұрағаттық_режим – параметрден пәрмен арқылы WAL журналдарын жүктеуді қосыңыз мұрағаттық_пәрмені;
  • мұрағаттық_пәрмені – аяқталған WAL журналын мұрағаттау командасы;
  • мұрағаттық_күту уақыты – журналдарды мұрағаттау ол аяқталғаннан кейін ғана орындалады, бірақ егер сіздің серверіңіз дерекқорға аз деректерді өзгертсе/қосса, мұнда секундтар ішінде шектеу қоюдың мағынасы бар, содан кейін мұрағаттау пәрмені мәжбүрлеп шақырылады (Мен әр секунд сайын дерекқорға қарқынды жазамын, сондықтан мен бұл параметрді өндірісте орнатпауды шештім);
  • қалпына келтіру_пәрмені – WAL журналын сақтық көшірмеден қалпына келтіру пәрмені «толық сақтық көшірмеде» (негізгі сақтық көшірмеде) дерекқордағы соңғы өзгерістер болмаған жағдайда пайдаланылады.

Барлық осы параметрлер туралы толығырақ ресми құжаттаманың аудармасынан оқи аласыз: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

Сақтық көшірме кестесін орнату

Қалай айтса да, оны іске қосудың ең ыңғайлы жолы - cron. Бұл сақтық көшірмелерді жасау үшін конфигурациялайтын нәрсе. Толық сақтық көшірме жасау пәрменінен бастайық: wal-g-де бұл іске қосу аргументі резервтік көшіру. Алдымен, бәрі жақсы екеніне көз жеткізу үшін (және кіру қателері жоқ) осы пәрменді postgres пайдаланушысынан қолмен іске қосқан дұрыс:

#!/bin/bash

su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'

Іске қосу аргументтері деректер каталогына жолды көрсетеді - оны іске қосу арқылы білуге ​​болатынын еске саламын pg_lsclusters.

Егер бәрі қатесіз өтіп, деректер S3 жадына жүктелсе, онда crontab бағдарламасында мерзімді іске қосуды конфигурациялауға болады:

#!/bin/bash

echo "15 4 * * *    /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main >> /var/log/postgresql/walg_backup.log 2>&1" >> /var/spool/cron/crontabs/postgres
# задаем владельца и выставляем правильные права файлу
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres

Бұл мысалда сақтық көшірме жасау процесі күн сайын таңғы сағат 4:15-те басталады.

Ескі сақтық көшірмелерді жою

Сірә, сізге мезозой дәуіріндегі барлық сақтық көшірмелерді сақтаудың қажеті жоқ, сондықтан жадты мезгіл-мезгіл «тазарту» пайдалы болады («толық резервтік көшірмелер» де, WAL журналдары да). Біз мұның бәрін cron тапсырмасы арқылы орындаймыз:

#!/bin/bash

echo "30 6 * * *    /usr/local/bin/wal-g delete before FIND_FULL $(date -d '-10 days' '+%FT%TZ') --confirm >> /var/log/postgresql/walg_delete.log 2>&1" >> /var/spool/cron/crontabs/postgres
# ещё раз задаем владельца и выставляем правильные права файлу (хоть это обычно это и не нужно повторно делать)
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres

Cron бұл тапсырманы күн сайын таңғы 6:30-да орындап, соңғы 10 күндегі көшірмелерден басқа барлығын (толық сақтық көшірмелерді, дельталарды және WAL файлдарын) жояды, бірақ кемінде бір сақтық көшірме қалдырады. қарай кез келген нүкте болатындай күні көрсетілген после күндер PITR-ге енгізілген.

Сақтық көшірмеден қалпына келтіру

Жасыратыны жоқ, сау деректер базасының кілті кезеңді түрде қалпына келтіру және ішіндегі деректердің тұтастығын тексеру болып табылады. Мен осы бөлімде WAL-G көмегімен қалай қалпына келтіруге болатынын айтамын және тексерулер туралы кейінірек айтатын боламыз.

Мұны бөлек атап өту керек Сынақ ортасында қалпына келтіру үшін (өндіріс болып табылмайтын барлық нәрсе) сақтық көшірмелерді кездейсоқ қайта жазбау үшін S3 жүйесінде Тек оқуға арналған тіркелгіні пайдалану қажет. WAL-G жағдайында топтық саясатта S3 пайдаланушысы үшін келесі құқықтарды орнату керек (Әсері: Рұқсат ету): s3: GetObject, s3: ListBucket, s3:GetBucketLocation. Және, әрине, орнатуды ұмытпаңыз архив_режимі=өшіру параметрлер файлында postgresql.conf, осылайша сынақ дерекқорыңыздың сақтық көшірмесін тыныш жасауды қаламайды.

Қалпына келтіру қолдың аздап қозғалысы арқылы жүзеге асырылады барлық PostgreSQL деректерін жою (пайдаланушыларды қоса), сондықтан келесі пәрмендерді орындаған кезде өте сақ болыңыз.

#!/bin/bash

# если есть балансировщик подключений (например, pgbouncer), то вначале отключаем его, чтобы он не нарыгал ошибок в лог
service pgbouncer stop
# если есть демон, который перезапускает упавшие процессы (например, monit), то останавливаем в нём процесс мониторинга базы (у меня это pgsql12)
monit stop pgsql12
# или останавливаем мониторинг полностью
service monit stop
# останавливаем саму базу данных
service postgresql stop
# удаляем все данные из текущей базы (!!!); лучше предварительно сделать их копию, если есть свободное место на диске
rm -rf /var/lib/postgresql/12/main
# скачиваем резервную копию и разархивируем её
su - postgres -c '/usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST'
# помещаем рядом с базой специальный файл-сигнал для восстановления (см. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY ), он обязательно должен быть создан от пользователя postgres
su - postgres -c 'touch /var/lib/postgresql/12/main/recovery.signal'
# запускаем базу данных, чтобы она инициировала процесс восстановления
service postgresql start

Қалпына келтіру процесін тексергісі келетіндер үшін төменде bash магиясының кішкене бөлігі дайындалған, осылайша қалпына келтіру кезінде проблемалар туындаған жағдайда сценарий нөлден тыс шығу кодымен бұзылады. Бұл мысалда сигнал файлының жойылғанын білу үшін 120 секунд күту уақытымен (қалпына келтіру үшін барлығы 5 минут) 10 тексеру жүргізіледі (бұл қалпына келтіру сәтті болғанын білдіреді):

#!/bin/bash

CHECK_RECOVERY_SIGNAL_ITER=0
while [ ${CHECK_RECOVERY_SIGNAL_ITER} -le 120 ]
do
    if [ ! -f "/var/lib/postgresql/12/main/recovery.signal" ]
    then
        echo "recovery.signal removed"
        break
    fi
    sleep 5
    ((CHECK_RECOVERY_SIGNAL_ITER+1))
done

# если после всех проверок файл всё равно существует, то падаем с ошибкой
if [ -f "/var/lib/postgresql/12/main/recovery.signal" ]
then
    echo "recovery.signal still exists!"
    exit 17
fi

Сәтті қалпына келтіргеннен кейін барлық процестерді қайта бастауды ұмытпаңыз (pgbouncer/monit, т.б.).

Қалпына келтіруден кейін деректерді тексеру

Қалпына келтіргеннен кейін деректер қорының тұтастығын тексеру міндетті болып табылады, осылайша бұзылған/қисық сақтық көшірмемен жағдай туындамайды. Мұны әрбір жасалған мұрағатпен жасаған дұрыс, бірақ қайда және қалай болатыны сіздің қиялыңызға байланысты (сіз жеке серверлерді сағат сайын көбейте аласыз немесе CI-де тексеру жүргізе аласыз). Бірақ кем дегенде, деректер базасындағы деректер мен индекстерді тексеру қажет.

Деректерді тексеру үшін оны демп арқылы іске қосу жеткілікті, бірақ дерекқорды жасау кезінде бақылау сомасын қосқан дұрыс (деректер бақылау сомасы):

#!/bin/bash

if ! su - postgres -c 'pg_dumpall > /dev/null'
then
    echo 'pg_dumpall failed'
    exit 125
fi

Индекстерді тексеру үшін - бар amcheck модулі, ол үшін sql сұрауын алайық WAL-G сынақтары және оның айналасында кішкене логика жасаңыз:

#!/bin/bash

# добавляем sql-запрос для проверки в файл во временной директории
cat > /tmp/amcheck.sql << EOF
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT bt_index_check(c.oid), c.relname, c.relpages
FROM pg_index i
JOIN pg_opclass op ON i.indclass[0] = op.oid
JOIN pg_am am ON op.opcmethod = am.oid
JOIN pg_class c ON i.indexrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE am.amname = 'btree'
AND c.relpersistence != 't'
AND i.indisready AND i.indisvalid;
EOF
chown postgres: /tmp/amcheck.sql

# добавляем скрипт для запуска проверок всех доступных баз в кластере
# (обратите внимание что переменные и запуск команд – экранированы)
cat > /tmp/run_amcheck.sh << EOF
for DBNAME in $(su - postgres -c 'psql -q -A -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;" ')
do
    echo "Database: ${DBNAME}"
    su - postgres -c "psql -f /tmp/amcheck.sql -v 'ON_ERROR_STOP=1' ${DBNAME}" && EXIT_STATUS=$? || EXIT_STATUS=$?
    if [ "${EXIT_STATUS}" -ne 0 ]
    then
        echo "amcheck failed on DB: ${DBNAME}"
        exit 125
    fi
done
EOF
chmod +x /tmp/run_amcheck.sh

# запускаем скрипт
/tmp/run_amcheck.sh > /tmp/amcheck.log

# для проверки что всё прошло успешно можно проверить exit code или grep’нуть ошибку
if grep 'amcheck failed' "/tmp/amcheck.log"
then
    echo 'amcheck failed: '
    cat /tmp/amcheck.log
    exit 125
fi

қорытындысын

Басылымды дайындауға көрсеткен көмегі үшін Андрей Бородинге алғысымды және WAL-G-ді дамытуға қосқан үлесі үшін ерекше алғысымды білдіргім келеді!

Осы жазбаны аяқтайды. Мен орнатудың қарапайымдылығын және осы құралды сіздің компанияңызда пайдаланудың үлкен әлеуетін жеткізе алдым деп үміттенемін. Мен WAL-G туралы көп естідім, бірақ отыруға және оны анықтауға ешқашан уақытым болмады. Ал мен оны үйде жүзеге асырғаннан кейін, бұл мақала меннен шықты.

Сонымен қатар, WAL-G келесі ДҚБЖ-мен де жұмыс істей алатынын атап өткен жөн:

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

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