WAL-G: cùl-taic agus faighinn air ais DBMS PostgreSQL

Tha fios o chionn fhada gun tèid cùl-taic a dhèanamh ann an dumps SQL (a’ cleachdadh pg_dump no pg_dumpall) chan e deagh bheachd a th’ ann. Gus cùl-taic a dhèanamh den DBMS PostgreSQL, tha e nas fheàrr an àithne a chleachdadh pg_basebackup, a nì leth-bhreac dà-chànanach de logaichean WAL. Ach nuair a thòisicheas tu a 'sgrùdadh a' phròiseas gu lèir de bhith a 'cruthachadh leth-bhreac agus ag ath-nuadhachadh, tuigidh tu gum feum thu co-dhiù trì baidhsagalan a sgrìobhadh airson seo a bhith ag obair agus gun a bhith ag adhbhrachadh pian dhut gu h-àrd agus gu h-ìosal. Gus fulangas a lughdachadh, chaidh WAL-G a leasachadh.

WAL-G na inneal sgrìobhte ann an Go airson cùl-taic agus ath-nuadhachadh stòran-dàta PostgreSQL (agus o chionn ghoirid MySQL / MariaDB, MongoDB agus FoundationDB). Bidh e a’ toirt taic do bhith ag obair le stòradh Amazon S3 (agus analogues, mar eisimpleir, Yandex Object Storage), a bharrachd air Google Cloud Storage, Azure Storage, Swift Object Storage agus dìreach leis an t-siostam faidhle. Tha an suidheachadh gu lèir a’ tighinn sìos gu ceumannan sìmplidh, ach leis gu bheil artaigilean mu dheidhinn sgapte air feadh an eadar-lìn, chan eil leabhar-làimhe coileanta ann a bheireadh a-steach a h-uile ceum bho thoiseach gu deireadh (tha grunn phuist ann air Habré, ach tha mòran phuingean air an call an sin).

WAL-G: cùl-taic agus faighinn air ais DBMS PostgreSQL

Chaidh an artaigil seo a sgrìobhadh gu sònraichte gus m’ eòlas a chuir air dòigh. Chan e DBA a th’ annam agus is urrainn dhomh mi fhìn a chuir an cèill ann an cànan layman am badeigin, agus mar sin tha fàilte air ceartachaidhean sam bith!

Air leth, tha mi a’ toirt fa-near gu bheil a h-uile dad gu h-ìosal buntainneach agus air a dhearbhadh airson PostgreSQL 12.3 air Ubuntu 18.04, feumaidh a h-uile àithne a bhith air a chuir gu bàs mar neach-cleachdaidh sochair.

suidheachadh

Aig àm sgrìobhaidh an artaigil seo, tha an dreach seasmhach de WAL-G v0.2.15 (Màrt 2020). Seo na bhios sinn a’ cleachdadh (ach ma tha thu airson a thogail leat fhèin bhon phrìomh mheur, tha an stiùireadh gu lèir aig stòr github airson seo.). Gus a luchdachadh sìos agus a stàladh feumaidh tu:

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

Às deidh seo, feumaidh tu WAL-G a rèiteachadh an toiseach, agus an uairsin PostgreSQL fhèin.

A' stèidheachadh WAL-G

Airson eisimpleir de stòradh cùl-taic, thèid Amazon S3 a chleachdadh (oir tha e nas fhaisge air mo sheirbhisich agus tha a chleachdadh gu math saor). Gus obrachadh leis, feumaidh tu “bucaid s3” agus iuchraichean ruigsinneachd.

Chleachd a h-uile artaigil roimhe mu WAL-G rèiteachadh a’ cleachdadh caochladairean àrainneachd, ach leis an fhoillseachadh seo faodar na roghainnean a shuidheachadh .walg.json faidhle ann an eòlaire dachaigh neach-cleachdaidh postgres. Gus a chruthachadh, ruith an sgriobt bash a leanas:

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

Leig dhomh mìneachadh beagan mu na paramadairean gu lèir:

  • WALG_S3_PREFIX - an t-slighe chun bhucaid S3 agad far an tèid cùl-taic a luchdachadh suas (faodaidh tu an dàrna cuid gu freumh no gu pasgan);
  • AWS_ACCESS_KEY_ID - iuchair ruigsinneachd ann an S3 (air eagal ath-bheothachadh air frithealaiche deuchainn, feumaidh Poileasaidh ReadOnly a bhith aig na h-iuchraichean sin! Tha seo air a mhìneachadh nas mionaidiche anns an earrann air ath-bheothachadh.);
  • AWS_SECRET_ACCESS_KEY - iuchair dhìomhair ann an stòradh S3;
  • WALG_COMPRESSION_METHOD - modh teannachaidh, tha e nas fheàrr Brotli a chleachdadh (oir is e seo am meadhan òir eadar am meud deireannach agus astar teannachaidh / dì-dhùmhlachaidh);
  • WALG_DELTA_MAX_STEPS - an àireamh de “deltas” mus cruthaichear cùl-taic slàn (bidh iad a’ sàbhaladh ùine agus meud an dàta a chaidh a luchdachadh sìos, ach faodaidh iad beagan slaodachadh a dhèanamh air a’ phròiseas ath-bheothachaidh, agus mar sin chan eil e ciallach luachan mòra a chleachdadh);
  • PGDATA - slighe chun eòlaire leis an dàta stòr-dàta agad (gheibh thu a-mach le bhith a’ ruith an àithne pg_lsclusters);
  • PGHOST - a’ ceangal ris an stòr-dàta, le cùl-taic ionadail tha e nas fheàrr a dhèanamh tro socaid unix mar a tha san eisimpleir seo.

