WAL-G: nga taapiri me te whakaora i te PostgreSQL DBMS

Kua roa e mohiotia ana ko te hanga taapiri ki nga putunga SQL (ma te whakamahi pg_putunga ranei pg_dumpall) ehara i te mea pai. Hei taapiri i te PostgreSQL DBMS, he pai ake te whakamahi i te whakahau pg_basebackup, ka hangaia he kape takirua o nga raarangi WAL. Engari ka timata koe ki te ako i nga mahi katoa o te hanga kape me te whakahoki mai, ka mohio koe me tuhi koe kia rua nga paihikara kia pai ai tenei, kia kaua e mamae koe i runga me raro. Hei whakaiti i te mamae, i whakawhanakehia te WAL-G.

WAL-G he taputapu kua tuhia ki roto i te Haere mo te tautoko me te whakaora i nga papaa raraunga PostgreSQL (a tata ake nei MySQL/MariaDB, MongoDB me FoundationDB). Ka tautokohia te mahi me te rokiroki Amazon S3 (me nga taapiri, hei tauira, Yandex Object Storage), me te Google Cloud Storage, Azure Storage, Swift Object Storage me te punaha konae. Ko te tatūnga katoa ka heke ki nga hikoinga ngawari, engari na te mea kua marara nga tuhinga mo taua mea puta noa i te Ipurangi, karekau he pukapuka-a-ringa katoa ka uru mai nga kaupae katoa mai i te timatanga ki te mutunga (he maha nga panui kei runga i a Habré, engari he maha nga tohu kua ngaro ki reira).

WAL-G: nga taapiri me te whakaora i te PostgreSQL DBMS

I tuhia tenei tuhinga ki te whakariterite i aku mohiotanga. Ehara ahau i te DBA, ka taea e au te whakapuaki i ahau i roto i te reo reimana ki tetahi waahi, no reira e pai ana te whakatika!

Ka wehea, ka kite ahau he mea tika nga mea katoa i raro nei ka whakamatauria mo PostgreSQL 12.3 i runga i te Ubuntu 18.04, me mahi nga whakahau katoa hei kaiwhakamahi whai mana.

tāutanga

I te wa i tuhia ai tenei tuhinga, ko te putanga pumau o WAL-G v0.2.15 (Maehe 2020). Ko tenei ka whakamahia e matou (engari ki te hiahia koe ki te hanga i a koe ake mai i te peka matua, na te whare putunga github nga tohutohu katoa mo tenei). Hei tango me te tāuta me mahi koe:

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

Whai muri i tenei, me whirihora tuatahi koe i te WAL-G, katahi ko PostgreSQL ano.

Te whakatu WAL-G

Hei tauira mo te penapena i nga taapiri, ka whakamahia a Amazon S3 (na te mea he tata atu ki aku kaitoro, he iti rawa te whakamahi). Hei mahi ki a ia, me hiahia koe ki te "peere s3" me nga taviri uru.

Ko nga tuhinga o mua katoa mo WAL-G i whakamahia te whirihoranga ma te whakamahi i nga taurangi taiao, engari ma tenei tukunga ka taea te whakauru i nga tautuhinga ki roto .walg.json kōnae i roto i te raarangi kaainga o te kaiwhakamahi postgres. Hei waihanga, whakahaerehia te tuhinga bash e whai ake nei:

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

Me whakamarama au mo nga tawhā katoa:

  • WALG_S3_PREFIX – te ara ki to peere S3 ka tukuna nga taapiri (ka taea e koe ki te pakiaka, ki te kōpaki ranei);
  • AWS_ACCESS_KEY_ID – kī uru i roto i te S3 (ki te whakaora i runga i te tūmau whakamātautau, me whai kaupapa here PānuiAnake enei ki! Kei te whakaahuahia tenei i roto i te waahanga mo te whakaora.);
  • AWS_SECRET_ACCESS_KEY – kī ngaro i roto i te rokiroki S3;
  • WALG_COMPRESSION_METHOD – tikanga kōpeketanga, he pai ake te whakamahi i te Brotli (i te mea ko te tikanga koura tenei i waenga i te rahinga whakamutunga me te tere o te kopeketanga/decompression);
  • WALG_DELTA_MAX_STEPS - te maha o nga "deltas" i mua i te hanga i te taapiri katoa (ka tiakina e ratou te wa me te rahi o nga raraunga kua tikiakehia, engari ka taea te whakaiti i te tukanga whakaora, na reira kaore i te pai te whakamahi i nga uara nui);
  • PGDATA – ara ki te whaiaronga me o raraunga raraunga (ka kitea e koe ma te whakahaere i te whakahau pg_lsclusters);
  • KAUPAPA – hono ki te pātengi raraunga, ki te tārua rohe he pai ki te mahi i te reira mā te unix-tupapa rite i roto i tenei tauira.

