Categories
Database Backup

**

Տվյալների բազայի ադմինիստրատորների (DBA) և DevOps ինժեներների համար, ովքեր կառավարում են PostgreSQL-ը արտադրական միջավայրում, զրոյին մոտ Վերականգնման կետի նպատակին (RPO) հասնելը հիմնական պահանջ է: PostgreSQL-ի աղետներից վերականգնման և ժամանակի որոշակի կետից վերականգնման (PITR) հնարավորությունների հիմքում ընկած է Write-Ahead Logging (WAL) գործառույթը: Մինչ WAL-ը ապահովում է ACID համապատասխանությունը՝ գրանցելով գործարքները նախքան դրանք տվյալների ֆայլերում գրվելը, WAL-ի արխիվացումը այն մեխանիզմն է, որը պահպանում է այդ գրանցամատյանները երկարաժամկետ պահուստավորման և ռեպլիկացիայի համար:

Այնուամենայնիվ, WAL արխիվացման կազմաձևումը «միացրու և մոռացիր» գործողություն չէ: Սխալ կազմաձևումները, աննկատ ձախողումները և ճարտարապետական թյուրիմացությունները կարող են հանգեցնել տվյալների կատաստրոֆիկ կորստի, «split-brain» սցենարների կամ տվյալների բազայի ամբողջական խափանումների:

Այս համապարփակ ուղեցույցում մենք կուսումնասիրենք PostgreSQL WAL արխիվացման ճարտարապետությունը, կբացահայտենք տվյալների կորստի հանգեցնող ամենատարածված թակարդները և կուրվագծենք արտադրական մակարդակի լավագույն փորձը՝ ձեր տվյալների բազայի կայունությունը ապահովելու համար:

Հասկանալով PostgreSQL WAL ճարտարապետությունը

Նախքան թակարդներին անդրադառնալը, կարևոր է հասկանալ, թե ինչպես է PostgreSQL-ը մշակում գործարքների գրանցամատյանները:

PostgreSQL-ը բոլոր փոփոխությունները գրում է WAL սեգմենտներում (կանխադրված՝ 16 ՄԲ ֆայլեր), որոնք գտնվում են pg_wal գրացուցակում (նախկինում՝ pg_xlog, 10-ից ցածր տարբերակներում): Յուրաքանչյուր գործարք գրանցվում է հաջորդաբար՝ նշված Գրանցամատյանի հաջորդականության համարով (LSN):

Երբ WAL սեգմենտը լցվում է, PostgreSQL-ը անցնում է նորին: pg_wal գրացուցակի անվերջ մեծացումը կանխելու համար PostgreSQL-ը վերամշակում կամ հեռացնում է հին WAL սեգմենտները, երբ դրանք այլևս անհրաժեշտ չեն վթարից հետո վերականգնման կամ ռեպլիկացիայի համար:

WAL արխիվացումը ընդհատում է այս վերամշակման գործընթացը: Երբ archive_mode-ը միացված է, PostgreSQL-ը կատարում է օգտագործողի կողմից սահմանված archive_command-ը (կամ օգտագործում է archive_library-ն PostgreSQL 15 և ավելի բարձր տարբերակներում)՝ ավարտված WAL սեգմենտը անվտանգ, երկրորդական վայր պատճենելու համար, նախքան այն ջնջվելը կամ վերագրվելը:

Ժամանակի որոշակի կետից վերականգնում (PITR) կատարելու համար ձեզ անհրաժեշտ է երկու բաղադրիչ՝
1. Վավեր բազային պահուստային պատճեն (base backup):
2. Արխիվացված WAL ֆայլերի անխափան շղթա՝ բազային պահուստային պատճենի ժամանակից մինչև ձեր նպատակային վերականգնման ժամանակը:

Եթե այդ WAL շղթան ընդհատվում է, ձեր PITR-ը ձախողվում է:

WAL արխիվացման կազմաձևումը արտադրական միջավայրի համար

