نص فك التشفير المنطقي من مرحلتين الالتزام في PostgreSQL 14

التحديث: 2 يوليو 2023

نص فك التشفير المنطقي من مرحلتين الالتزام في PostgreSQL 14

تعاون فريق Fujitsu OSS ومجتمع PostgreSQL مفتوح المصدر لإضافة وظيفة فك تشفير الالتزام ذي المرحلتين في النسخ المتماثل المنطقي في PG14. دعونا نلقي نظرة على ما هي هذه الميزة؟

خلفية

الالتزام على مرحلتين هو آلية يتم فيها تنفيذ المعاملات على مرحلتين. تستخدم عادة في قواعد البيانات الموزعة لضمان الاتساق. مرحلتي المعاملة هما مرحلة الإعداد ومرحلة الالتزام/التراجع. الأوامر المقدمة على مرحلتين في PG هي:

تحضير المعاملة

تم إعداد الالتزام

رول باك مُعد

يدعم PG بالفعل الالتزام على مرحلتين في الإصدار 8.0، ويدعم الإصدار 10.0 النسخ المتماثل المنطقي. ومع ذلك، لم يتم دعم الالتزام على مرحلتين في النسخ المتماثل المنطقي. تم دعم أوامر إعداد المعاملة، والالتزام بالإعداد، والإعداد للرجوع في مثيل واحد، ولكن عندما يلزم نسخ هذه الأوامر بشكل منطقي إلى الجهاز الاحتياطي، فإنها لم تعد تحتفظ بالمعنى الأصلي. يتم التعامل مع الأمر PREPARE TRANSACTION على أنه NOP ولا يتم فك تشفيره على الإطلاق. يعتبر الأمر COMMIT PREPARED بمثابة COMMIT، ويعتبر الأمر ROLLBACK PREPARED بمثابة إحباط.

ما هو الالتزام على مرحلتين

الالتزام على مرحلتين هو بروتوكول الالتزام الذري الذي يساعد في الحفاظ على الاتساق بين قواعد البيانات الموزعة. الالتزامات العادية التي توفر الذرية داخل قاعدة البيانات ليست كافية لتوفير الاتساق للمعاملات عبر قاعدة البيانات. لتوضيح هذه المشكلة ، دعنا نعطي مثالاً:

1) يمتلك جون 300 دولار في البنك أ

2) علامة 100 في البنك "ب"

3) يريد جون تحويل 100 دولار إلى مارك

أثناء المعاملة ، تحتاج إلى سحب 100 دولار من البنك "أ" إلى البنك "ب". في نهاية المعاملة ، يجب أن يكون هناك 200 دولار. إذا فشلت أي معاملة في أي وقت أثناء عملية التحويل ، فيجب إعادة حالة الحساب إلى الحالة التي كانت عليها قبل بدء التحويل. قد تفشل الصفقة لأسباب مختلفة. في حالة حدوث أي انقطاع قبل تنفيذ المعاملة ، سيتم التراجع عن المعاملة. في مثالنا ، إذا حدثت مقاطعة عند خصم حساب John ، فلا ينبغي تقليل حساب John عن منفذ الانقطاع. هذه هي الطريقة التي يحافظ بها الالتزام البسيط على الاتساق داخل قاعدة البيانات.

لكننا نعتبر مثل هذا الموقف، أي أن المعاملة التي تخصم 100 دولار من حساب جون تكون ناجحة في إرسال واحد، لكن المعاملة التي تضيف 100 دولار إلى حساب مارك في البنك "ب" تفشل ويتم التراجع عنها. وبعد انتهاء هذه العملية، وعلى الرغم من خصم المبلغ من حساب جون، إلا أن مارك لن يحصل على المبلغ. 100 دولار اختفت عند التعامل مع المعاملات الموزعة، قد يفشل الالتزام البسيط.

تنفيذ خطوة بخطوة للمعاملات الموزعة

بالنسبة للالتزام على مرحلتين ، تعمل إحدى قواعد البيانات كمنسق للمعاملات الموزعة.

