WAL-G: cúltacaí agus aisghabháil DBMS PostgreSQL

Tá sé ar eolas le fada go ndéanfaí cúltacaí isteach i ndumpaí SQL (ag baint úsáide as pg_dumpáilpg_dumpall) nach smaoineamh maith é. Chun an DBMS PostgreSQL a chúltaca, is fearr an t-ordú a úsáid pg_basebackup, a dhéanann cóip dhénártha de logaí WAL. Ach nuair a thosaíonn tú ag déanamh staidéir ar an bpróiseas iomlán chun cóip a chruthú agus a athchóiriú, tuigfidh tú go gcaithfidh tú cúpla trírothach ar a laghad a scríobh chun go n-oibreoidh sé seo agus gan a bheith ina chúis le pian thuas agus thíos. Chun an fhulaingt a mhaolú, forbraíodh WAL-G.

WAL-G is uirlis scríofa in Go chun bunachair shonraí PostgreSQL a thacú agus a athchóiriú (agus le déanaí MySQL/MariaDB, MongoDB agus FoundationDB). Tacaíonn sé le bheith ag obair le stóráil Amazon S3 (agus analógacha, mar shampla, Yandex Object Storage), chomh maith le Google Cloud Storage, Azure Storage, Swift Object Storage agus go simplí leis an gcóras comhaid. Tagann an socrú iomlán síos go dtí céimeanna simplí, ach mar gheall ar an bhfíric go bhfuil ailt faoi scaipthe ar fud an Idirlíon, níl aon lámhleabhar iomlán conas-le a chuimseodh na céimeanna go léir ó thús go deireadh (tá roinnt post ar Habré, ach cailltear go leor pointí ansin).

WAL-G: cúltacaí agus aisghabháil DBMS PostgreSQL

Scríobhadh an t-alt seo go príomha chun mo chuid eolais a chórasú. Ní DBA mé agus is féidir liom mé féin a chur in iúl i dteanga layman áit éigin, mar sin tá fáilte roimh cheartúcháin ar bith!

Ar leithligh, tugaim faoi deara go bhfuil gach rud thíos ábhartha agus a thástáil le haghaidh PostgreSQL 12.3 ar Ubuntu 18.04, ní mór gach ordú a fhorghníomhú mar úsáideoir pribhléideach.

Suiteáil

Agus an t-alt seo á scríobh, tá an leagan cobhsaí de WAL-G v0.2.15 (Márta 2020). Seo é a úsáidfimid (ach más mian leat é a thógáil leat féin ón máistir-bhrainse, tá na treoracha go léir le haghaidh seo ag stór github.). Chun é a íoslódáil agus a shuiteáil ní mór duit a dhéanamh:

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

Tar éis seo, ní mór duit WAL-G a chumrú ar dtús, agus ansin PostgreSQL féin.

WAL-G a bhunú

Mar shampla de chúltacaí a stóráil, úsáidfear Amazon S3 (toisc go bhfuil sé níos gaire do mo fhreastalaithe agus tá a úsáid an-saor). Chun oibriú leis, beidh “buicéad s3” agus eochracha rochtana uait.

Bhain gach alt roimhe seo faoi WAL-G úsáid as cumraíocht ag baint úsáide as athróga timpeallachta, ach leis an scaoileadh seo is féidir na socruithe a lonnú ann comhad .walg.json in eolaire baile an úsáideora postgres. Chun é a chruthú, rith an script bash seo 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

Lig dom a mhíniú beagán faoi na paraiméadair go léir:

  • WALG_S3_PREFIX – an cosán chuig do bhuicéad S3 ina n-uaslódálfar cúltacaí (is féidir leat chuig an fhréamh nó chuig fillteán);
  • AWS_ACCESS_KEY_ID – eochair rochtana i S3 (i gcás téarnaimh ar fhreastalaí tástála, caithfidh Beartas ReadOnly a bheith ag na heochracha seo! Déantar cur síos níos mine air seo sa rannán ar aisghabháil.);
  • AWS_SECRET_ACCESS_KEY – eochair rúnda i stóráil S3;
  • WALG_COMPRESSION_METHOD – modh comhbhrú, is fearr Brotli a úsáid (toisc gurb é seo an meán órga idir an méid deiridh agus an luas comhbhrú/dí-chomhbhrú);
  • WALG_DELTA_MAX_STEPS – líon na “deltas” sula gcruthaítear cúltaca iomlán (sábhálann siad am agus méid na sonraí íoslódála, ach féadann siad an próiseas aisghabhála a mhoilliú beagán, mar sin níl sé inmholta luachanna móra a úsáid);
  • PGDATA - cosán chuig an eolaire le do shonraí bunachar sonraí (is féidir leat a fháil amach tríd an ordú a rith pg_lsclóirí);
  • PGHOST – trí nascadh leis an mbunachar sonraí, le cúltaca áitiúil is fearr é a dhéanamh trí shoicéad unix mar atá sa sampla seo.

