WAL-G: PostgreSQL DBMS యొక్క బ్యాకప్లు మరియు పునరుద్ధరణ
బ్యాకప్లను SQL డంప్లుగా తయారు చేయడం చాలా కాలంగా తెలుసు (ఉపయోగించడం pg_dump లేదా pg_dumpall) మంచి ఆలోచన కాదు. PostgreSQL DBMS బ్యాకప్ చేయడానికి, ఆదేశాన్ని ఉపయోగించడం మంచిది pg_basebackup, ఇది WAL లాగ్ల బైనరీ కాపీని చేస్తుంది. కానీ మీరు కాపీని సృష్టించడం మరియు పునరుద్ధరించడం యొక్క మొత్తం ప్రక్రియను అధ్యయనం చేయడం ప్రారంభించినప్పుడు, ఇది పని చేయడానికి మీరు కనీసం రెండు ట్రైసైకిళ్లను వ్రాయవలసి ఉంటుందని మరియు పైన మరియు క్రింద నొప్పిని కలిగించకూడదని మీరు అర్థం చేసుకుంటారు. బాధలను తగ్గించడానికి, WAL-G అభివృద్ధి చేయబడింది.
WAL-G PostgreSQL డేటాబేస్లను బ్యాకప్ చేయడానికి మరియు పునరుద్ధరించడానికి గోలో వ్రాసిన సాధనం (మరియు ఇటీవల MySQL/MariaDB, MongoDB మరియు FoundationDB) ఇది Amazon S3 నిల్వతో (మరియు అనలాగ్లు, ఉదాహరణకు, Yandex ఆబ్జెక్ట్ స్టోరేజ్), అలాగే Google క్లౌడ్ స్టోరేజ్, అజూర్ స్టోరేజ్, స్విఫ్ట్ ఆబ్జెక్ట్ స్టోరేజ్ మరియు ఫైల్ సిస్టమ్తో పనిచేయడానికి మద్దతు ఇస్తుంది. మొత్తం సెటప్ సాధారణ దశలకు వస్తుంది, కానీ దాని గురించిన కథనాలు ఇంటర్నెట్లో చెల్లాచెదురుగా ఉన్నందున, ప్రారంభం నుండి ముగింపు వరకు అన్ని దశలను కలిగి ఉండే పూర్తి హౌ-టు మాన్యువల్ లేదు (హబ్రేలో అనేక పోస్ట్లు ఉన్నాయి, కానీ అక్కడ చాలా పాయింట్లు మిస్ అయ్యాయి).
ఈ వ్యాసం ప్రధానంగా నా జ్ఞానాన్ని క్రమబద్ధీకరించడానికి వ్రాయబడింది. నేను DBAని కాదు మరియు నేను ఎక్కడైనా సామాన్యుల భాషలో నన్ను వ్యక్తపరచగలను, కాబట్టి ఏవైనా దిద్దుబాట్లు స్వాగతం!
విడిగా, ఉబుంటు 12.3లో PostgreSQL 18.04 కోసం దిగువన ఉన్న ప్రతిదీ సంబంధితంగా ఉందని మరియు పరీక్షించబడిందని నేను గమనించాను, అన్ని ఆదేశాలను ప్రత్యేక వినియోగదారు వలె అమలు చేయాలి.
సెట్టింగ్
ఈ కథనాన్ని వ్రాసే సమయంలో, WAL-G యొక్క స్థిరమైన వెర్షన్ v0.2.15 (మార్చి 2020). ఇది మేము ఉపయోగిస్తాము (కానీ మీరు మాస్టర్ బ్రాంచ్ నుండి దీన్ని మీరే నిర్మించాలనుకుంటే, గితుబ్ రిపోజిటరీ దీనికి సంబంధించిన అన్ని సూచనలను కలిగి ఉంటుంది) డౌన్లోడ్ చేసి, ఇన్స్టాల్ చేయడానికి మీరు వీటిని చేయాలి:
దీని తర్వాత, మీరు ముందుగా WAL-Gని కాన్ఫిగర్ చేయాలి, ఆపై PostgreSQL కూడా కాన్ఫిగర్ చేయాలి.
WAL-Gని సెటప్ చేస్తోంది
బ్యాకప్లను నిల్వ చేసే ఉదాహరణ కోసం, Amazon S3 ఉపయోగించబడుతుంది (ఎందుకంటే ఇది నా సర్వర్లకు దగ్గరగా ఉంటుంది మరియు దాని ఉపయోగం చాలా చౌకగా ఉంటుంది) దానితో పని చేయడానికి, మీకు "s3 బకెట్" మరియు యాక్సెస్ కీలు అవసరం.
WAL-G గురించి మునుపటి అన్ని కథనాలు ఎన్విరాన్మెంట్ వేరియబుల్స్ ఉపయోగించి కాన్ఫిగరేషన్ను ఉపయోగించాయి, అయితే ఈ విడుదలతో సెట్టింగ్లు ఇక్కడ ఉన్నాయి .walg.json ఫైల్ పోస్ట్గ్రెస్ యూజర్ హోమ్ డైరెక్టరీలో. దీన్ని సృష్టించడానికి, కింది బాష్ స్క్రిప్ట్ని అమలు చేయండి:
WALG_S3_PREFIX - బ్యాకప్లు అప్లోడ్ చేయబడే మీ S3 బకెట్కు మార్గం (మీరు రూట్కి లేదా ఫోల్డర్కి చేయవచ్చు);
AWS_ACCESS_KEY_ID - S3లో యాక్సెస్ కీ (పరీక్ష సర్వర్లో రికవరీ విషయంలో, ఈ కీలు తప్పనిసరిగా చదవడానికి మాత్రమే విధానాన్ని కలిగి ఉండాలి! ఇది రికవరీ విభాగంలో మరింత వివరంగా వివరించబడింది.);
AWS_SECRET_ACCESS_KEY - S3 నిల్వలో రహస్య కీ;
WALG_COMPRESSION_METHOD – కుదింపు పద్ధతి, బ్రోట్లీని ఉపయోగించడం ఉత్తమం (ఇది తుది పరిమాణం మరియు కుదింపు/డికంప్రెషన్ వేగం మధ్య బంగారు సగటు కాబట్టి);
WALG_DELTA_MAX_STEPS - పూర్తి బ్యాకప్ను సృష్టించే ముందు “డెల్టాల” సంఖ్య (అవి డౌన్లోడ్ చేసిన డేటా యొక్క సమయాన్ని మరియు పరిమాణాన్ని ఆదా చేస్తాయి, కానీ రికవరీ ప్రక్రియను కొద్దిగా నెమ్మదిస్తాయి, కాబట్టి పెద్ద విలువలను ఉపయోగించడం మంచిది కాదు);
PGDATA - మీ డేటాబేస్ డేటాతో డైరెక్టరీకి మార్గం (మీరు ఆదేశాన్ని అమలు చేయడం ద్వారా కనుగొనవచ్చు pg_lsclusters);
PGHOST - డేటాబేస్కు కనెక్ట్ చేయడం, స్థానిక బ్యాకప్తో ఈ ఉదాహరణలో యునిక్స్-సాకెట్ ద్వారా దీన్ని చేయడం మంచిది.
డేటాబేస్ లోపల ఉన్న ఆర్కైవర్ క్లౌడ్కు WAL లాగ్లను అప్లోడ్ చేయడానికి మరియు వాటి నుండి వాటిని పునరుద్ధరించడానికి (అవసరమైతే), మీరు కాన్ఫిగరేషన్ ఫైల్లో అనేక పారామితులను సెట్ చేయాలి. /etc/postgresql/12/main/postgresql.conf. కేవలం స్టార్టర్స్ కోసం మీరు నిర్ధారించుకోవాలిదిగువన ఉన్న సెట్టింగ్లు ఏవీ ఇతర విలువలకు సెట్ చేయబడవు, తద్వారా కాన్ఫిగరేషన్ మళ్లీ లోడ్ చేయబడినప్పుడు, DBMS క్రాష్ కాదు. మీరు వీటిని ఉపయోగించి ఈ పారామితులను జోడించవచ్చు:
వాల్_స్థాయి - WAL లాగ్లలో ఎంత సమాచారం వ్రాయాలి, "ప్రతిరూపం" - ప్రతిదీ వ్రాయండి;
ఆర్కైవ్_మోడ్ - పరామితి నుండి ఆదేశాన్ని ఉపయోగించి WAL లాగ్లను డౌన్లోడ్ చేయడాన్ని ప్రారంభించండి ఆర్కైవ్_కమాండ్;
ఆర్కైవ్_కమాండ్ - పూర్తయిన WAL లాగ్ను ఆర్కైవ్ చేయడానికి ఆదేశం;
ఆర్కైవ్_సమయం ముగిసింది - లాగ్లను ఆర్కైవ్ చేయడం పూర్తయినప్పుడు మాత్రమే నిర్వహించబడుతుంది, అయితే మీ సర్వర్ డేటాబేస్కు కొద్దిగా డేటాను మార్చినట్లయితే/జోడిస్తే, సెకన్లలో ఇక్కడ పరిమితిని సెట్ చేయడం అర్ధమే, ఆ తర్వాత ఆర్కైవింగ్ కమాండ్ బలవంతంగా పిలువబడుతుంది (నేను ప్రతి సెకనుకు డేటాబేస్కు తీవ్రంగా వ్రాస్తాను, కాబట్టి నేను ఉత్పత్తిలో ఈ పరామితిని సెట్ చేయకూడదని నిర్ణయించుకున్నాను);
పునరుద్ధరణ_ఆదేశం - “పూర్తి బ్యాకప్” (బేస్ బ్యాకప్) డేటాబేస్లో తాజా మార్పులు లేనట్లయితే బ్యాకప్ నుండి WAL లాగ్ను పునరుద్ధరించే ఆదేశం ఉపయోగించబడుతుంది.
ఒకరు ఏది చెప్పినా, దాన్ని అమలు చేయడానికి అత్యంత అనుకూలమైన మార్గం క్రాన్. బ్యాకప్లను సృష్టించడానికి మేము దీన్ని కాన్ఫిగర్ చేస్తాము. పూర్తి బ్యాకప్ని సృష్టించడానికి ఆదేశంతో ప్రారంభిద్దాం: wal-gలో ఇది లాంచ్ ఆర్గ్యుమెంట్ బ్యాకప్-పుష్. కానీ ముందుగా, ప్రతిదీ బాగానే ఉందని నిర్ధారించుకోవడానికి పోస్ట్గ్రెస్ వినియోగదారు నుండి ఈ ఆదేశాన్ని మాన్యువల్గా అమలు చేయడం మంచిది (మరియు యాక్సెస్ లోపాలు లేవు):
#!/bin/bash
su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'
లాంచ్ ఆర్గ్యుమెంట్లు డేటా డైరెక్టరీకి మార్గాన్ని సూచిస్తాయి - మీరు దీన్ని అమలు చేయడం ద్వారా కనుగొనవచ్చని నేను మీకు గుర్తు చేస్తున్నాను pg_lsclusters.
ప్రతిదీ లోపాలు లేకుండా జరిగితే మరియు డేటా S3 నిల్వలోకి లోడ్ చేయబడి ఉంటే, అప్పుడు మీరు క్రాంటాబ్లో ఆవర్తన ప్రయోగాన్ని కాన్ఫిగర్ చేయవచ్చు:
ఈ ఉదాహరణలో, బ్యాకప్ ప్రక్రియ ప్రతిరోజూ ఉదయం 4:15 గంటలకు ప్రారంభమవుతుంది.
పాత బ్యాకప్లను తొలగిస్తోంది
చాలా మటుకు, మీరు మెసోజోయిక్ యుగం నుండి అన్ని బ్యాకప్లను ఖచ్చితంగా ఉంచాల్సిన అవసరం లేదు, కాబట్టి మీ నిల్వను ("పూర్తి బ్యాకప్లు" మరియు WAL లాగ్లు రెండూ) కాలానుగుణంగా "క్లీన్ అప్" చేయడానికి ఇది ఉపయోగకరంగా ఉంటుంది. మేము క్రాన్ టాస్క్ ద్వారా ఇవన్నీ చేస్తాము:
#!/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 ఈ టాస్క్ని ప్రతిరోజూ ఉదయం 6:30 గంటలకు అమలు చేస్తుంది, గత 10 రోజులుగా కాపీలు మినహా అన్నింటినీ (పూర్తి బ్యాకప్లు, డెల్టాలు మరియు WALలు) తొలగిస్తుంది, కానీ కనీసం ఒక బ్యాకప్ను వదిలివేస్తుంది కు పేర్కొన్న తేదీ కాబట్టి ఏదైనా పాయింట్ после తేదీలు PITRలో చేర్చబడ్డాయి.
బ్యాకప్ నుండి పునరుద్ధరిస్తోంది
ఆరోగ్యకరమైన డేటాబేస్కు కీలకం ఆవర్తన పునరుద్ధరణ మరియు లోపల ఉన్న డేటా యొక్క సమగ్రతను ధృవీకరించడం అనేది రహస్యం కాదు. ఈ విభాగంలో WAL-Gని ఉపయోగించి ఎలా పునరుద్ధరించాలో నేను మీకు చెప్తాను మరియు మేము తర్వాత తనిఖీల గురించి మాట్లాడుతాము.
ఇది విడిగా గమనించదగినది పరీక్ష వాతావరణంలో పునరుద్ధరించడానికి (ఉత్పత్తి కాని ప్రతిదీ) మీరు S3లో చదవడానికి మాత్రమే ఖాతాని ఉపయోగించాలి, తద్వారా అనుకోకుండా బ్యాకప్లను ఓవర్రైట్ చేయకూడదు. WAL-G విషయంలో, మీరు గ్రూప్ పాలసీలో S3 వినియోగదారు కోసం క్రింది హక్కులను సెట్ చేయాలి (ప్రభావం: అనుమతించు): s3:GetObject, s3:ListBucket, s3:GetBucketLocation. మరియు, వాస్తవానికి, సెట్ చేయడం మర్చిపోవద్దు archive_mode=ఆఫ్ సెట్టింగుల ఫైల్లో postgresql.conf, కాబట్టి మీ పరీక్ష డేటాబేస్ నిశ్శబ్దంగా బ్యాకప్ చేయకూడదు.
పునరుద్ధరణ చేతి యొక్క స్వల్ప కదలికతో నిర్వహించబడుతుంది మొత్తం PostgreSQL డేటాను తొలగిస్తోంది (వినియోగదారులతో సహా), కాబట్టి దయచేసి మీరు క్రింది ఆదేశాలను అమలు చేస్తున్నప్పుడు చాలా జాగ్రత్తగా ఉండండి.
#!/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
పునరుద్ధరణ ప్రక్రియను తనిఖీ చేయాలనుకునే వారి కోసం, బాష్ మ్యాజిక్ యొక్క చిన్న భాగం దిగువన సిద్ధం చేయబడింది, తద్వారా రికవరీలో సమస్యలు ఏర్పడితే, స్క్రిప్ట్ సున్నా కాని నిష్క్రమణ కోడ్తో క్రాష్ అవుతుంది. ఈ ఉదాహరణలో, సిగ్నల్ ఫైల్ తొలగించబడిందో లేదో తెలుసుకోవడానికి 120 సెకన్ల సమయం ముగిసింది (రికవరీ కోసం మొత్తం 5 నిమిషాలు) 10 తనిఖీలు చేయబడతాయి (దీని అర్థం రికవరీ విజయవంతమైందని అర్థం):
#!/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
విజయవంతమైన పునరుద్ధరణ తర్వాత, అన్ని ప్రక్రియలను (pgbouncer/monit, మొదలైనవి) తిరిగి ప్రారంభించడం మర్చిపోవద్దు.
రికవరీ తర్వాత డేటాను తనిఖీ చేస్తోంది
పునరుద్ధరణ తర్వాత డేటాబేస్ యొక్క సమగ్రతను తనిఖీ చేయడం అత్యవసరం, తద్వారా విరిగిన / వంకరగా ఉన్న బ్యాకప్తో పరిస్థితి తలెత్తదు. మరియు సృష్టించిన ప్రతి ఆర్కైవ్తో దీన్ని చేయడం మంచిది, కానీ ఎక్కడ మరియు ఎలా మీ ఊహపై మాత్రమే ఆధారపడి ఉంటుంది (మీరు వ్యక్తిగత సర్వర్లను గంటకు పెంచవచ్చు లేదా CIలో తనిఖీని అమలు చేయవచ్చు). కానీ కనిష్టంగా, డేటాబేస్లో డేటా మరియు సూచికలను తనిఖీ చేయడం అవసరం.
డేటాను తనిఖీ చేయడానికి, దానిని డంప్ ద్వారా అమలు చేయడం సరిపోతుంది, అయితే డేటాబేస్ను సృష్టించేటప్పుడు మీరు చెక్సమ్లను ప్రారంభించడం మంచిది (డేటా చెక్సమ్లు):
#!/bin/bash
if ! su - postgres -c 'pg_dumpall > /dev/null'
then
echo 'pg_dumpall failed'
exit 125
fi
సూచికలను తనిఖీ చేయడానికి - ఉనికిలో ఉంది amcheck మాడ్యూల్, దాని కోసం sql ప్రశ్నను తీసుకుందాం WAL-G పరీక్షలు మరియు దాని చుట్టూ ఒక చిన్న తర్కాన్ని నిర్మించండి:
#!/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
సంగ్రహించడం
ప్రచురణను సిద్ధం చేయడంలో ఆండ్రీ బోరోడిన్ చేసిన సహాయానికి నా కృతజ్ఞతలు మరియు WAL-G అభివృద్ధికి ఆయన చేసిన కృషికి ప్రత్యేక ధన్యవాదాలు తెలియజేయాలనుకుంటున్నాను!
ఇది ఈ గమనికను ముగించింది. నేను సెటప్ సౌలభ్యాన్ని మరియు మీ కంపెనీలో ఈ సాధనాన్ని ఉపయోగించగల భారీ సామర్థ్యాన్ని తెలియజేయగలిగానని ఆశిస్తున్నాను. నేను WAL-G గురించి చాలా విన్నాను, కానీ కూర్చుని దాన్ని గుర్తించడానికి తగినంత సమయం ఎప్పుడూ లేదు. మరియు నేను ఇంట్లో అమలు చేసిన తర్వాత, ఈ వ్యాసం నా నుండి వచ్చింది.
విడిగా, WAL-G కింది DBMSతో కూడా పని చేయగలదని గమనించాలి: