WAL-G: tergum et recuperatio PostgreSQL DBMS

Diu notum est tergum faciens in SQL dumps (usura pg_dump aut pg_dumpall) Non est bona idea. Ad tergum PostgreSQL DBMS melius est uti imperio pg_basebackup, quod binarium exemplum talearum wal reddit. Sed cum totum processum conficiendi exemplar et restituendi studes, intelleges te opus esse ad minimum duos tricycles scribere ut totum opus efficias et non doleas tam supra quam infra. Ad dolorem sublevandum, WAL-G elaboratum est.

WAL-G Est instrumentum scriptum in Go ad tergum sursum et restituendum databases PostgreSQL (et recentiores MySQL/MariaDB, MongoDB et FoundationDB). Sustinet opus cum repositione Amazonum S3 (et analoga, exempli gratia, Yandex Object Repono), necnon Google Cloud Storage, Azure Storage, Celeri Object Repono et simpliciter cum tabella ratio. Totum setup descendit ad gradus simplices, sed propter hoc quod vasa circa eam per interreti dispersa sunt, non est absolutum quam- ad manualem, qui omnes gradus ab initio ad finem includat (sunt aliquot postes in Habré; sed plura ibi desiderantur).

WAL-G: tergum et recuperatio PostgreSQL DBMS

Hoc articulum principaliter ad scientiam meam ordinandam scripta est. DBA non sum, et laicorum lingua alicubi me exprimere possum, ut aliquae correctiones gratae sint!

Separatim noto omnia infra pertinentia et probata ad PostgreSQL 12.3 in Ubuntu 18.04, omnia mandata exsecutioni mandanda ut usor privilegiatus.

occasum

In tempore scribendi huius articuli versio stabilis WAL-G est v0.2.15 (March 2020). Hoc est quod utemur (sed si vis te ipsum aedificare de ramo magistro, repositio github habet omnia mandata ad hoc). To download and install you need to do:

#!/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/

Post hoc, debes primum configurare WAL-G, et deinde ipsum PostgreSQL.

Wal-G erigens

Ad exemplum repono tergum, Amazon S3 adhibebitur (quia propinquior est servis meis et eius usus vilissimus est). Operari cum illo, debes "s3 situla" et claves access.

Omnes superiores articuli de WALV-G configuratione utentes variabiles ambitus adhibitae sunt, cum hac emissione uncinorum collocari possunt .walg.json file in directorio domus postgressorum usorum. Ad eam creare, sequentia pagina currunt.

#!/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

Paucula de omnibus parametris explicem;

  • WALG_S3_PREFIX - iter ad S3 situla ubi tergum uploaded (vel ad radicem vel ad folder);
  • AWS_ACCESS_KEY_ID - aditum key in S3 (in casu recuperationis in calculonis servi, hae claves debent habere Policy ReadOnly! Haec fusius descripta in sectione recuperanda.);
  • AWS_SECRET_ACCESS_KEY - clavis secreta in S3 repono;
  • WALG_COMPRESSION_METHOD – modum compressionis, melius est uti Brotli (quia hoc est medium aureum inter magnitudinem ultimam et compressionem/decompressionis celeritatem);
  • WALG_DELTA_MAX_STEPS - numerus "deltas" ante plenum tergum creans (servant tempus et magnitudinem notitiarum receptarum, sed aliquantulum retardare possunt processus recuperandi, ideo non expedit magnis valoribus uti);
  • PGCATA - iter indicem tuum database data (potes invenire currit per mandatum pg_lsclusters);
  • PGHOST – connectens cum datorum, cum tergum locali melius est facere per unix nervum quam in hoc exemplo.

Ceteri parametri in documentis inveniuntur: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

PostgreSQL eriges

Ut in archivo intra datorum tabulas ad nubem imponatur et ex eis restituat (si opus est), plura parametris in tabella configurationis ponere debes. /etc/postgresql/12/main/postgresql.conf. Sicut in imprimis opus facnullae uncinis infra positis aliis valoribus ponuntur, ut cum configuratione relata sit, DBMS non fragore. His addere potes parametris utens:

#!/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

Descriptio parametri ad orandum;

  • wal_level' - quantum informationes scribendae in WA ligna, "replica" - omnia scribere;
  • archive_mode - enable downloading ex WAL omnia utens imperio a parametri archive_command;
  • archive_command - mandatum archiving log completam WAL;
  • archive_timeout - Tabularium lignorum fit solum cum perficitur, sed si servo tuo mutationes / datorum datorum paucas adiungit, tum sensum hic in secundis limes ponet, post quem violenter vocabitur archiving praeceptum (Intensive datorum singulis secundis scribo, ut hunc modulum in productione non ponere decrevi);
  • restore_command - mandatum ut stipes wal restauret ex tergum adhibebitur si "tergum plenum" (basi tergum) novis mutationibus datorum caret.