Is féidir paraiméadair eile a fháil sa doiciméadú: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

Cumrú PostgreSQL

Ionas gur féidir leis an gcartlannóir taobh istigh den bhunachar sonraí logaí WAL a uaslódáil chuig an scamall agus iad a chur ar ais uathu (más gá), ní mór duit roinnt paraiméadair a shocrú sa chomhad cumraíochta /etc/postgresql/12/main/postgresql.conf. Díreach do thosaitheoirí ní mór duit a chinntiúnach bhfuil aon cheann de na socruithe thíos socraithe chuig aon luachanna eile, ionas nach mbeidh an DBMS tuairteála nuair a athlódáiltear an chumraíocht. Is féidir leat na paraiméadair seo a chur leis trí úsáid a bhaint as:

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

Cur síos ar na paraiméadair atá le socrú:

  • wal_leibhéal – cé mhéad faisnéise atá le scríobh i logaí WAL, “macasamhail” – scríobh gach rud;
  • mód_cartlann – íoslódáil logaí WAL a chumasú ag baint úsáide as an ordú ón bparaiméadar ordú_cartlann;
  • ordú_cartlann – ordú chun loga WAL críochnaithe a chur i gcartlann;
  • am istigh cartlainne – ní dhéantar cartlannú na logaí ach amháin nuair a bheidh sé críochnaithe, ach má athraíonn/go gcuireann do fhreastalaí beagán sonraí leis an mbunachar sonraí, is ciall duit teorainn a shocrú anseo i soicindí, agus ina dhiaidh sin glaofar an t-ordú cartlainne go forneartach (Scríobhann mé go dian chuig an mbunachar sonraí gach soicind, agus mar sin chinn mé gan an paraiméadar seo a shocrú i dtáirgeadh);
  • ordú_aisigh – úsáidfear an t-ordú chun an logáil WAL a aischur ó chúltaca mura bhfuil na hathruithe is déanaí sa bhunachar sonraí in easnamh ar an “cúltaca iomlán” (bunchúltaca).

Is féidir leat tuilleadh a léamh faoi na paraiméadair seo go léir san aistriúchán ar an doiciméadú oifigiúil: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

Sceideal cúltaca a shocrú

Cibé rud a déarfadh duine, is é cron an bealach is áisiúla chun é a rith. Is é seo a dhéanfaimid a chumrú chun cúltacaí a chruthú. Tosaímid leis an ordú chun cúltaca iomlán a chruthú: in wal-g is é seo an argóint seolta cúltaca-bhrú. Ach ar dtús, is fearr an t-ordú seo a rith de láimh ón úsáideoir postgres chun a chinntiú go bhfuil gach rud ceart go leor (agus níl aon earráidí rochtana):

#!/bin/bash

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

Léiríonn na hargóintí seolta an cosán chuig an eolaire sonraí - meabhraím duit gur féidir leat é a fháil amach trí rith pg_lsclóirí.

Má chuaigh gach rud gan earráidí agus gur lódaíodh na sonraí isteach i stóras S3, is féidir leat seoladh tréimhsiúil a chumrú i 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

Sa sampla seo, tosaíonn an próiseas cúltaca gach lá ag 4:15 am.

Seanchúltaca a scriosadh

Is dócha, ní gá duit na cúltacaí go léir a choinneáil go hiomlán ón ré Mesozoic, mar sin beidh sé úsáideach do stóráil a “ghlanadh suas” go tréimhsiúil ("cúltaca iomlán" agus logaí WAL araon). Déanfaimid é seo ar fad trí thasc 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