المرحلة 1

تبدأ قاعدة البيانات في تطبيق المعاملات، ومن ثم الاستعداد. يرسل المعاملات المعدة إلى قواعد البيانات الأخرى في شكل رسائل إعداد. تحصل قاعدة البيانات الثانية على رسالة التحضير، ثم تقوم بتحضير المعاملة. يتضمن الإعداد تغييرات في المعاملة، لكنه لا يلتزم بها. تتم كتابة البيانات القذرة على القرص من أجل الثبات. بمجرد أن تقوم جميع قواعد البيانات بإعداد المعاملة، ويتم تخزين كافة المعلومات المتعلقة بالمعاملة على القرص، تكون مرحلة الإعداد قد اكتملت.

المرحلة 2

بعد ذلك ، يبدأ الحكم مرحلة الالتزام. إذا فشلت قاعدة البيانات الثانية في تجهيز المعاملة لسبب ما ، يبدأ الحكم في مرحلة التراجع. لذلك ، اعتمادًا على ما إذا كان التحضير ناجحًا ، يتم الالتزام أو التراجع عن المعاملة. يمكن استرداد الانقطاع في مرحلة الالتزام النهائي ، لأنه تمت كتابة معاملة التحضير المطلوبة على القرص ويمكن إعادة تطبيقها.

الالتزام على مرحلتين غير مرتبط بقواعد بيانات المثيل الفردي ، ولكنه يكون ذا صلة عند نسخ البيانات عبر مثيلات قاعدة بيانات متعددة.

من المهم جدًا دعم الالتزام ذي المرحلتين في النسخ المتماثل المنطقي.

نظرة عامة وظيفية

قبل إصدار PG14 ، تم فك تشفير معاملات النسخ المنطقي وتكرارها فقط بعد تنفيذ المعاملة. هذا لتجنب أنه قد يتم أخيرًا إحباط معاملة النسخ المتماثل.

فك شفرة المعاملة عند الالتزام

النسخ المتماثل المنطقي لـ PG14 يدعم أوامر PREPARE TRANSACTION و COMMIT PREPARED و ROOLBACK PREPARED. عندما يتم فك تشفير الأمر PREPARE TRANSACTION، يتم فك تشفير المعاملة ونسخها. يبدأ إعداد المعاملة في إعادة تشغيل المعاملة وفك تشفيرها تمامًا مثل الالتزام في WAL SENDER.

فك تشفير المعاملة أثناء التحضير

لقد حددنا أيضًا رد اتصال مكون إضافي جديد للسماح للوظائف الإضافية لفك التشفير المنطقي بدعم التقديم على مرحلتين.

رد الاتصال

وصف

عامل التصفية

اسمح للمكوِّن الإضافي بتصفية المعاملات التي لا تحتاج إلى فك تشفيرها عند التحضير وفقًا لمعرف GID المستخدم في أمر PREPARE TRANSACTION

start_preparecb

بدء معاملة التحضير

الاستعداد_cb

يتم استدعاؤها عند فك تشفير أمر PREPARE TRANSACTION

الالتزام "على استعداد"

يتم استدعاؤه عند فك تشفير الأمر COMMIT PREPARED

التراجع_ الاستعداد_ cb

يتم استدعاؤه عند فك تشفير أمر ROLLBACK PREPARED

تعديل المكونات في

اختبار ، فك التشفير

المكون الإضافي عبارة عن مكون إضافي لإخراج فك التشفير المنطقي، كمثال لمساعدة المستخدمين على تطوير المكون الإضافي الخاص بهم لفك التشفير. يستقبل test_decoding WAL من خلال آلية فك تشفير منطقية ويفك تشفيرها إلى تمثيل نصي للعملية المنجزة.

تم تعديله ليكون قادرًا على استخدام وظيفة رد الاتصال الجديدة على مرحلتين وفك تشفير المعاملة أثناء التحضير

تعديل واجهات برمجة التطبيقات

pg_ إنشاء_ النسخ المتماثل المنطقي

