رؤى · مقال · الهندسة · مايو 2026
تصميم المنشورات، ومراقبة فتحات التكرار، وتمرين الانتقال، ومسارات التراجع، لترقيات الإصدارات الرئيسية بأقل فترة توقف، بما يتجاوز الترقية الموضعية بالأداة pg_upgrade.
تمثّل ترقية PostgreSQL إلى إصدار رئيسي جديد تحدياً كبيراً للفرق التي راكمت على مدى سنوات أعرافاً في مخططات البيانات، واعتماديات على الإضافات، وافتراضات في التطبيقات مرتبطة بإصدار بعينه. ويتيح التكرار المنطقي مساراً للترحيل التدريجي مع نوافذ انتقال مضبوطة، لكنه يتطلب استعداداً يفوق بكثير تشغيل الأمر pg_upgrade البسيط. فتعريفات المنشورات، ومراقبة فتحات التكرار، وإجراءات الانتقال المجرَّبة مسبقاً، تصبح مكوّنات أساسية في أي خطة ترقية جادة.
تنجح أساليب الترقية التقليدية، مثل الأداة pg_upgrade المدمجة في PostgreSQL، مع قواعد البيانات الصغيرة ذات نوافذ الصيانة القصيرة. غير أن المؤسسات التي تشغّل عناقيد قواعد بيانات بأحجام تبلغ عدة تيرابايتات، أو تلتزم باتفاقيات مستوى الخدمة (SLA) التي تشترط فترة توقف شبه معدومة، كثيراً ما تجد الترقية الموضعية غير كافية. ويتيح التكرار المنطقي تشغيل العنقودين القديم والجديد في آن واحد، فيتمكن الفريق من التحقق من البيئة المستهدفة تحت أحمال حقيقية قبل الالتزام بالتحويل النهائي الذي يمسّ حركة بيئة الإنتاج.
يبدأ التخطيط للترقية قبل التنفيذ بأشهر. فعلى الفرق أن توثّق إصدار PostgreSQL الحالي، وجميع الإضافات المثبّتة، وفئات العوامل المخصصة، وأي خيارات بناء تختلف عن التوزيعات القياسية. وتساعد مصفوفات التوافق بين الإصدار المصدر والإصدار المستهدف على كشف التغييرات التي تكسر التوافق في المصادقة، أو في سلوك مخطِّط الاستعلامات، أو في الإعدادات الافتراضية. ويضمن متتبّع مشترك للمشروع أن تبقى فرق البنية التحتية والتطبيقات والأمن على اتفاق بشأن المحطات الرئيسية والاعتماديات.
يُعدّ حصر الجداول التي تفتقر إلى مفاتيح أساسية خطوة أولى حاسمة، لأن التكرار المنطقي يتطلب معرّفاً فريداً لكل صف لتتبّع التغييرات. وقد تتسبب أعمدة BYTEA الكبيرة وأنواع البيانات غير المألوفة، مثل المصفوفات المركّبة وأنواع النطاقات، في إخفاقات غير متوقعة في التكرار أو اختناقات في الأداء. وتشغيل برنامج تدقيق تمهيدي يرصد أنواع الأعمدة غير المدعومة والقيود الناقصة يوفّر ساعات من تتبّع الأخطاء بعد أن تنشط قنوات التكرار وتبدأ البيانات بالتدفق بين العنقودين.
يحدد تصميم المنشورات بدقة الجداول والعمليات التي يبثّها العنقود المصدر إلى العنقود المستهدف. فالمنشورات الانتقائية التي لا تشمل إلا عمليات INSERT وUPDATE وDELETE لمخططات بيانات محددة تقلّل استهلاك النطاق الترددي وتبسّط حل التعارضات. وعلى الفرق أن تتجنب نشر جداول التجهيز المؤقتة أو سجلات التدقيق كثيرة التغيّر، فهي تضخّم حجم سجل الكتابة المسبقة (WAL) دون أن تضيف حالة ذات قيمة. واختبار مرشّحات النشر في بيئة ما قبل الإنتاج يؤكد أن أي جدول حيوي لم يُستبعد سهواً من مجموعة التكرار.
وفي العنقود المستهدف، تتحكم إعدادات الاشتراك في طريقة وصول البيانات المكرَّرة وتطبيقها. فضبط المعامل synchronous_commit على النحو المناسب، وضبط المعامل max_logical_replication_workers، يمنعان تفاقم التأخر في تطبيق التغييرات خلال ذروة الحركة. ومن الحكمة أيضاً تعطيل المشغّلات وفحوص المفاتيح الأجنبية في العنقود المستهدف خلال المزامنة الأولية، حتى لا يطلق التحميل المجمّع للبيانات سلسلة متتالية من عمليات التحقق من القيود. وإعادة تفعيل هذه الضمانات قبل الانتقال تضمن سلامة البيانات دون التضحية بسرعة المزامنة.

