ما هي أفضل طريقة لمزامنة البيانات الديناميكية ثنائية الاتجاه في الوقت الفعلي باستخدام mysql

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

سؤال

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

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

Server A in Location A
==============

Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | John  |
|-----------|

Server B in Location B
==============
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | Peter |
|-----------|


Expected Scenario
===========
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
| 3 | Peter |
| 4 | John  |
|-----------|
هل كانت مفيدة؟

المحلول

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

يعد إعداد Master-Master هو في الأساس نفس إعداد Slave-Master ولكن تم بدء تشغيل كل من Slaves وتغيير مهم في ملفات التكوين الخاصة بك في كل صندوق.

ماجستير MySQL 1:

auto_increment_increment = 2
auto_increment_offset = 1 

ماستر ماي إس كيو إل 2:

auto_increment_increment = 2
auto_increment_offset = 2

تضمن هاتان المعلمتان أنه عندما يتقاتل خادمان على مفتاح أساسي لسبب ما، فإنهما لا يكرران ويوقفان النسخ المتماثل.بدلاً من الزيادة بمقدار 1، فإن أي حقل زيادة تلقائية سيزيد بشكل افتراضي بمقدار 2.في أحد الصناديق، سيبدأ الإزاحة من 1 ويقوم بتشغيل التسلسل 1 3 5 7 9 11 13 وما إلى ذلك.في المربع الثاني، سيبدأ الإزاحة عند 2 ويستمر على طول 2 4 6 8 10 12 وما إلى ذلك.من الاختبار الحالي، يبدو أن الزيادة التلقائية تأخذ الرقم المجاني التالي، وليس الرقم المتبقي من قبل.
على سبيل المثالإذا قام الخادم 1 بإدراج أول 3 سجلات (1 3 و5) عندما قام الخادم 2 بإدراج السجل الرابع، فسيتم إعطاؤه مفتاح 6 (وليس 2، الذي يُترك غير مستخدم).

بمجرد الانتهاء من إعداد ذلك، ابدأ تشغيل كليهما كعبيد.
ثم للتأكد من أن كلا الجهازين يعملان بشكل جيد، قم بالاتصال بكلا الجهازين وقم بتنفيذ الأمر SHOW SLAVE STATUS ويجب أن تلاحظ أن كليهما Slave_IO_Running و Slave_SQL_Running يجب أن يقول كلاهما "نعم" في كل مربع.

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

ثم قم بإجراء جميع الاختبارات للتأكد من أنه يمكنك تنفيذ جميع التطبيقات القياسية على كل صندوق مع نسخها إلى الآخر.

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

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

نصائح أخرى

والخلية لا يدعم تكرار متزامن، ومع ذلك، وحتى لو فعلت ذلك، وكنت ربما لا ترغب في استخدامه (لا يمكن اتخاذ ضرب أداء انتظار ملقم آخر لمزامنة على كل معاملة ارتكاب).

وسيكون لديك للنظر في الحلول المعمارية أكثر ملاءمة لذلك - هناك منتجات الطرف الثالث التي سوف تفعل دمج وحل النزاعات بطريقة محددة سلفا - وهذا هو السبيل الوحيد حقا

وتتوقع العمارة لوظيفة في هذا السبيل من السذاجة - لا يوجد "حل سهل" أي قاعدة بيانات، وليس فقط الخلية

هل من المهم أن UIDs هي نفسها؟ أو هل ترفيه عن التفكير في وجود جدول أو عمود بترسيم UID بعيد إلى UID المحلي وكتابة التعليمات البرمجية تزامن مخصصة للكائنات التي ترغب في تكرار عبر أن يفعل أي رسم الخرائط اللازمة من UIDs للأعمدة المفاتيح الخارجية، وما إلى ذلك؟

والطريقة الوحيدة لضمان مزامنة الجداول الخاصة بك لإعداد تكرار 2-طرق بين قواعد البيانات.

ولكن، الخلية يسمح فقط تكرارها في اتجاه واحد، وبالتالي لا يمكنك ببساطة حل مشكلتك في هذا التكوين.

لنكون واضحين، يمكنك "الإعداد" النسخ المتماثل 2-الطرق ولكن الخلية AB <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/replication-faq.html#qandaitem -17-3-4-5 "يختلط =" نوفولو noreferrer "> يشجع هذا .

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