Ka kitea etahi atu tawhā i te tuhinga: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

Te whakatu PostgreSQL

Kia taea ai e te kaipatuhi i roto i te paataka korero te tuku i nga raarangi WAL ki te kapua me te whakahoki mai i a raatau (mena e tika ana), me whakarite e koe etahi tawhā ki te konae whirihoranga. /etc/postgresql/12/main/postgresql.conf. Mo te timatanga noa me tino mohio koekarekau tetahi o nga tautuhinga i raro nei i tautuhia ki etahi atu uara, kia utaina ano te whirihoranga, kaore te DBMS e pakaru. Ka taea e koe te taapiri i enei tawhā ma te whakamahi:

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

Whakaahuatanga o nga tawhā hei tautuhi:

  • taumata_wale – e hia nga korero hei tuhi ki nga raarangi WAL, "whakarite" - tuhia nga mea katoa;
  • pūranga_aratau – taea te tango i nga raarangi WAL ma te whakamahi i te whakahau mai i te tawhā whakahau_pūranga;
  • whakahau_pūranga – he whakahau mo te pupuri i te raarangi WAL kua oti;
  • pūranga_wā – Ko te whakapuranga i nga raarangi ka mahia anake ka oti ana, engari mena ka huri/taapirihia e to kaimau nga raraunga iti ki te paataka raraunga, katahi ka tika ki te whakatakoto tepe i konei i roto i nga hēkona, muri iho ka karangahia te whakahau whakapuranga (Ka tuhi kaha ahau ki te papaaarangi ia rua, no reira ka whakatau ahau kia kaua e whakatakoto i tenei tawhā ki te hanga);
  • whakahau_whakaora – ka whakamahia te whakahau ki te whakahoki mai i te raarangi WAL mai i te taapiri mena ka kore te "puurua katoa" (tuuturu turanga) nga huringa hou i roto i te paataka raraunga.

Ka taea e koe te panui atu mo enei tawhā katoa i te whakamaoritanga o nga tuhinga whaimana: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

Te whakarite i te raarangi taapiri

Ahakoa he aha te korero, ko te huarahi tino watea ki te whakahaere ko te cron. Koinei te mea ka whirihorahia e matou ki te hanga taapiri. Me timata ma te whakahau ki te hanga i te taapiri katoa: i roto i te wal-g koinei te tohenga whakarewatanga pana-rua. Engari ko te tuatahi, he pai ake te whakahaere i tenei whakahau mai i te kaiwhakamahi postgres kia mohio kei te pai nga mea katoa (kaore he hapa uru):

#!/bin/bash

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

Ko nga tautohetohe whakarewatanga e tohu ana i te huarahi ki te raarangi raraunga - Ka whakamahara ahau ka kitea e koe ma te rere pg_lsclusters.

Mena ka haere nga mea katoa kaore he hapa ka utaina nga raraunga ki te rokiroki S3, katahi ka taea e koe te whirihora i te whakarewatanga o ia wa ki 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

I roto i tenei tauira, ka timata te mahi whakaora ia ra i te 4:15 am.

Te whakakore i nga taapiri tawhito

Ko te nuinga, kaore koe e hiahia ki te pupuri i nga taapiri katoa mai i te waa Mesozoic, na reira ka whai hua ki te "horoi" i to rokiroki (e rua nga "purua katoa" me nga raarangi WAL). Ka mahia e matou tenei katoa ma te mahi 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

