النسخ المتماثل مع الكثير من عمليات كتابة الجدول المؤقتة

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي قاعدة بيانات وأعتزم تكرارها لأسباب تتعلق بالنسخ الاحتياطي (الأداء ليس مشكلة في الوقت الحالي).

لقد قمنا بإعداد النسخ المتماثل بشكل صحيح واختبرناه وكان كل شيء على ما يرام.

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

والسبب في ذلك هو أننا نعيد حساب بعض البيانات الموجودة في قاعدة البيانات الخاصة بنا عبر cronjob كل 15 دقيقة للتأكد من مزامنتها (يستغرق الأمر حوالي 3 دقائق إجمالاً، لذلك من غير المقبول إجراء هذه العمليات أثناء طلب الويب؛وبدلاً من ذلك، نقوم فقط بتخزين التعديلات دون محاولة إعادة حساب أي شيء أثناء طلب الويب، ثم نقوم بكل العمل بشكل مجمّع).ومن أجل معالجة تلك البيانات بكفاءة، نستخدم الجداول المؤقتة (نظرًا لوجود الكثير من الترابطات).

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

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

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

هل واجه أي شخص مشكلة مماثلة و/أو كيف يمكنك حلها؟هل أفتقد شيئًا واضحًا؟

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

المحلول

لقد توصلت إلى الحل.إنه يستخدم النسخ المتماثل do-db الذي ذكره Nick.قم بتدوينها هنا في حال واجه شخص ما مشكلة مماثلة.

المشكلة في مجرد استخدام خيارات النسخ المتماثل (wild-) do * في هذه الحالة (كما قلت، نحن نستخدم الجداول المؤقتة لإعادة ملء جدول مركزي) هي إما أن تتجاهل الجداول المؤقتة وتعيد ملء الجدول المركزي بدون بيانات (مما يؤدي إلى مزيد من المشاكل حيث أن جميع الاستعلامات التي تعتمد على تحديث الجدول المركزي ستنتج نتائج مختلفة) أو تتجاهل الجدول المركزي الذي لديه مشكلة مماثلة.ناهيك عن أنه يتعين عليك إعادة تشغيل mysql بعد إضافة أي من هذه الخيارات إلى my.cnf.أردنا شيئًا يغطي كل تلك الحالات (والحالات المستقبلية) دون الحاجة إلى أي إعادة تشغيل أخرى.

لذلك، ما قررنا القيام به هو تقسيم قاعدة البيانات إلى قواعد بيانات "حقيقية" وقاعدة بيانات "منطقة العمل".يتم نسخ قاعدة البيانات "الحقيقية" فقط (أعتقد أنه يمكنك اتخاذ قرار بشأن اتفاقية أسماء الجداول لاستخدامها في بناء جملة النسخ المتماثل Wild-do-table).

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

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

نصائح أخرى

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

[mysqld]
replicate-do-db    = db1
replicate-do-table = db2.mytbl2
replicate-wild-do-table= database_name.%
replicate-wild-do-table= another_db.%

الفكرة هي أن تطلب منه عدم تكرار أي جداول غير تلك التي تحددها.

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