WAL արխիվացումը միացնելու համար դուք պետք է փոփոխեք ձեր postgresql.conf ֆայլը: Հիմնական կազմաձևումը պահանջում է սահմանել wal_level-ը, միացնել archive_mode-ը և սահմանել archive_command-ը:

# postgresql.conf
wal_level = replica             # 'replica' կամ 'logical' անհրաժեշտ է արխիվացման համար
archive_mode = on               # Միացնում է արխիվացման գործընթացը
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # Ստիպողաբար WAL անջատում յուրաքանչյուր 10 րոպեն մեկ

archive_command-ում՝
* %p-ն ներկայացնում է արխիվացվող WAL ֆայլի ամբողջական ուղին:
* %f-ը ներկայացնում է WAL ֆայլի անունը:

Թեև վերոնշյալ կազմաձևումը պարզ է թվում, ձեռնարկատիրական միջավայրերում պարզ shell հրամանների վրա հույս դնելը զգալի ռիսկեր է պարունակում:

WAL արխիվացման ընդհանուր թակարդները

Թակարդ 1. archive_command-ի «Լուռ հաջողությունը»

PostgreSQL-ը լիովին հիմնվում է archive_command-ի ելքային կոդի վրա: Եթե հրամանը վերադարձնում է 0, PostgreSQL-ը ենթադրում է, որ WAL ֆայլը անվտանգ արխիվացված է և անցնում է սկզբնական ֆայլի վերամշակմանը:

Տարածված սխալ է այնպիսի հրամանի օգտագործումը, որը վերադարձնում է 0, նույնիսկ եթե տվյալները անվտանգ չեն գրվել մշտական պահեստում: Օրինակ՝ պարզ cp հրամանը կարող է հաջողություն վերադարձնել հենց որ տվյալները հասնում են նպատակային սերվերի OS էջի քեշին: Եթե նպատակային սերվերը կորցնի հոսանքը նախքան քեշը սկավառակի վրա գրվելը, WAL ֆայլը կկորչի, բայց PostgreSQL-ն արդեն ջնջել է իր տեղական պատճենը:

Ռիսկը. Ընդհատված WAL շղթա և PITR կատարելու անկարողություն, որը հայտնաբերվում է միայն աղետից հետո վերականգնման սցենարի ժամանակ:

Մեղմացումը. Համոզվեք, որ ձեր արխիվացման սկրիպտը պարտադրում է սինխրոն գրառումներ: Եթե օգտագործում եք ստանդարտ shell հրամաններ, օգտագործեք գործիքներ, որոնք երաշխավորում են տվյալների գրառումը, կամ գրեք wrapper սկրիպտ, որը ստուգում է ֆայլի չափը և ստուգաթիվը (checksum) փոխանցումից հետո:

Թակարդ 2. pg_wal բաժանմունքի սպառում (WAL Bloat)

Եթե archive_command-ը ձախողվում է (վերադարձնում է ոչ զրոյական ելքային կոդ)՝ ցանցային խափանումների, սխալ թույլտվությունների կամ նպատակային սկավառակի լցվածության պատճառով, PostgreSQL-ը կպահի WAL ֆայլը pg_wal գրացուցակում և անվերջ կփորձի կրկնել հրամանը:

Թեև սա կանխում է տվյալների կորուստը՝ չջնջելով չարխիվացված WAL-ները, այն ներկայացնում է հասանելիության լուրջ ռիսկ: Եթե pg_wal գրացուցակը գտնվում է մի բաժանմունքում, որը լցվում է 100%-ով, PostgreSQL-ը կթողարկի PANIC և կխափանվի: Տվյալների բազան չի վերագործարկվի, քանի դեռ տարածքը չի ազատվել:

Ռիսկը. Տվյալների բազայի ամբողջական խափանում՝ pg_wal բաժանմունքի լցվածության պատճառով:

