كيف تمنع الالتزامات ثنائية الطور الفشل الأخير؟

StackOverflow https://stackoverflow.com/questions/171876

  •  05-07-2019
  •  | 
  •  

سؤال

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

ما الذي يمنع الفشل التالي؟

  1. تستجيب جميع العقد بأنها مستعدة للالتزام
  2. يخبرهم منسق المعاملات "المضي قدمًا والالتزام" ولكن أحد العقد يتعطل قبل تلقي هذه الرسالة
  3. جميع العقد الأخرى تلتزم بنجاح ، ولكن الآن المعاملة الموزعة تالف
  4. أفهم أنه عندما تعود العقدة المحطمة ، سيتم ترحيل معاملتها (لأنها لم تحصل على رسالة الالتزام أبدًا)

أفترض أن كل عقدة تقوم بتشغيل قاعدة بيانات عادية لا تعرف أي شيء عن المعاملات الموزعة. ماذا افتقد؟

هل كانت مفيدة؟

المحلول 2

تلخيص إجابات الجميع:

  1. لا يمكن للمرء استخدام قواعد البيانات العادية مع المعاملات الموزعة. يجب أن تدعم قاعدة البيانات صراحة منسق المعاملات.

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

نصائح أخرى

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

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

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

تحدث المشكلات فقط إذا لم تعود العقدة المحطمة أبدًا (ثم يعتقد كل شيء آخر أن المعاملة كانت على ما يرام ، أو ستكون عندما تعود العقدة المحطمة).

التزام مرحلتين ليس مضمونًا وهو مصمم فقط للعمل في 99 ٪ من الحالات الزمنية.

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

http://en.wikipedia.org/wiki/two-phase_commit_protocol

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

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

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

إذا كنت تستخدم نظام النصاب لقواعد البيانات ، فسيتم إخفاء التناقض (وسيُعرف بقاعدة البيانات نفسها).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top