Déanfaidh Cron an tasc seo gach lá ag 6: 30 am, ag scriosadh gach rud (cúltaca iomlána, deltas agus WALs) ach amháin cóipeanna le 10 lá anuas, ach ag fágáil cúltaca amháin ar a laghad. до dáta sonraithe ionas go mbeidh aon phointe tar éis cuireadh dátaí san áireamh i PITR.

Ag athshlánú ó chúltaca

Níl sé ina rún ar bith gurb é an eochair do bhunachar sonraí sláintiúil ná athchóiriú tréimhsiúil agus fíorú sláine na sonraí taobh istigh. Inseoidh mé duit conas téarnamh ag baint úsáide as WAL-G san alt seo, agus labhróimid faoi sheiceálacha níos déanaí.

Ba chóir a thabhairt faoi deara ar leithligh chun athchóiriú a dhéanamh i dtimpeallacht tástála (gach rud nach táirgeadh é) ní mór duit cuntas Inléite Amháin a úsáid in S3 ionas nach scríobhfaidh tú cúltacaí de thaisme. I gcás WAL-G, ní mór duit na cearta seo a leanas a shocrú don úsáideoir S3 i mBeartas Grúpa (Éifeacht: Ceadaigh): s3:GetObject, s3:Buicéad Liosta, s3:GetBucketLocation. Agus, ar ndóigh, ná déan dearmad a shocrú archive_mode= as sa chomhad socruithe postgresql.conf, ionas nach mbeidh do bhunachar sonraí tástála ag iarraidh a bheith cúltaca go ciúin.

Déantar athchóiriú le gluaiseacht beag na láimhe gach sonraí PostgreSQL a scriosadh (úsáideoirí san áireamh), mar sin bí thar a bheith cúramach nuair a ritheann tú na horduithe seo 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

Dóibh siúd ar mian leo an próiseas aisghabhála a sheiceáil, tá píosa beag draíochta bash ullmhaithe thíos, ionas go mbeidh an script tuairteála le cód scoir neamh-nialas i gcás fadhbanna téarnaimh. Sa sampla seo, déantar 120 seiceáil le teorainn ama de 5 soicind (10 nóiméad san iomlán le haisghabháil) chun a fháil amach ar scriosadh an comhad comhartha (ciallóidh sé seo gur éirigh leis an aisghabháil):

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

Tar éis aisghabháil rathúil, ná déan dearmad tús a chur leis na próisis go léir ar ais (pgbouncer/monit, etc.).

Sonraí a sheiceáil tar éis aisghabháil

Tá sé ríthábhachtach sláine an bhunachair shonraí a sheiceáil tar éis athchóiriú a dhéanamh, ionas nach n-eascróidh cás le cúltaca briste/cam. Agus is fearr é seo a dhéanamh le gach cartlann chruthaithe, ach braitheann cén áit agus conas a bhraitheann tú ar do shamhlaíocht amháin (is féidir leat freastalaithe aonair a ardú uair an chloig nó seic a rith in CI). Ach ar a laghad, is gá na sonraí agus na hinnéacsanna sa bhunachar sonraí a sheiceáil.

Chun na sonraí a sheiceáil, is leor iad a rith trí dhumpáil, ach is fearr go mbeidh seiceálacha cumasaithe agus an bunachar sonraí á chruthú agat (seiceálacha sonraí):

#!/bin/bash

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

Chun innéacsanna a sheiceáil - ann modúl amcheck, a ligean ar ghlacadh an cheist sql chun é ó Tástálacha WAL-G agus tóg beagán loighic timpeall 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

Chun achoimre a dhéanamh

Ba mhaith liom mo bhuíochas a chur in iúl do Andrey Borodin as a chuidiú le hullmhú an fhoilseacháin agus buíochas ar leith as an méid a chuir sé le forbairt WAL-G!

Críochnaíonn sé seo an nóta seo. Tá súil agam go raibh mé in ann a chur in iúl chomh héasca agus atá sé an socrú agus an poitéinseal ollmhór a bhaineann leis an uirlis seo a úsáid i do chuideachta. Chuala mé go leor faoi WAL-G, ach ní raibh go leor ama agam suí síos agus é a dhéanamh amach. Agus tar éis dom é a chur i bhfeidhm sa bhaile, tháinig an t-alt seo amach asam.

Ar leithligh, is fiú a thabhairt faoi deara gur féidir le WAL-G oibriú leis na DBMS seo a leanas freisin:

Foinse: will.com

Add a comment