Մեղմացումը.
1. Միշտ տեղադրեք pg_wal-ը հատուկ սկավառակի բաժանմունքում:
2. Իրականացրեք pg_wal գրացուցակի չափի ակտիվ մոնիտորինգ:
3. Մոնիտորինգի ենթարկեք pg_stat_archiver տեսքը՝ ձախողված արխիվացման հրամանները անմիջապես հայտնաբերելու համար:

Թակարդ 3. Թերի բազային պահուստային պատճեններ

Բազային պահուստային պատճենը անօգուտ է առանց պահուստավորման գործընթացի ընթացքում ստեղծված WAL ֆայլերի: Եթե դուք կատարում եք ֆայլային համակարգի մակարդակի սնեփշոթ կամ օգտագործում եք pg_basebackup՝ առանց WAL-ների հոսքի (-X stream), դուք պետք է համոզվեք, որ պահուստավորման սկզբի և ավարտի միջև ստեղծված WAL ֆայլերը հաջողությամբ արխիվացվել են:

Եթե ձեր արխիվատորը հետ է մնում կամ ձախողվում է, և այդ հատուկ WAL ֆայլերը կորչում են, բազային պահուստային պատճենը չի կարող բերվել հետևողական վիճակի:

Ռիսկը. Վնասված կամ անվերականգնելի բազային պահուստային պատճեններ:

Մեղմացումը. Օգտագործեք pg_basebackup -X stream՝ անհրաժեշտ WAL ֆայլերը հենց պահուստային պատճենի մեջ ներառելու համար, կամ օգտագործեք ձեռնարկատիրական պահուստավորման լուծումներ, որոնք ավտոմատ կերպով կառավարում են բազային պահուստային պատճենների և WAL սեգմենտների միջև կախվածությունը:

Թակարդ 4. Ժամանակացույցի շփոթություն և «Split-Brain» սցենարներ

Երբ սպասող (standby) սերվերը առաջխաղացվում է որպես հիմնական (primary), PostgreSQL-ը մեծացնում է «Ժամանակացույցի ID»-ն (WAL ֆայլի անվան առաջին մասը, օրինակ՝ 0000000200000001000000A4): Սա կանխում է նոր հիմնական սերվերին հին հիմնական սերվերի WAL պատմությունը վերագրելուց:

Այնուամենայնիվ, եթե հին հիմնական սերվերը պատահաբար գործարկվում է առանց պատշաճ պաշտպանության (split-brain սցենար), այն կարող է փորձել WAL ֆայլեր ուղարկել նույն արխիվային վայր՝ օգտագործելով հին ժամանակացույցը: Եթե ձեր archive_command-ը կույր կերպով վերագրում է ֆայլերը, դուք կարող եք վնասել ձեր արխիվային պահոցը:

Ռիսկը. Վերագրված WAL ֆայլեր, վնասված արխիվներ և անվերականգնելի տվյալների բազաներ:

Մեղմացումը. Ձեր archive_commandերբեք չպետք է վերագրի գոյություն ունեցող ֆայլը: Նկատեք, որ նախորդ պարզ կազմաձևման մեջ մենք օգտագործեցինք test ! -f /mnt/nfs/archive/%f՝ հստակ ձախողելու համար, եթե ֆայլն արդեն գոյություն ունի:

Տվյալների կորստի ռիսկերի մեղմացում. Արտադրական լավագույն փորձ

Ձեր PostgreSQL արխիվացման ռազմավարությունը ամրապնդելու համար իրականացրեք հետևյալ լավագույն փորձը.

1. Մոնիտորինգի ենթարկեք արխիվացման գործընթացը բնիկ եղանակով

PostgreSQL-ը տրամադրում է ներկառուցված pg_stat_archiver տեսքը, որը հետևում է ձեր արխիվացման գործընթացի հաջողությանը և ձախողմանը: Դուք պետք է ինտեգրեք այս տեսքը ձեր դիտարկման համակարգի (observability stack) մեջ (օրինակ՝ Prometheus, Datadog կամ Zabbix):

SELECT 
    archived_count,
    last_archived_wal,
    last_archived_time,
    failed_count,
    last_failed_wal,
    last_failed_time,
    stats_reset
FROM pg_stat_archiver;

Կազմաձևման ենթակա ահազանգման շեմեր.
* Ահազանգեք, եթե failed_count-ը աճում է:
* Ահազանգեք, եթե now()-ի և last_archived_time-ի միջև ժամանակային տարբերությունը գերազանցում է ձեր RPO շեմը (օրինակ՝ 15 րոպե), հաշվի առնելով, որ ցածր երթևեկությամբ տվյալների բազաները կարող են բնականաբար ուշացումներ ունենալ, եթե archive_timeout-ը սահմանված չէ:

2. Օգտագործեք archive_timeout

Ցածր գրառման ծավալ ունեցող տվյալների բազաներում 16 ՄԲ WAL ֆայլը լցվելու համար կարող է ժամեր պահանջվել: Մինչև այն չլցվի, այն չի արխիվացվում: Եթե սերվերը խափանվում է և տեղական սկավառակը կորչում է, դուք կորցնում եք ժամերի գործարքներ:

archive_timeout = 600 (10 րոպե) սահմանելը ստիպում է PostgreSQL-ին անցնել նոր WAL ֆայլի և արխիվացնել ընթացիկը, նույնիսկ եթե այն լրիվ չէ: Սա երաշխավորում է, որ ձեր RPO-ն չի գերազանցում 10 րոպեն՝ մասամբ լցված WAL ֆայլերի պատճառով պահեստային տարածքի մի փոքր ավելի մեծ օգտագործման գնով:

3. Անցում archive_library-ին (PostgreSQL 15+)

Պատմականորեն archive_command-ը յուրաքանչյուր WAL ֆայլի համար ստեղծում էր նոր shell գործընթաց: Բարձր թողունակությամբ միջավայրերում, որոնք րոպեում հարյուրավոր WAL ֆայլեր են ստեղծում, shell գործընթացների ստեղծման ծախսերը դառնում են կատարողականի խոչընդոտ:

PostgreSQL 15-ը ներկայացրեց archive_library պարամետրը, որը թույլ է տալիս WAL արխիվացումը կառավարել դինամիկ բեռնվող C մոդուլների միջոցով: Սա վերացնում է shell-ի ստեղծման ծախսերը և ապահովում է շատ ավելի ամուր, բարձր կատարողականությամբ արխիվացման մեխանիզմ: Եթե դուք օգտագործում եք PostgreSQL 15 կամ ավելի բարձր տարբերակ, փնտրեք պահուստավորման գործիքներ, որոնք աջակցում են հատուկ արխիվային մոդուլներ:

4. Կանոնավոր կերպով փորձարկեք ժամանակի որոշակի կետից վերականգնումը (PITR)

Չփորձարկված պահուստային պատճենը պահուստային պատճեն չէ, այն ցանկություն է: Ձեր WAL արխիվացման ճիշտ աշխատանքը, WAL շղթայի անխափանությունը և բազային պահուստային պատճենների հետևողականությունը ստուգելու միակ միջոցը կանոնավոր, ավտոմատացված PITR թեստեր կատարելն է:

Գործարկեք ժամանակավոր օրինակ, վերականգնեք բազային պահուստային պատճենը, կազմաձևեք restore_command-ը՝ ձեր արխիվից քաշելու համար, և վերականգնեք մինչև որոշակի ժամանակային կետ: Ստուգեք, որ տվյալների բազան հասնում է հետևողական վիճակի և բացվում է կապերի համար:

Ձեռնարկատիրական պահուստավորում և վերականգնում CloudSave-ի հետ

archive_command-ի համար հատուկ shell սկրիպտների կառավարումը, WAL դեդուպլիկացիայի իրականացումը և գործարքների գրանցամատյանների համար անվտանգ, արտաքին պահեստավորման ապահովումը կարող են արագորեն դառնալ ՏՏ թիմերի համար գործառնական բեռ:

Այստեղ է, որ CloudSave-ը զգալի արժեք է տալիս ձեռնարկատիրական PostgreSQL միջավայրերի համար: CloudSave-ը անմիջականորեն ինտեգրվում է PostgreSQL-ի բնիկ պահուստավորման և WAL արխիվացման API-ների հետ՝ վերացնելու վերը նշված ձեռնարկային թակարդները:

Փխրուն bash սկրիպտներ գրելու փոխարեն, CloudSave-ը տրամադրում է ամուր, գործակալի վրա հիմնված կամ առանց գործակալի ինտեգրում, որը՝
* Երաշխավորում է առաքումը. Ստանդարտ shell հրամանները փոխարինում է ստուգված, ստուգաթիվով հաստատված փոխանցումներով դեպի անվտանգ արտաքին կամ ամպային պահեստ:
* Կանխում է WAL Bloat-ը. Ակտիվորեն մոնիտորինգի է ենթարկում pg_wal գրացուցակը և ահազանգում ադմինիստրատորներին բաժանմունքի սպառումից շատ առաջ:
* Ավտոմատացնում է PITR-ը. Պարզեցնում է ժամանակի որոշակի կետից վերականգնումը ինտուիտիվ ինտերֆեյսի միջոցով: Դուք ընտրում եք ճշգրիտ րոպեն, որին ցանկանում եք վերականգնել, և CloudSave-ը ավտոմատ կերպով վերցնում է ճիշտ բազային պահուստային պատճենը և հոսքով ուղարկում է այդ վիճակին հասնելու համար անհրաժեշտ WAL ֆայլերի ճշգրիտ հաջորդականությունը:
* Կառավարում է ժամանակացույցերը. Խելամտորեն կառավարում է PostgreSQL ժամանակացույցի պատմությունները՝ ապահովելով, որ failover-ները և split-brain սցենարները չվնասեն ձեր պահուստային պահոցը:

WAL կառավարման ծանր աշխատանքը CloudSave-ին փոխանցելով՝ DBA-ները կարող են կենտրոնանալ հարցումների օպտիմալացման և տվյալների բազայի կատարողականի վրա՝ իմանալով, որ իրենց RPO և RTO SLA-ները պաշտպանված են ձեռնարկատիրական մակարդակի հարթակով:

Եզրակացություն

PostgreSQL WAL արխիվացումը տվյալների բազայի աղետներից վերականգնման հիմնասյունն է: Թեև ֆայլը մեկ գրացուցակից մյուսը պատճենելու գաղափարը պարզ է թվում, եզրային դեպքերը՝ լուռ ձախողումները, սկավառակի սպառումը և ժամանակացույցի շեղումը, լուրջ ռիսկեր են ստեղծում տվյալների ամբողջականության համար:

Հասկանալով pg_wal-ի ճարտարապետությունը, խստորեն խուսափելով կործանարար archive_command կազմաձևումներից, մոնիտորինգի ենթարկելով pg_stat_archiver-ը և օգտագործելով ձեռնարկատիրական պահուստավորման հարթակներ, ինչպիսին է CloudSave-ը, դուք կարող եք կառուցել կայուն PostgreSQL ենթակառուցվածք, որը կարող է դիմանալ սարքավորումների խափանումներին, մարդկային սխալներին և կատաստրոֆիկ խափանումներին՝ առանց կորցնելու մեկ հաստատված գործարք:

Բացահայտեք PostgreSQL WAL արխիվացման ընդհանուր թակարդները, որոնք հանգեցնում են տվյալների կորստի: Սովորեք DBA-ի լավագույն փորձը, կազմաձևման խորհուրդները և թե ինչպես ապահովել հուսալի ժամանակի որոշակի կետից վերականգնում (PITR) ձեռնարկատիրական տվյալների բազաների համար:

Կարգեր