قد تستحوذ مرحلة النسخ الأولي للجداول على معظم وقت الترحيل في مجموعات البيانات الكبيرة. ثم تعالج مرحلة اللحاق كل تغيير وقع في المصدر خلال فترة النسخ. وعلى الفرق أن تنفّذ هاتين المرحلتين تحت أحمال تماثل أحمال الإنتاج، لأن قواعد بيانات الاختبار الهادئة تعطي تقديرات زمنية متفائلة على نحو مضلِّل. فإذا تعذّر على مرحلة اللحاق أن تبلغ التطابق ضمن نافذة الصيانة المخطط لها، فقد يلزم تعديل الجدول الزمني للانتقال بأكمله، أو زيادة عدد العمليات العاملة، أو اتباع نهج يرحّل الجداول على مراحل.
مراقبة تأخر التكرار هي أهم شاغل تشغيلي على الإطلاق خلال نافذة الترحيل. فالاستعلام من العرض pg_stat_replication في المصدر والعرض pg_stat_subscription في الهدف يمنح رؤية في الوقت الفعلي لحجم البيانات المرسلة مقارنة بحجم البيانات المطبّقة. وينبغي ضبط حدود التنبيه بحيث تنطلق التنبيهات قبل وقت كافٍ من بلوغ التأخر مستوى يمدّ نافذة الانتقال إلى ما يتجاوز الحدود المقبولة. ولوحات المعلومات التي تعرض اتجاهات التأخر بمرور الوقت تساعد الفريق على أن يقرر المضي في التحويل أو تأجيله حتى تستقر الظروف.
تختلف أنماط انتقال التطبيقات بحسب مستوى تقبّل المخاطر والبنية. فنافذة الصيانة للقراءة فقط هي أبسط نهج، إذ توقف عمليات الكتابة حتى يطبّق التكرار كل التغييرات المعلّقة ويبلغ التأخر صفراً. أما استراتيجيات الكتابة المزدوجة فترسل التعديلات إلى العنقودين في الوقت نفسه، مع عملية مطابقة ترصد التعارضات وتعالجها بعد وقوعها. ويعتمد التبديل بين بيئتين متطابقتين على تغيير سلسلة الاتصال، فيُعاد توجيه الحركة فوراً عبر تعديل DNS أو مجمّع الاتصالات. ولكل نمط مفاضلات مختلفة في التعقيد واتساق البيانات وسهولة التراجع، لذا على الفرق أن تختار عن قصد وأن توثّق الإجراء المعتمد.
تستحق مطابقة الكتابة المزدوجة عناية خاصة، لأنها تفتح الباب لاختلاف الحالة بين المصدر والهدف. ويمكن لأدوات تقارن الصفوف بالبصمات، مثل pg_comparator، أو استعلامات المجموع الاختباري المخصصة، أن تتحقق من أن العنقودين يحملان بيانات متطابقة بعد انتهاء فترة الكتابة. ويجب حل أي اختلافات قبل إخراج العنقود القديم من الخدمة. وتسجيل كل عملية كتابة إلى العنقودين في سجل لا يقبل إلا الإضافة يبسّط التحليل الجنائي إذا ظهرت حالات عدم اتساق خلال التحقق بعد الترحيل.
كثيراً ما لا تنتقل الإضافات وفهارس البحث عبر قنوات التكرار المنطقي. فيجب إعادة بناء فهارس البحث النصي الكامل القائمة على بنى GiST أو GIN في العنقود المستهدف قبل أن يخدم استعلامات الإنتاج بزمن استجابة مقبول. وقد تتطلب إضافات مثل PostGIS، وpg_trgm، وhstore، إصدارات مكتبات مطابقة على الخادم المستهدف. وعلى الفرق أن تكتب برامج نصية لخطوات إعادة البناء هذه، وأن تقيس زمن تنفيذها تحت الأحمال، وأن تدرجها في قائمة تحقق الانتقال حتى لا يُنسى شيء خلال نافذة ترحيل شديدة الضغط.
وتمثّل قيم التسلسلات وأعمدة الهوية ثغرة أخرى في التكرار كثيراً ما تغفل عنها الفرق حتى لحظة الانتقال. فالتكرار المنطقي لا يبثّ تقدّم التسلسلات، لذا قد تبدأ التسلسلات في العنقود المستهدف من قيم أدنى بكثير من مواضعها الحالية في المصدر. وقبل تحويل حركة التطبيقات، يجب على الفرق أن تضبط يدوياً كل تسلسل على قيمة تتقدم بأمان على آخر موضع معروف في المصدر. وأتمتة هذه الخطوة ببرنامج نصي يقرأ مواضع التسلسلات من العرض pg_sequences في المصدر ويضبط قيمها بدالة ضبط التسلسل في الهدف تقضي على مصدر شائع لتضارب المفاتيح الأساسية.
تحتفظ فتحة التكرار بسجلات WAL في العنقود المصدر، فتحمي من فقدان البيانات إذا تعرّض الهدف لانقطاع أو تأخر عن المصدر. لكن مقاطع WAL المحتفظ بها تستهلك مساحة القرص باستمرار، وقد تملأ فتحة غير مراقَبة وحدة التخزين في المصدر خلال ساعات في أحمال الكتابة الكثيفة. والتنبيه الصارم على تأخر التكرار واستخدام القرص معاً أمر لا مساومة فيه. وعلى الفرق أن تحدد سقفاً أقصى مقبولاً للاحتفاظ بسجل WAL، وأن تضبط تعطيلاً آلياً للفتحة إذا تجاوزته، مفضّلةً إعادة تشغيل مضبوطة للتكرار على انقطاع غير مخطط له في المصدر.