Gheibhear paramadairean eile anns na sgrìobhainnean: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

A’ stèidheachadh PostgreSQL

Gus an urrainn don tasglann taobh a-staigh an stòr-dàta logaichean WAL a luchdachadh suas chun sgòth agus an toirt air ais bhuapa (ma tha sin riatanach), feumaidh tu grunn pharaimearan a shuidheachadh anns an fhaidhle rèiteachaidh /etc/postgresql/12/main/postgresql.conf. Dìreach airson luchd-tòiseachaidh feumaidh tu dèanamh cinnteachnach eil gin de na roghainnean gu h-ìosal air an suidheachadh gu luachan sam bith eile, gus nach tuit an DBMS nuair a thèid an rèiteachadh ath-luchdachadh. Faodaidh tu na paramadairean seo a chur ris a’ cleachdadh:

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

Tuairisgeul air na crìochan a thèid a shuidheachadh:

  • ìre_ ìre - dè an ìre de fhiosrachadh a sgrìobhas tu ann an logaichean WAL, “mac-samhail” - sgrìobh a h-uile dad;
  • modh_tasglann - leig le luchdachadh sìos logaichean WAL a’ cleachdadh an àithne bhon pharameter tasglann_àithne;
  • tasglann_àithne - òrdugh airson log WAL crìochnaichte a thasgadh;
  • clàr-ama_archive - cha tèid tasglann de logaichean a dhèanamh ach nuair a bhios e deiseil, ach ma dh’ atharraicheas an t-seirbheisiche agad / ma chuireas e glè bheag de dhàta ris an stòr-dàta, tha e ciallach crìoch a chuir an seo ann an diogan, agus às deidh sin thèid an àithne tasglann a ghairm gu làidir (Bidh mi a’ sgrìobhadh gu dian chun stòr-dàta a h-uile diog, agus mar sin chuir mi romham gun a bhith a’ suidheachadh am paramadair seo ann an cinneasachadh);
  • òrdugh_ aisig - thèid an àithne gus log WAL a thoirt air ais bho chùl-taic a chleachdadh mura h-eil na h-atharrachaidhean as ùire san stòr-dàta air an “làn chùl-taic” (cùl-taic bunaiteach).

Faodaidh tu barrachd a leughadh mu na paramadairean sin uile anns an eadar-theangachadh air na sgrìobhainnean oifigeil: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

A 'stèidheachadh clàr-taice cùl-taic

Ge bith dè a chanas duine, is e cron an dòigh as freagarraiche air a ruith. Is e seo a bhios sinn a’ rèiteachadh gus cùl-taic a chruthachadh. Feuch an tòisich sinn leis an àithne gus cùl-taic slàn a chruthachadh: ann an wal-g is e seo an argamaid tòiseachaidh lethbhreac-glèidhidh. Ach an toiseach, tha e nas fheàrr an àithne seo a ruith le làimh bhon neach-cleachdaidh postgres gus dèanamh cinnteach gu bheil a h-uile dad gu math (agus nach eil mearachdan ruigsinneachd ann):

#!/bin/bash

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

Tha na h-argamaidean cur air bhog a’ nochdadh an t-slighe chun an eòlaire dàta - tha mi gad chuimhneachadh gum faigh thu a-mach le bhith a’ ruith pg_lsclusters.

Ma chaidh a h-uile càil às aonais mhearachdan agus gun deach an dàta a luchdachadh a-steach do stòradh S3, faodaidh tu an uairsin cur air bhog bho àm gu àm a rèiteachadh ann an 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

San eisimpleir seo, bidh am pròiseas cùl-taic a’ tòiseachadh gach latha aig 4:15m.

A' sguabadh às seann lethbhreacan-glèidhidh

Is coltaiche, chan fheum thu a h-uile cùl-taic bhon àm Mesozoic a chumail, agus mar sin bidh e feumail do stòradh a “ghlanadh” bho àm gu àm (an dà chuid “làn chùl-taic” agus logaichean WAL). Nì sinn seo uile tro obair 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