Ka whakahaeretia e Cron tenei mahi ia ra i te 6:30 am, ka muku i nga mea katoa (nga taapiri katoa, nga tohu me nga WAL) engari he kape mo nga ra 10 kua hipa, engari ka waiho kia kotahi te taapiri. ki te ra i tohua kia taea ai tetahi waahi после i whakauruhia nga ra ki roto i te PITR.

Whakaora mai i te tārua

Ehara i te mea ngaro ko te matua ki te putunga raraunga hauora ko te whakaora i ia wa me te whakamana i te tika o nga raraunga o roto. Ka korerotia e ahau ki a koe me pehea te whakaora ma te whakamahi i te WAL-G i tenei waahanga, a ka korero maatau mo nga arowhai i muri mai.

Me tuhi motuhake e ki te whakaora i roto i te taiao whakamātautau (nga mea katoa e kore e hanga) e hiahia ana koe ki te whakamahi i te Pūkete Pānui Anake i roto i te S3 kia kore ai e tuhirua aitua pūrua. Mo te WAL-G, me whakarite e koe nga motika e whai ake nei mo te kaiwhakamahi S3 i roto i te Kaupapahere Rōpū (Pānga: Tukua): s3:GetObject, s3:Paerangi Rarangi, s3: TikinaBucketLocation. A, o te akoranga, kaua e wareware ki te tautuhi archive_mode=whakaweto i roto i te kōnae tautuhinga postgresql.conf, kia kore ai to papaunga raraunga whakamatautau e pirangi ki te tautoko marie.

Ka mahia te whakaoranga me te paku neke o te ringaringa te whakakore i nga raraunga PostgreSQL katoa (tae atu ki nga kaiwhakamahi), no reira kia tino tupato ki te whakahaere i nga whakahau e whai ake nei.

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

Mo te hunga e hiahia ana ki te tirotiro i te tukanga whakaora, kua whakaritea he waahi iti o te makutu bash i raro nei, na te mea he raruraru ki te whakaora, ka pakaru te tuhinga me te waehere putanga kore-kore. I tenei tauira, 120 nga arowhai ka mahia me te 5 hēkona (he 10 meneti katoa mo te whakaora) kia mohio ai mena kua mukua te konae tohu (ko te tikanga he angitu te whakaora):

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

I muri i te whakaora angitu, kaua e wareware ki te timata i nga tukanga katoa (pgbouncer/monit, etc.).

Te tirotiro i nga raraunga i muri i te whakaora

He mea nui ki te tirotiro i te pono o te paataka raraunga i muri i te whakahokinga mai, kia kore ai e ara ake he ahuatanga kua pakaru/kopikopiko. A he pai ake te mahi ki ia puranga i hangaia, engari kei hea me pehea te whakawhirinaki anake ki to whakaaro (ka taea e koe te whakaara i nga kaitoro takitahi i ia haora, ka whakahaere ranei i te haki i roto i te CI). Engari i te iti rawa, he mea tika ki te tirotiro i nga raraunga me nga tohu i roto i te papaarangi.

Ki te tirotiro i nga raraunga, he nui noa ki te whakahaere i roto i te putunga, engari he pai ake i te wa e hanga ana i te papaunga raraunga ka taea e koe nga arowhai (arowhai raraunga):

#!/bin/bash

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

Для проверки индексов – существует amcheck kōwae, me tango te patai sql mai i Nga whakamatautau WAL-G a ka hanga he whakaaro iti a tawhio noa:

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

Hei whakapoto

E hiahia ana ahau ki te whakapuaki i taku mihi ki a Andrey Borodin mo tana awhina ki te whakarite i te whakaputanga me te mihi motuhake mo tana takoha ki te whanaketanga o WAL-G!

Ka mutu tenei tuhipoka. Te ti'aturi nei au i taea e au te kawe i te ngawari o te tatūnga me te kaha nui mo te whakamahi i tenei taputapu i roto i to kamupene. He maha aku rongo mo te WAL-G, engari karekau he wa ki te noho ki raro ki te whakaaro. A, i muri i taku whakatinanatanga i te kainga, ka puta mai tenei tuhinga i ahau.

Ma te wehe, me mahara ka taea ano e WAL-G te mahi me nga DBMS e whai ake nei:

Source: will.com

Tāpiri i te kōrero