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).
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:
À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:
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.
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:
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).
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:
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: