بۆ بەڕێوەبەرانی داتابەیس (DBAs) و ئەندازیارانی DevOps کە PostgreSQL لە ژینگەی بەرهەمهێناندا (production) بەڕێوەدەبەن، گەیشتن بە ئامانجی خاڵی گەڕانەوە (RPO) کە نزیک بێت لە سفر، ئەرکێکی سەرەکییە. لە دڵی تواناکانی گەڕانەوەی کارەسات و گەڕانەوە بۆ کاتێکی دیاریکراو (PITR) لە PostgreSQL، سیستەمی Write-Ahead Logging (WAL) هەیە. لە کاتێکدا WAL دڵنیایی دەدات لە پابەندبوون بە ACID لە ڕێگەی تۆمارکردنی مامەڵەکان پێش ئەوەی بنووسرێنە ناو فایلەکانی داتا، ئەرشیڤکردنی WAL ئەو میکانیزمەیە کە ئەم لۆگانە بۆ پشتیوانی (backup) و دووبارەکردنەوەی درێژخایەن دەپارێزێت.
سەرەڕای ئەوەش، ڕێکخستنی ئەرشیڤکردنی WAL تەنها بریتی نییە لە “دانان و لەبیرکردن”. هەڵە لە ڕێکخستنەکان، شکستی بێدەنگ، و تێنەگەیشتن لە تەلارسازییەکە دەتوانێت ببێتە هۆی لەدەستدانی کارەساتباری داتا، سیناریۆی “split-brain”، یان لەکارکەوتنی تەواوی داتابەیسەکە.
لەو ڕێبەرە تێروتەسەلەدا، ئێمە تەلارسازی ئەرشیڤکردنی WAL لە PostgreSQL دەکۆڵینەوە، باوترين هەڵەکان کە دەبنە هۆی لەدەستدانی داتا دەستنیشان دەکەین، و باشترین پراکتیزە ئاست-بەرهەمهێنەکان دیاری دەکەین بۆ دڵنیابوون لەوەی داتابەیسەکەت بەهێز دەمێنێتەوە.
تێگەیشتن لە تەلارسازی WAL لە PostgreSQL
پێش ئەوەی بچینە ناو هەڵەکان، زۆر گرنگە تێبگەیت کە 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 دەکات.
لە کاتێکدا ڕێکخستنی سەرەوە سادە دیارە، پشت بەستن بە فەرمانی سادەی شێڵ لە ژینگەی کۆمپانیاکاندا مەترسی گەورە دروست دەکات.
هەڵە باوەکان لە ئەرشیڤکردنی WAL
هەڵەی 1: “سەرکەوتنی بێدەنگ”ی archive_command
PostgreSQL بە تەواوی پشت بە کۆدی دەرچوونی archive_command دەبەستێت. ئەگەر فەرمانەکە 0 بگەڕێنێتەوە، PostgreSQL وادادەنێت کە فایلی WAL بە سەلامەتی ئەرشیڤ کراوە و دەست دەکات بە دووبارە بەکارهێنانەوەی فایلە ڕەسەنەکە.
هەڵەیەکی باو بەکارهێنانی فەرمانێکە کە 0 دەگەڕێنێتەوە تەنانەت ئەگەر داتاکە بە سەلامەتی نەگوازرابێتەوە بۆ کۆگای هەمیشەیی. بۆ نموونە، فەرمانێکی سادەی cp ڕەنگە دەستبەجێ سەرکەوتن ڕابگەیەنێت کاتێک داتاکە دەگاتە cacheی OS لە سێرڤەری مەبەستدا. ئەگەر سێرڤەری مەبەست کارەبای ببڕێت پێش ئەوەی cacheەکە بنووسرێتە سەر دیسک، فایلی WAL لەدەست دەچێت، بەڵام PostgreSQL کۆپییە ناوخۆییەکەی خۆی سڕیوەتەوە.
مەترسییەکە: پچڕانی زنجیرەی WAL و نەتوانینی ئەنجامدانی PITR، کە تەنها لە کاتی کارەساتدا دەردەکەوێت.
چارەسەر: دڵنیابە کە سکریپتی ئەرشیڤکردنەکەت نووسینی هاوکات (synchronous) جێبەجێ دەکات. ئەگەر فەرمانی سادەی شێڵ بەکاردەهێنیت، ئەو ئامانجانە بەکاربهێنە کە دڵنیایی دەدەن لەوەی داتا دەنووسرێت، یان سکریپتێکی وەرگێڕ (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: پشتیوانییە بنەڕەتییە ناتەواوەکان
پشتیوانییەکی بنەڕەتی (base backup) بێ سوودە بەبێ فایلەکانی WAL کە لە کاتی پرۆسەی پشتیوانییەکەدا دروست دەبن. ئەگەر وێنەیەکی ساتی (snapshot) لە ئاستی فایلسیستەم بگریت یان pg_basebackup بەکاربهێنیت بەبێ پەخشکردنی WALەکان (-X stream)، دەبێت دڵنیابیت کە فایلەکانی WAL کە لە نێوان دەستپێک و کۆتایی پشتیوانییەکەدا دروست دەبن بە سەرکەوتوویی ئەرشیڤ دەکرێن.
ئەگەر ئەرشیڤکەرەکەت دواکەوتووە یان شکست دەهێنێت، و ئەو فایلە دیاریکراوانەی WAL لەدەست دەچن، پشتیوانییە بنەڕەتییەکە ناتوانرێت بگەیەنرێتە دۆخێکی یەکگرتوو.
مەترسییەکە: پشتیوانییە بنەڕەتییە تێکچوو یان نەگەڕێنراوەکان.
چارەسەر: pg_basebackup -X stream بەکاربهێنە بۆ ئەوەی فایلە پێویستەکانی WAL لەناو خودی پشتیوانییەکەدا هەبن، یان چارەسەرە پیشەییەکانی پشتیوانی بەکاربهێنە کە بە شێوەیەکی ئۆتۆماتیکی پەیوەندی نێوان پشتیوانییە بنەڕەتییەکان و بەشەکانی WAL بەڕێوەدەبەن.
هەڵەی 4: تێکەڵبوونی کاتژمێر (Timeline) و سیناریۆکانی Split-Brain
کاتێک سێرڤەرێکی لاوەکی (standby) دەکرێت بە سەرەکی، PostgreSQL “ناسنامەی کاتژمێر” (Timeline ID) زیاد دەکات (بەشی یەکەمی ناوی فایلی WAL، بۆ نموونە 0000000200000001000000A4). ئەمە ڕێگری دەکات لەوەی سەرەکییە نوێیەکە مێژووی WALی سەرەکییە کۆنەکە بسڕێتەوە.
بەڵام، ئەگەر سەرەکییە کۆنەکە بە هەڵە دەست پێ بکاتەوە بەبێ ئەوەی بە دروستی دابڕێنرابێت (سیناریۆی split-brain)، ڕەنگە هەوڵ بدات فایلەکانی WAL بنێرێت بۆ هەمان شوێنی ئەرشیڤ بە بەکارهێنانی کاتژمێرە کۆنەکە. ئەگەر archive_commandەکەت بە کوێرانە فایلەکان بەسەریدا بنووسێتەوە، ڕەنگە کۆگای ئەرشیڤەکەت تێک بدەیت.
مەترسییەکە: فایلەکانی WALی بەسەریدا نووسراو، ئەرشیڤی تێکچوو، و داتابەیسی نەگەڕێنراوە.
چارەسەر: archive_commandەکەت نابێت هەرگیز فایلێکی هەبوو بەسەریدا بنووسێتەوە. تێبینی بکە لە ڕێکخستنە بنەڕەتییەکەی پێشوو، ئێمە test ! -f /mnt/nfs/archive/%fمان بەکارهێنا بۆ ئەوەی بە ڕوونی شکست بهێنین ئەگەر فایلەکە پێشتر هەبوو.
کەمکردنەوەی مەترسییەکانی لەدەستدانی داتا: باشترین پراکتیزەکانی بەرهەمهێنان
بۆ بەهێزکردنی ستراتیژی ئەرشیڤکردنی PostgreSQLەکەت، ئەم باشترین پراکتیزانە جێبەجێ بکە.
1. چاودێریکردنی پرۆسەی ئەرشیڤکەر بە شێوەی سروشتی
PostgreSQL ڕوکارێکی ناوخۆیی دابین دەکات، pg_stat_archiver، کە سەرکەوتن و شکستی پرۆسەی ئەرشیڤکردنەکەت تۆمار دەکات. دەبێت ئەم ڕوکارە لەناو سیستەمی چاودێریکردنتدا (وەک 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
لە داتابەیسەکاندا کە قەبارەی نووسینیان کەمە، فایلی WALی 16 مێگابایتی ڕەنگە کاتژمێرێکی پێ بچێت تا پڕ دەبێت. تا پڕ نەبێت، ئەرشیڤ ناکرێت. ئەگەر سێرڤەرەکە لەکار بکەوێت و دیسکە ناوخۆییەکە لەدەست بچێت، تۆ کاتژمێرێک لە مامەڵەکان لەدەست دەدەیت.
دانانی archive_timeout = 600 (10 خولەک) PostgreSQL ناچار دەکات بگۆڕێت بۆ فایلی WALی نوێ و ئەوەی ئێستا ئەرشیڤ بکات، تەنانەت ئەگەر پڕیش نەبێت. ئەمە دڵنیایی دەدات کە RPOەکەت لە 10 خولەک زیاتر نابێت، بە نرخی بەکارهێنانی کەمێک زیاتری کۆگا بەهۆی فایلەکانی WALی بەشەکی پڕکراو.
3. گواستنەوە بۆ archive_library (PostgreSQL 15+)
لە ڕابردوودا، archive_command پرۆسەیەکی نوێی شێڵی بۆ هەر فایلێکی WAL دەکردەوە. لە ژینگەی خێرایی-بەرزدا کە سەدان فایلی WAL لە خولەکێکدا دروست دەکەن، باری زیادەی کردنەوەی پرۆسەکانی شێڵ دەبێتە بەربەست بۆ کارایی.
PostgreSQL 15 پارامەتری archive_libraryی ناساند، کە ڕێگە دەدات ئەرشیڤکردنی WAL لەلایەن مۆدیولەکانی C کە بە شێوەی داینامیکی بارکراون بەڕێوەببرێت. ئەمە باری زیادەی شێڵ-کردنەوە لادەبات و میکانیزمێکی ئەرشیڤکردنی زۆر بەهێزتر و خێراتر دابین دەکات. ئەگەر لەسەر PostgreSQL 15 یان بەرەوژووریت، بەدوای ئامرازەکانی پشتیوانی بگەڕێ کە پشتگیری لە مۆدیولەکانی ئەرشیڤی تایبەت دەکەن.
4. بەردەوام تاقیکردنەوەی گەڕانەوە بۆ کاتێکی دیاریکراو (PITR)
پشتیوانییەک کە تاقی نەکرابێتەوە پشتیوانی نییە؛ ئاواتێکە. تاکە ڕێگە بۆ پشتڕاستکردنەوەی ئەوەی ئەرشیڤکردنی WALەکەت بە دروستی کار دەکات، زنجیرەی WALەکەت نەپچڕاوە، و پشتیوانییە بنەڕەتییەکانت یەکگرتوون، ئەنجامدانی تاقیکردنەوەی خولی و ئۆتۆماتیکی PITRە.
نموونەیەکی کاتی دابمەزرێنە، پشتیوانییە بنەڕەتییەکە بگەڕێنەوە، restore_command ڕێکبخە بۆ ڕاکێشانی داتا لە ئەرشیڤەکەتەوە، و بگەڕێوە بۆ کاتێکی دیاریکراو. دڵنیابە کە داتابەیسەکە دەگاتە دۆخێکی یەکگرتوو و بۆ پەیوەندییەکان دەکرێتەوە.
پشتیوانی و گەڕانەوەی پیشەیی لەگەڵ CloudSave
بەڕێوەبردنی سکریپتی شێڵی تایبەت بۆ archive_command، مامەڵەکردن لەگەڵ دووبارە نەبوونەوەی WAL (deduplication)، و دڵنیابوون لە کۆگای پارێزراو و دەرەکی بۆ لۆگی مامەڵەکان دەتوانێت بە خێرایی ببێتە بارێکی کارگێڕی بۆ تیمەکانی IT.
ئەمە ئەو شوێنەیە کە CloudSave بەهایەکی گەورە بۆ ژینگەکانی PostgreSQLی کۆمپانیاکان دابین دەکات. CloudSave ڕاستەوخۆ لەگەڵ APIیەکانی پشتیوانی و ئەرشیڤکردنی WALی PostgreSQL تێکەڵ دەبێت بۆ لابردنی هەڵە دەستییەکانی سەرەوە.
لە جیاتی نووسینی سکریپتی لاوازی bash، CloudSave تێکەڵکردنێکی بەهێز و پشت بەستوو بە ئامراز (agent-based) یان بێ ئامراز دابین دەکات کە:
* دڵنیایی گەیاندن: فەرمانە ستانداردەکانی شێڵ دەگۆڕێت بە گواستنەوەی پشتڕاستکراو و checksum-validated بۆ کۆگای پارێزراوی دەرەکی یان هەوری.
* ڕێگری لە WAL Bloat: بە چالاکی چاودێری بوخچەی pg_wal دەکات و بەڕێوەبەران ئاگادار دەکاتەوە زۆر پێش ئەوەی پارتیشنەکە پڕ ببێت.
* ئۆتۆماتیککردنی PITR: گەڕانەوە بۆ کاتێکی دیاریکراو ئاسان دەکات لە ڕێگەی ڕوکارێکی ئاسانەوە. تۆ ئەو خولەکەی دەتەوێت بۆی بگەڕێیتەوە دیاری دەکەیت، و CloudSave بە شێوەیەکی ئۆتۆماتیکی پشتیوانییە بنەڕەتییە دروستەکە دەهێنێت و زنجیرەی وردی فایلەکانی WAL کە پێویستن بۆ گەیشتن بەو دۆخە پەخش دەکات.
* بەڕێوەبردنی کاتژمێرەکان: بە زیرەکی مێژووی کاتژمێرەکانی PostgreSQL بەڕێوەدەبات، دڵنیایی دەدات کە failover و سیناریۆکانی split-brain کۆگای پشتیوانییەکەت تێک نادەن.
بە سپاردنی ئەرکە قورسەکانی بەڕێوەبردنی WAL بە CloudSave، بەڕێوەبەرانی داتابەیس دەتوانن سەرنجیان لەسەر باشترکردنی پرسیارەکان (query optimization) و کارایی داتابەیس بێت، بەو زانینەی کە SLAی RPO و RTOەکەیان لەلایەن پلاتفۆرمێکی ئاست-پیشەییەوە پارێزراوە.
کۆتایی
ئەرشیڤکردنی WAL لە PostgreSQL بڕبڕەی پشتی گەڕانەوەی کارەساتی داتابەیسە. لە کاتێکدا چەمکی کۆپیکردنی فایلێک لە بوخچەیەکەوە بۆ یەکێکی تر سادە دیارە، حاڵەتە دەگمەنەکان—شکستی بێدەنگ، تەواوبوونی دیسک، و لادانی کاتژمێر—مەترسی گەورە بۆ سەر یەکگرتوویی داتا دروست دەکەن.
بە تێگەیشتن لە تەلارسازی pg_wal، بە توندی خۆلادان لە ڕێکخستنی وێرانکەری archive_command، چاودێریکردنی pg_stat_archiver، و بەکارهێنانی پلاتفۆرمەکانی پشتیوانی پیشەیی وەک CloudSave، دەتوانیت ژێرخانێکی بەهێزی PostgreSQL دروست بکەیت کە توانای بەرگەگرتنی شکستی ڕەقەکاڵا، هەڵەی مرۆیی، و لەکارکەوتنی کارەساتباری هەبێت بەبێ لەدەستدانی تەنانەت یەک مامەڵەی پەسەندکراو.
هەڵە باوەکانی ئەرشیڤکردنی WAL لە PostgreSQL بدۆزەرەوە کە دەبنە هۆی لەدەستدانی داتا. فێری باشترین پراکتیزەکانی DBA، ئامۆژگارییەکانی ڕێکخستن، و چۆنیەتی دڵنیابوون لە گەڕانەوەی متمانەپێکراو بۆ کاتێکی دیاریکراو (PITR) بۆ داتابەیسەکانی کۆمپانیاکان ببە.