Bidh Cron a’ ruith a’ ghnìomh seo a h-uile latha aig 6: 30m, a’ cuir às a h-uile càil (cùl-taic slàn, deltas agus WALs) ach a-mhàin lethbhric airson na 10 latha mu dheireadh, ach a’ fàgail co-dhiù aon chùl-taic gu ceann-latha ainmichte gus am bi puing sam bith после Bha cinn-latha air an toirt a-steach do PITR.

Ath-nuadhachadh bho chùl-taic

Chan eil e na dhìomhaireachd gur e ath-nuadhachadh bho àm gu àm agus dearbhadh ionracas an dàta a-staigh an iuchair airson stòr-dàta fallain. Innsidh mi dhut mar a gheibh thu air ais le bhith a’ cleachdadh WAL-G san roinn seo, agus bruidhnidh sinn mu sgrùdaidhean nas fhaide air adhart.

Bu chòir a thoirt fa-near air leth gum feum thu cunntas Leugh a-mhàin a chleachdadh ann an AS3 gus ath-nuadhachadh ann an àrainneachd deuchainn (a h-uile rud nach eil na riochdachadh) gus nach cuir thu thairis air cùl-taic gun fhiosta. A thaobh WAL-G, feumaidh tu na còraichean a leanas a shuidheachadh airson an neach-cleachdaidh S3 ann am Poileasaidh Buidhne (Buaidh: Ceadaich): s3: Faigh Object, s3:Bucaid Liosta, s3:GetBucketLocation. Agus, gu dearbh, na dìochuimhnich a shuidheachadh archive_mode=dheth ann am faidhle nan roghainnean postgresql.conf, gus nach bi an stòr-dàta deuchainn agad airson a bhith air a chumail suas gu sàmhach.

Tha ath-nuadhachadh air a dhèanamh le gluasad beag den làmh a' sguabadh às a h-uile dàta PostgreSQL (a’ toirt a-steach luchd-cleachdaidh), mar sin bi air leth faiceallach nuair a ruitheas tu na h-òrdughan a leanas.

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

Dhaibhsan a tha airson sùil a thoirt air a’ phròiseas ath-bheothachaidh, tha pìos beag de dhraoidheachd bash air ullachadh gu h-ìosal, gus an tuit an sgriobt le còd fàgail neo-neoni air eagal duilgheadasan ath-bheothachaidh. San eisimpleir seo, thathas a’ dèanamh sgrùdaidhean 120 le ùine a-mach de 5 diogan (10 mionaidean gu h-iomlan airson faighinn seachad air) gus faighinn a-mach an deach am faidhle comharran a dhubhadh às (bidh seo a’ ciallachadh gun do shoirbhich leis an ath-bheothachadh):

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

Às deidh ath-bheothachadh soirbheachail, na dìochuimhnich tòiseachadh air a h-uile pròiseas (pgbouncer / monit, msaa) air ais.

A 'sgrùdadh dàta an dèidh ath-bheothachadh

Tha e deatamach sgrùdadh a dhèanamh air ionracas an stòr-dàta às deidh ath-nuadhachadh, gus nach èirich suidheachadh le cùl-taic briste / cam. Agus tha e nas fheàrr seo a dhèanamh le gach tasglann cruthaichte, ach càite agus ciamar a tha e an urra ri do mhac-meanmna a-mhàin (faodaidh tu frithealaichean fa leth a thogail gach uair no seic a ruith ann an CI). Ach aig a 'char as lugha, feumar sgrùdadh a dhèanamh air an dàta agus na clàran-amais anns an stòr-dàta.

Gus sgrùdadh a dhèanamh air an dàta, tha e gu leòr airson a ruith tro dump, ach tha e nas fheàrr nuair a chruthaicheas tu an stòr-dàta gu bheil seicichean air an comasachadh (sgrùdaidhean dàta):

#!/bin/bash

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

Gus sgrùdadh a dhèanamh air clàran-amais - ann modal amcheck, bheir sinn a’ cheist sql air a shon bho deuchainnean WAL-G agus tog beagan loidsig timcheall air:

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

Geàrr-chunntas a thoirt air

Bu mhath leam mo thaing a thoirt do Andrey Borodin airson a chuideachaidh ann a bhith ag ullachadh an fhoillseachaidh agus taing shònraichte airson na chuir e ri leasachadh WAL-G!

Tha seo a’ crìochnachadh an nota seo. Tha mi an dòchas gun robh e comasach dhomh innse cho furasta sa bha an suidheachadh agus an comas mòr airson an inneal seo a chleachdadh sa chompanaidh agad. Chuala mi tòrr mu WAL-G, ach cha robh ùine gu leòr agam a-riamh airson suidhe sìos agus obrachadh a-mach. Agus às deidh dhomh a chuir an gnìomh aig an taigh, thàinig an artaigil seo a-mach bhuam.

Air leth, is fhiach a bhith mothachail gum faod WAL-G cuideachd obrachadh leis na DBMS a leanas:

Source: www.habr.com

Cuir beachd ann