ولا تقتصر إدارة سجل WAL على احتفاظ الفتحات، بل تمتد إلى اعتبارات الأرشفة والنسخ الاحتياطي. فإذا كان العنقود المصدر يعتمد الأرشفة المستمرة للاستعادة إلى نقطة زمنية محددة، فإن سجلات WAL الإضافية التي يولّدها نشاط التكرار ترفع تكاليف تخزين الأرشيف، وقد تؤثر في أزمنة اكتمال النسخ الاحتياطي. والتنسيق مع مواعيد النسخ الاحتياطي يضمن ألا تحرم إحدى العمليتين الأخرى من سعة الإدخال والإخراج في القرص. وتختار بعض الفرق رفع قيمة المعامل wal_keep_size مؤقتاً خلال نافذة الترحيل كشبكة أمان إضافية، ثم تعيد الإعداد إلى قيمته بعد أن يلحق العنقود المستهدف بالمصدر كلياً.
يتطلب الوضع الأمني خلال التكرار عناية دقيقة، لأن البيانات تنتقل بين عنقودين عبر مسار شبكي قد يمر بأجزاء غير موثوقة. فتشفير قناة التكرار ببروتوكول TLS يمنع التنصت على بيانات الصفوف الحساسة أثناء نقلها. وينبغي أن تتبع أدوار التكرار مبدأ الحد الأدنى من الصلاحيات، فلا تُمنح إلا سمة REPLICATION وصلاحية SELECT على الجداول المنشورة. ويضمن تقسيم الشبكة ألا تتحول نسخة متماثلة مخترقة مخصصة للتحليلات، أو بيئة تطوير مخترقة، إلى مسار للتنقل الجانبي نحو البنية التحتية للإنتاج عبر قناة تكرار مفتوحة.
تؤدي إعدادات مجمّع الاتصالات وDNS دوراً مهماً في انتقال سلس. فأدوات مثل PgBouncer أو Pgpool تتيح للفرق إعادة توجيه اتصالات التطبيقات بتحديث هدف واحد في المنبع، بدلاً من إعادة نشر كل خدمة. وتحقق الأساليب القائمة على DNS مع سجلات ذات قيمة TTL منخفضة نتائج مماثلة، لكنها تعتمد على التزام العملاء بقيم TTL، وبعض مكتبات الاتصال تحتفظ بها في الذاكرة المؤقتة بإفراط. واختبار طريقة إعادة التوجيه المختارة تحت أعداد اتصالات واقعية وسيناريوهات تحويل عند التعطل يجنّب المفاجآت حين تبدأ نافذة الانتقال الفعلية.
ينبغي أن يبدأ التحقق بعد الانتقال فور وصول حركة التطبيقات إلى العنقود الجديد. فمقارنة خطط تنفيذ الاستعلامات بين الإصدارين القديم والجديد تكشف تغيّرات في سلوك المحسِّن قد تُضعف أداء أحمال العمل الحرجة. ولسلامة الإحصاءات أهميتها، لأن الجداول المحمَّلة حديثاً قد تفتقر إلى بيانات المدرّجات التكرارية التي يحتاجها المخطِّط لتنفيذ عمليات الربط بكفاءة. وتشغيل الأمر ANALYSE على جميع الجداول ومراجعة مواعيد التنظيف التلقائي يضمنان أن يبلغ العنقود الجديد أداء التشغيل المستقر سريعاً، بدلاً من المرور بفترة إحماء بطيئة.
يوفّر وضع خط أساس للأداء في العنقود الجديد خلال أول 48 ساعة نظام إنذار مبكر لحالات التدهور. اجمع مقاييس تشمل مئينات زمن استجابة الاستعلامات، وإنتاجية المعاملات، ونسب إصابة الفهارس، وتواتر نقاط التحقق. ومقارنة هذه الأرقام بالبيانات التاريخية للعنقود القديم تؤكد أن الترقية حققت التحسينات المتوقعة، أو حافظت على الأداء نفسه في الحد الأدنى. وأي حالات شاذة تُرصد خلال هذه الفترة يسهل التحقيق فيها كثيراً ما دام العنقود القديم متاحاً مرجعاً لمقارنة الخطط والإعدادات.
استراتيجية التراجع الموثّقة ضرورية حتى حين تكون الثقة في الترحيل عالية. فإذا ظهرت مشكلات حرجة في العنقود الجديد بعد الانتقال، احتاجت الفرق إلى مسار مختبَر للعودة إلى الإصدار القديم. والإبقاء على فتحة التكرار في العنقود المصدر نشطة لفترة سماح محددة يتيح المزامنة العكسية عند الحاجة. وبدلاً من ذلك، يحافظ إبقاء العنقود المصدر في وضع الاحتياط للقراءة فقط على خيار العودة السريعة دون الحاجة إلى استعادة البيانات كاملة من النسخ الاحتياطية.
تحوّل أرشفة أدلة التشغيل التفصيلية والبيانات الزمنية من كل عملية ترحيل المعرفة المؤسسية إلى أصل دائم. سجّل مدة كل خطوة، وأي انحرافات عن الخطة، والحل الذي اعتُمد لكل مشكلة غير متوقعة. وتستفيد دورات الترقية المقبلة كثيراً من هذا التوثيق، لأن PostgreSQL يطرح إصداراً رئيسياً جديداً كل عام بوتيرة يمكن التنبؤ بها. والفرق التي تتعامل مع كل ترحيل فرصةً للتعلم تبني خبرة متراكمة، فتقلّل المخاطر والجهد مع كل ترقية لاحقة، بدلاً من أن تكتشف مواطن الألم نفسها مرة بعد أخرى.
نعقد جلسات لمجموعات صغيرة من العملاء والمهتمين دون عروض تقديمية، نركّز فيها على بيئتك التقنية والقيود التي تعمل ضمنها والقرارات التي تنتظرك.