تضيف واجهة برمجة التطبيقات خيارًا جديدًا لتحديد ما إذا كانت الفتحة تدعم الالتزام على مرحلتين. يمكن أن يستخدم المكون الإضافي الناتج فتحة نسخ مع خيار مرحلتين لدعم الالتزام على مرحلتين.

pg_create_ المنطقي_ النسخ المتماثل_الفتحة (الفتحة_ اسم الاسم , اسم البرنامج المساعد [, منطقية مؤقتة , منطقية ثنائية الطور])

دراسة حالة

دعونا نرى كيفية الكشف عن الإخراج الذي تم فك تشفيره لمعاملة الالتزام ذات المرحلتين:

1) إنشاء فتحة النسخ المتماثل

استخدم test_decoding باعتباره المكون الإضافي للمخرجات ، وقم بالتمرير إلى true بحيث تدعم الفتحة التقديم على مرحلتين وفك التشفير.

postgres = # حدد * من الصفحة إنشاء منطقي نسخ متماثل فتحة انحدار فتحة ',' اختبار فك تشفير ', خطأ , صحيح) ;

slot_name | lsn

----------------- + -----------

فتحة الانحدار | 0 16B1970

(صف واحد)

2) قم بإنشاء جدول

postgres = # إنشاء بيانات الجدول (معرف المفتاح الأساسي التسلسلي , نص البيانات) ;

إنشاء الجدول

3) الكشف عن محتوى المخرجات التي تم فك تشفيرها لعملية تجهيز وتنفيذ المعاملة

بوستجرس = # ابدأ

postgres = * # أدخل البيانات (البيانات) القيم ('5') ;

postgres = * # تحضير المعاملات 'اختبار مستعد 1' ;

postgres = # حدد * من pg_logical_slot_get_changes ('regression_slot' , NULL , NULL) ;

lsn | xid | البيانات

----------- + ----- + -----------------

0 / 1689DC0 | 529 البداية 529

0 / 1689DC0 | 529 | جدول عام. بيانات : إدراج : معرف [عدد صحيح] : 3 بيانات [نص] : '5'

0 / 1689FC0 | 529 | تحضير معاملة 'اختبار معد 1' , txid 529

(صفين

postgres تنفيذ الاستعداد 'اختبار مستعد 1' ;

postgres = # حدد * من pg_logical_slotget_changes ('regression_slot' , NULL , NULL) ;

lsn | xid | البيانات

----------- + ----- + ------------------

0 / 168A060 | 529 ارتكاب الاستعداد 'الاختبار مستعد 1' , txid 529

(صفين

postgres = # حدد * من البيانات ;

معرف | البيانات

---- + ------

1 | 5

(صف واحد)

مستقبل

يحتوي تغيير PG14 على هذه الوظيفة على بنية تحتية من جانب وحدة فك التشفير تسمح بتقديم مرحلتين من فك التشفير أثناء التحضير. قمنا أيضًا بتعديل المكون الإضافي test_decoding للاستفادة من هذه البنية التحتية.

تتمثل الخطوة التالية في تنفيذ الدعم المكون من مرحلتين لأكبر مكون إضافي لفك التشفير المنطقي في PG-the pgoutput plug-in. يدعم هذا المكون الإضافي وضع الناشر / المشترك للنسخ المتماثل المنطقي. وهو البرنامج الإضافي الأكثر استخدامًا في النسخ المنطقي. يعمل فريق Fujitsu OSS مع مجتمع المصادر المفتوحة لإضافة هذه الميزة إلى PG15.

بالنسبة للمعاملة ذات المرحلتين في قاعدة البيانات الموزعة ، يحتاج PG أيضًا إلى الدعم: يُعلم الجهاز البديل المضيف أن PREPARE قد فشل ويبدأ التراجع. آلية التعليقات هذه غير مدعومة في PG وهي أحد الاتجاهات للتحسين المستقبلي.

  الروابط:

6 ميغا بايت 25 لتر -120

rm500uz-2h