Plura de his omnibus parametris in translatione documentorum officialium legere potes. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

Occasus tergum schedule est

Quidquid quis dicat, commodissimum est cron currere. Hoc est quod configurare tergum creare. Incipiamus cum imperio ad plenum tergum creandum: in wal-g hoc argumentum est launchendi tergum-dis. Sed primo, melius est hoc mandatum manuale ab usore postgres currere ut omnia denique fiant (et errores accessus nullus est);

#!/bin/bash

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

Argumenta launches indicant viam ad indicis notitiae - commoneo te currentem invenire posse pg_lsclusters.

Si omnia sine erroribus exierunt et notitia in repono S3 cumulata erat, tunc periodicam in crontab configurare potes:

#!/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

In hoc exemplo, processus tergum incipit cotidie ad 4:15 sum.

Deletis vetus tergum

Verisimile, non necesse est ut omnia omnia tergum Mesozoicae ab aetate absolute servare, sic utile erit ut periodice "mundare" repositiones tuas (et "tergum plenum" et omnia WALIA. Haec omnia per opus cronum faciemus;

#!/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 hoc negotium singulis diebus 6:30 sum mittetur, omnia deletis (tergum, deltas et wals plena) exceptis exemplaribus ultimis 10 diebus, sed unum saltem tergum relinquens. ad statuto termino ut quovis loco после gaudet inclusa Pitr.

Restituendi ex tergum

Non latet quod clavis datorum salubrium est periodica restitutio ac verificationis integritatis notitiarum interiorum. Dicam tibi quomodo in hac sectione usura recuperare WAL-G, et postea de impedimentis loquemur.

Notatu dignum est separatim ut in ambitu experimenti (omnia quae productio non est) uti debes in S3 tantum ratione legere ut non tergum rescribas accidens. In casu wal-G, sequentia iura ponere debes pro S3 usuario in Politia Group (Effectus: Concede): s3: GetObject, s3: ListBucket, s3: GetBucketLocation. Et, sane, nolite oblivisci archive_mode = off in occasus file postgresql.conf, ita ut experimentum datorum tacite subnixum esse non velit.

Restauratio fit levi motu manus Deletis omnibus PostgreSQL data (including users), ita quaeso esse diligentissime cum sequentia mandata curris.

#!/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

Illis qui processus recuperare reprimere volunt, particula magicae bash infra parata est, ut in casu problematum recuperandi, scriptura cum codice non-nulla exitus collidet. In hoc exemplo, 120 chirographa facta sunt cum horarum 5 secundis (totalis 10 minutae pro recuperatione) ut cognoscatur an lima signum deletum sit (hoc significabit recuperationem bene esse);

#!/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

Post felicem recuperationem, noli oblivisci omnes processus retro (pgbouncer/monit, etc.) incipere.

Reprehendo notitia post recuperatio

Imperattivum est integritatem datorum post restitutionem inhibere, ut condicio dorsi fracto/pravo non oriatur. Et melius est hoc facere cum unoquoque archivo creato, sed ubi et quomodo in imaginatione tantum pendeat (singulos ministratores horae basis erigere potes vel perscriptio in CI). Sed ut minimum, necesse est notitias et indices in datorum reprimere.

Notitias ad reprimendam, satis est eam per TUBER currere, sed melius est ut cum creando datorum commoda reddis (data checksums):

#!/bin/bash

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

Ad reprimendam indices - exstat amcheck moduli, quaestionem sql sumamus ex eo WAL-G probat logicam quandam circa eam construe;

#!/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

summatimque

Nostram gratiam referre vellem Andrey Borodin ob eius auxilium ad editionem praeparandam et speciales gratias ob eius collationem ad evolutionem WAL-G!

Hic clausula est haec nota. Spero me posse facilitatem setup et ingentis potentiae importare ad hoc instrumentum in tuo comitatu utendo. Multum audivi de WAL-G, sed numquam satis temporis erat sedere et viderit. Et postquam domi implevi, hic articulus exivit a me.

Separatim memorabile est WAL-G etiam operari posse cum DBMS sequentibus;

Source: www.habr.com

Add a comment