إنشاء نسخة متماثلة MongoDB قوية تم ضبطها في وقت قياسي (4 طرق)
نشرت: 2023-03-11MongoDB هي قاعدة بيانات NoSQL تستخدم مستندات تشبه JSON ذات مخططات ديناميكية. عند العمل مع قواعد البيانات ، من الجيد دائمًا أن يكون لديك خطة طوارئ في حالة فشل أحد خوادم قاعدة البيانات الخاصة بك. الشريط الجانبي ، يمكنك تقليل فرص حدوث ذلك من خلال الاستفادة من أداة إدارة أنيقة لموقع WordPress الخاص بك.
هذا هو السبب في أنه من المفيد أن يكون لديك نسخ عديدة من بياناتك. كما أنه يقلل من زمن الوصول للقراءة. في الوقت نفسه ، يمكنه تحسين قابلية توسيع قاعدة البيانات وتوافرها. هذا هو المكان الذي يأتي فيه النسخ المتماثل. يتم تعريفه على أنه ممارسة مزامنة البيانات عبر قواعد بيانات متعددة.
في هذه المقالة ، سنتعمق في الجوانب المختلفة البارزة لنسخ MongoDB ، مثل ميزاته وآليته ، على سبيل المثال لا الحصر.
ما هو النسخ المتماثل في MongoDB؟
في MongoDB ، تقوم مجموعات النسخ المتماثلة بإجراء النسخ المتماثل. هذه مجموعة من الخوادم تحافظ على نفس مجموعة البيانات من خلال النسخ المتماثل. يمكنك حتى استخدام نسخ MongoDB كجزء من موازنة التحميل. هنا ، يمكنك توزيع عمليات الكتابة والقراءة عبر جميع الحالات ، بناءً على حالة الاستخدام.
ما هي مجموعة نسخ MongoDB؟
كل مثيل لـ MongoDB هو جزء من مجموعة نسخ متماثلة معينة هو عضو. يجب أن يكون لكل مجموعة نسخ متماثلة عضو أساسي وعضو ثانوي واحد على الأقل.
العضو الأساسي هو نقطة الوصول الأساسية للمعاملات مع مجموعة النسخ المتماثلة. إنه أيضًا العضو الوحيد الذي يمكنه قبول عمليات الكتابة. ينسخ النسخ المتماثل أولاً سجل التشغيل الأساسي (سجل العمليات). بعد ذلك ، يكرر التغييرات التي تم تسجيلها في مجموعات البيانات الخاصة بالثانويين. وبالتالي ، يمكن أن تحتوي كل مجموعة نسخ متماثلة على عضو أساسي واحد فقط في كل مرة. يمكن أن تتسبب الانتخابات التمهيدية المختلفة التي تتلقى عمليات الكتابة في حدوث تعارض في البيانات.
عادةً ما تقوم التطبيقات فقط بالاستعلام عن العضو الأساسي لعمليات الكتابة والقراءة. يمكنك تصميم الإعداد الخاص بك للقراءة من واحد أو أكثر من الأعضاء الثانويين. يمكن أن يتسبب نقل البيانات غير المتزامن في قراءات العقد الثانوية لخدمة البيانات القديمة. وبالتالي ، فإن مثل هذا الترتيب ليس مثاليًا لكل حالة استخدام.
مجموعة النسخ المتماثلة الميزات
تحدد آلية تجاوز الفشل التلقائية مجموعات نسخة MongoDB المتماثلة بعيدًا عن منافستها. في حالة عدم وجود انتخابات تمهيدية ، فإن الانتخابات الآلية بين العقد الثانوية تختار انتخابات أساسية جديدة.
مجموعة نسخ MongoDB مقابل مجموعة MongoDB
ستقوم مجموعة النسخ المتماثلة MongoDB بإنشاء نسخ مختلفة من نفس مجموعة البيانات عبر عقد مجموعة النسخ المتماثلة. الهدف الأساسي من مجموعة النسخ المتماثلة هو:
- قدم حلاً مدمجًا للنسخ الاحتياطي
- زيادة توافر البيانات
مجموعة MongoDB هي لعبة كرة مختلفة تمامًا. يقوم بتوزيع البيانات عبر العديد من العقد من خلال مفتاح جزء. ستؤدي هذه العملية إلى تجزئة البيانات إلى أجزاء عديدة تسمى الأجزاء. بعد ذلك ، يقوم بنسخ كل جزء إلى عقدة مختلفة. تهدف الكتلة إلى دعم مجموعات البيانات الكبيرة والعمليات عالية الإنتاجية. يحقق ذلك من خلال القياس الأفقي لحجم العمل.
فيما يلي الفرق بين مجموعة النسخ المتماثلة والتكتل ، من منظور الشخص العادي:
- الكتلة توزع عبء العمل. يقوم أيضًا بتخزين أجزاء من البيانات (الأجزاء) عبر العديد من الخوادم.
- تقوم مجموعة النسخ المتماثلة بتكرار مجموعة البيانات بالكامل.
يتيح لك MongoDB الجمع بين هذه الوظائف من خلال إنشاء مجموعة مجزأة. هنا ، يمكنك نسخ كل جزء إلى خادم ثانوي. يتيح ذلك للجزء تقديم نسبة عالية من التكرار وتوافر البيانات.
قد يكون الحفاظ على مجموعة نسخ متماثلة وإعدادها أمرًا مرهقًا من الناحية الفنية ويستغرق وقتًا طويلاً. وإيجاد خدمة الاستضافة الصحيحة؟ هذا صداع كامل آخر. مع وجود العديد من الخيارات ، من السهل إضاعة ساعات في البحث ، بدلاً من بناء عملك.
دعني أقدم لك موجزًا عن الأداة التي تقوم بكل هذا وأكثر من ذلك بكثير بحيث يمكنك العودة إلى سحقها بخدمتك / منتجك.
حل استضافة التطبيقات من Kinsta ، الذي يثق به أكثر من 55000 مطور ، يمكنك تشغيله في 3 خطوات بسيطة فقط. إذا كان هذا يبدو جيدًا لدرجة يصعب تصديقها ، فإليك بعض فوائد استخدام Kinsta:
- استمتع بأداء أفضل مع اتصالات Kinsta الداخلية : انس معاناتك مع قواعد البيانات المشتركة. قم بالتبديل إلى قواعد البيانات المخصصة ذات الاتصالات الداخلية التي ليس لها عدد استعلام أو حدود لعدد الصفوف. Kinsta أسرع وأكثر أمانًا ولن يفوترك مقابل عرض النطاق الترددي الداخلي / حركة المرور.
- مجموعة ميزات مصممة خصيصًا للمطورين : قم بتوسيع نطاق تطبيقك على النظام الأساسي القوي الذي يدعم Gmail و YouTube و Google Search. كن مطمئنًا ، فأنت في أيد أمينة هنا.
- استمتع بسرعات لا مثيل لها مع مركز بيانات من اختيارك : اختر المنطقة التي تناسبك أنت وعملائك. مع أكثر من 25 مركز بيانات للاختيار من بينها ، تضمن Kinsta 275+ PoPs أقصى سرعة ووجود عالمي لموقع الويب الخاص بك.
جرب حل استضافة تطبيق Kinsta مجانًا اليوم!
كيف يعمل النسخ المتماثل في MongoDB؟
في MongoDB ، تقوم بإرسال عمليات الكاتب إلى الخادم الأساسي (العقدة). يعيّن الأساسي العمليات عبر الخوادم الثانوية ، مما يؤدي إلى تكرار البيانات.

ثلاثة أنواع من عقد MongoDB
من بين الأنواع الثلاثة لعقد MongoDB ، ظهر نوعان من قبل: العقد الأولية والثانوية. النوع الثالث من عقدة MongoDB الذي يكون مفيدًا أثناء النسخ المتماثل هو الحكم. لا تحتوي عقدة الحكم على نسخة من مجموعة البيانات ولا يمكن أن تصبح مجموعة أساسية. بعد قولي هذا ، فإن الحكم يشارك في الانتخابات التمهيدية.
لقد ذكرنا سابقًا ما يحدث عندما تتعطل العقدة الأولية ، ولكن ماذا لو عضت العقد الثانوية الغبار؟ في هذا السيناريو ، تصبح العقدة الأساسية ثانوية وتصبح قاعدة البيانات غير قابلة للوصول.
انتخاب الأعضاء
يمكن إجراء الانتخابات في السيناريوهات التالية:
- تهيئة مجموعة النسخ المتماثلة
- فقدان الاتصال بالعقدة الأساسية (التي يمكن اكتشافها بنبضات القلب)
- صيانة مجموعة النسخ المتماثلة باستخدام أساليب
rs.reconfig
أوstepDown
- إضافة عقدة جديدة إلى مجموعة نسخ متماثلة موجودة
يمكن أن تمتلك مجموعة النسخ ما يصل إلى 50 عضوًا ، ولكن يمكن لـ 7 أعضاء فقط أو أقل التصويت في أي انتخابات.
يجب ألا يتجاوز متوسط الوقت قبل أن تنتخب المجموعة أولًا ابتدائيًا جديدًا 12 ثانية. ستحاول خوارزمية الانتخابات الحصول على الثانوية ذات الأولوية القصوى المتاحة. في الوقت نفسه ، لا يمكن للأعضاء ذوي الأولوية بقيمة 0 أن يصبحوا انتخابات تمهيدية ولا يشاركون في الانتخابات.

الاهتمام بالكتابة
من أجل المتانة ، تحتوي عمليات الكتابة على إطار عمل لنسخ البيانات في عدد محدد من العقد. يمكنك حتى تقديم ملاحظات للعميل بهذا. يُعرف إطار العمل هذا أيضًا باسم "قلق الكتابة". لديها أعضاء يحملون بيانات يحتاجون إلى الإقرار بمخاوف الكتابة قبل أن تعود العملية بنجاح. بشكل عام ، مجموعات النسخ المتماثلة لها قيمة 1 كمخاوف الكتابة. وبالتالي ، يجب على الأساسي فقط الإقرار بالكتابة قبل إعادة إقرار قلق الكتابة.
يمكنك حتى زيادة عدد الأعضاء اللازمين للإقرار بعملية الكتابة. لا يوجد حد أقصى لعدد الأعضاء الذين يمكنك الحصول عليهم. ولكن ، إذا كانت الأرقام عالية ، فأنت بحاجة إلى التعامل مع زمن انتقال عالٍ. هذا لأن العميل يحتاج إلى انتظار إقرار من جميع الأعضاء. أيضًا ، يمكنك تعيين الاهتمام الكتابي لـ "الأغلبية". هذا يحسب أكثر من نصف الأعضاء بعد تلقي اعترافهم.
قراءة التفضيل
بالنسبة لعمليات القراءة ، يمكنك ذكر تفضيل القراءة الذي يصف كيفية توجيه قاعدة البيانات للاستعلام إلى أعضاء مجموعة النسخ المتماثلة. بشكل عام ، تتلقى العقدة الأساسية عملية القراءة ولكن يمكن للعميل ذكر تفضيل القراءة لإرسال عمليات القراءة إلى العقد الثانوية. فيما يلي خيارات تفضيل القراءة:
- PrimaryPreferred : عادةً ما تأتي عمليات القراءة من العقدة الأساسية ولكن إذا لم يكن ذلك متاحًا ، يتم سحب البيانات من العقد الثانوية.
- أساسي : جميع عمليات القراءة تأتي من العقدة الأساسية.
- ثانوي : يتم تنفيذ جميع عمليات القراءة بواسطة العقد الثانوية.
- الأقرب : هنا ، يتم توجيه طلبات القراءة إلى أقرب عقدة يمكن الوصول إليها ، والتي يمكن اكتشافها عن طريق تشغيل الأمر
ping
. يمكن أن تأتي نتيجة عمليات القراءة من أي عضو في مجموعة النسخ المتماثلة ، بغض النظر عما إذا كانت المجموعة الأساسية أو الثانوية. - يُفضل ثانوي : هنا ، تأتي معظم عمليات القراءة من العقد الثانوية ، ولكن في حالة عدم توفر أي منها ، يتم أخذ البيانات من العقدة الأساسية.
مجموعة النسخ المتماثل مزامنة البيانات
للاحتفاظ بنسخ محدثة من مجموعة البيانات المشتركة ، يقوم الأعضاء الثانويون في مجموعة النسخ المتماثلة بالنسخ المتماثل أو مزامنة البيانات من الأعضاء الآخرين.
تستفيد MongoDB من شكلين من أشكال مزامنة البيانات. مزامنة أولية لملء الأعضاء الجدد بمجموعة البيانات الكاملة. النسخ المتماثل لتنفيذ التغييرات الجارية على مجموعة البيانات الكاملة.
مزامنة أولية
أثناء المزامنة الأولية ، تقوم عقدة ثانوية بتشغيل الأمر init sync
لمزامنة جميع البيانات من العقدة الأساسية إلى عقدة ثانوية أخرى تحتوي على أحدث البيانات. لذلك ، تستفيد العقدة الثانوية باستمرار من ميزة tailable cursor
للاستعلام عن أحدث إدخالات oplog ضمن مجموعة local.oplog.rs للعقدة الأساسية وتطبق هذه العمليات داخل إدخالات oplog هذه.
من MongoDB 5.2 ، يمكن أن تكون عمليات المزامنة الأولية قائمة على نسخ الملف أو منطقية.
تزامن منطقي
عند تنفيذ مزامنة منطقية ، فإن MongoDB:
- يطور جميع فهارس المجموعة حيث يتم نسخ المستندات لكل مجموعة.
- يكرر جميع قواعد البيانات باستثناء قاعدة البيانات المحلية. يقوم
mongod
بمسح كل مجموعة في جميع قواعد البيانات المصدر وإدراج جميع البيانات في نسخها المكررة من هذه المجموعات. - ينفذ جميع التغييرات على مجموعة البيانات. من خلال الاستفادة من oplog من المصدر ، يقوم
mongod
بترقية مجموعة البيانات الخاصة به لتصوير الحالة الحالية لمجموعة النسخ المتماثلة. - يستخرج سجلات oplog المضافة حديثًا أثناء نسخ البيانات. تأكد من أن العضو الهدف لديه مساحة قرص كافية داخل قاعدة البيانات المحلية لتخزين مؤقتًا سجلات oplog هذه طوال فترة مرحلة نسخ البيانات هذه.
عند اكتمال المزامنة الأولية ، ينتقل العضو من STARTUP2
إلى SECONDARY
.
مزامنة أولية قائمة على نسخ الملفات
فورًا ، لا يمكنك تنفيذ هذا إلا إذا كنت تستخدم MongoDB Enterprise. تقوم هذه العملية بتشغيل المزامنة الأولية عن طريق نسخ الملفات ونقلها على نظام الملفات. قد تكون طريقة المزامنة هذه أسرع من المزامنة الأولية المنطقية في بعض الحالات. ضع في اعتبارك أن المزامنة الأولية المستندة إلى نسخ الملف قد تؤدي إلى أعداد غير دقيقة إذا قمت بتشغيل طريقة count () بدون إسناد استعلام.
لكن هذه الطريقة لها نصيبها العادل من القيود أيضًا:
- أثناء المزامنة الأولية القائمة على نسخة ملف ، لا يمكنك الكتابة إلى قاعدة البيانات المحلية للعضو الذي تتم مزامنته. لا يمكنك أيضًا تشغيل نسخة احتياطية على العضو الذي تتم مزامنته أو العضو الذي تتم المزامنة منه.
- عند الاستفادة من محرك التخزين المشفر ، يستخدم MongoDB مفتاح المصدر لتشفير الوجهة.
- يمكنك تشغيل مزامنة أولية فقط من عضو معين في كل مرة.
تكرار
يقوم الأعضاء الثانويون بتكرار البيانات بشكل متسق بعد المزامنة الأولية. سيقوم الأعضاء الثانويون بتكرار oplog من المزامنة الخاصة بهم من المصدر وتنفيذ هذه العمليات في عملية غير متزامنة.
يمكن للثوار أن يعدل المزامنة تلقائيًا من المصدر حسب الحاجة بناءً على التغييرات في وقت اختبار الاتصال وحالة النسخ المتماثل للأعضاء الآخرين.
تدفق النسخ المتماثل
من MongoDB 4.4 ، ترسل المزامنة من المصادر دفقًا مستمرًا من إدخالات oplog إلى ثانويات المزامنة الخاصة بهم. يقلل النسخ المتدفق المتدفق من تأخر النسخ المتماثل في الشبكات ذات التحميل العالي والكمون العالي. من الممكن ايضا:
- تقليل مخاطر فقدان عمليات الكتابة باستخدام
w:1
بسبب تجاوز الفشل الأولي. - تقليل الصلابة للقراءات من الثانوية.
- قلل وقت الاستجابة لعمليات الكتابة باستخدام
w:“majority”
وw:>1
. باختصار ، أي قلق يتعلق بالكتابة يحتاج إلى انتظار النسخ المتماثل.
النسخ المتماثل متعدد مؤشرات الترابط
تستخدم MongoDB لكتابة العمليات على دفعات من خلال خيوط متعددة لتحسين التزامن. يقوم MongoDB بتجميع الدُفعات حسب معرف المستند أثناء تطبيق كل مجموعة من العمليات باستخدام مؤشر ترابط مختلف.
ينفذ MongoDB دائمًا عمليات الكتابة على مستند معين بترتيب الكتابة الأصلي الخاص به. تغير هذا في MongoDB 4.0.
من MongoDB 4.0 ، اقرأ العمليات التي تستهدف الثوار وتهيئتها بمستوى قلق القراءة من “majority”
أو “local”
ستقرأ الآن من لقطة WiredTiger للبيانات إذا حدثت القراءة في ثانوية حيث يتم تطبيق مجموعات النسخ المتماثل. القراءة من لقطة تضمن عرضًا متسقًا للبيانات ، وتتيح للقراءة أن تحدث في نفس الوقت مع النسخ المتماثل المستمر دون الحاجة إلى قفل.
لذلك ، لم تعد القراءات الثانوية التي تحتاج إلى مستويات قلق القراءة هذه بحاجة إلى الانتظار حتى يتم تطبيق دفعات النسخ المتماثل ويمكن معالجتها عند استلامها.
كيفية إنشاء مجموعة نسخ MongoDB
كما ذكرنا سابقًا ، يعالج MongoDB النسخ المتماثل من خلال مجموعات النسخ المتماثلة. خلال الأقسام القليلة التالية ، سنبرز بعض الطرق التي يمكنك استخدامها لإنشاء مجموعات نسخ متماثلة لحالة الاستخدام الخاصة بك.
الطريقة الأولى: إنشاء مجموعة نسخة متماثلة MongoDB جديدة على أوبونتو
قبل أن نبدأ ، ستحتاج إلى التأكد من أن لديك ثلاثة خوادم على الأقل تعمل بنظام Ubuntu 20.04 ، مع تثبيت MongoDB على كل خادم.
لإعداد مجموعة نسخ متماثلة ، من الضروري توفير عنوان حيث يمكن للآخرين في المجموعة الوصول إلى كل عضو في مجموعة النسخ المتماثلة. في هذه الحالة ، نحتفظ بثلاثة أعضاء في المجموعة. بينما يمكننا استخدام عناوين IP ، لا يوصى بذلك لأن العناوين قد تتغير بشكل غير متوقع. يمكن أن يكون البديل الأفضل هو استخدام أسماء مضيفي DNS المنطقية عند تكوين مجموعات النسخ المتماثلة.
يمكننا القيام بذلك عن طريق تكوين المجال الفرعي لكل عضو من أعضاء النسخ المتماثل. بينما يمكن أن يكون هذا مثاليًا لبيئة الإنتاج ، سيوضح هذا القسم كيفية تكوين تحليل DNS عن طريق تحرير ملفات مضيفي كل خادم. يسمح لنا هذا الملف بتعيين أسماء مضيف يمكن قراءتها لعناوين IP الرقمية. وبالتالي ، إذا تغير عنوان IP الخاص بك على أي حال ، فكل ما عليك فعله هو تحديث ملفات المضيفين على الخوادم الثلاثة بدلاً من إعادة تكوين النسخة المتماثلة التي تم تعيينها بواسطة نقطة الصفر!
في الغالب ، يتم تخزين hosts
في الدليل /etc/
. كرر الأوامر التالية لكل خادم من خوادمك الثلاثة:
sudo nano /etc/hosts
في الأمر أعلاه ، نستخدم nano كمحرر نصوص لدينا ، ومع ذلك ، يمكنك استخدام أي محرر نصوص تفضله. بعد الأسطر القليلة الأولى التي تقوم بتكوين المضيف المحلي ، قم بإضافة إدخال لكل عضو في مجموعة النسخ المتماثلة. تأخذ هذه الإدخالات شكل عنوان IP متبوعًا بالاسم الذي يمكن قراءته من قبل الإنسان. بينما يمكنك تسمية كل ما تريده ، تأكد من أن تكون وصفيًا حتى تعرف التمييز بين كل عضو. في هذا البرنامج التعليمي ، سنستخدم أسماء المضيف أدناه:
- mongo0.replset. عضو
- mongo1.replset. عضو
- mongo2.replset. عضو
باستخدام أسماء المضيفين هذه ، ستبدو ملفات / etc / hosts الخاصة بك مشابهة للأسطر المميزة التالية:

أحفظ وأغلق الملف.
بعد تكوين تحليل DNS لمجموعة النسخ المتماثلة ، نحتاج إلى تحديث قواعد جدار الحماية للسماح لهم بالاتصال ببعضهم البعض. قم بتشغيل الأمر ufw
التالي على mongo0 لتوفير وصول mongo1 إلى المنفذ 27017 على mongo0:
sudo ufw allow from mongo1_server_ip to any port 27017
بدلاً من المعلمة mongo1_server_ip
، أدخل عنوان IP الفعلي لخادم mongo1. أيضًا ، إذا قمت بتحديث مثيل Mongo على هذا الخادم لاستخدام منفذ غير افتراضي ، فتأكد من تغيير 27017 لعكس المنفذ الذي يستخدمه مثيل MongoDB الخاص بك.
أضف الآن قاعدة جدار حماية أخرى لمنح mongo2 الوصول إلى نفس المنفذ:
sudo ufw allow from mongo2_server_ip to any port 27017
بدلاً من المعلمة mongo2_server_ip
، أدخل عنوان IP الفعلي لخادم mongo2. بعد ذلك ، قم بتحديث قواعد جدار الحماية للخادمين الآخرين. قم بتشغيل الأوامر التالية على خادم mongo1 ، مع التأكد من تغيير عناوين IP بدلاً من المعلمة server_ip لتعكس تلك الخاصة بـ mongo0 و mongo2 ، على التوالي:
sudo ufw allow from mongo0_server_ip to any port 27017
sudo ufw allow from mongo2_server_ip to any port 27017
أخيرًا ، قم بتشغيل هذين الأمرين على mongo2. مرة أخرى ، تأكد من إدخال عناوين IP الصحيحة لكل خادم:
sudo ufw allow from mongo0_server_ip to any port 27017
sudo ufw allow from mongo1_server_ip to any port 27017
خطوتك التالية هي تحديث ملف تكوين كل مثيل MongoDB للسماح بالاتصالات الخارجية. للسماح بذلك ، تحتاج إلى تعديل ملف التكوين في كل خادم لعكس عنوان IP والإشارة إلى مجموعة النسخ المتماثلة. بينما يمكنك استخدام أي محرر نصوص مفضل ، فإننا نستخدم محرر نصوص nano مرة أخرى. دعنا نجري التعديلات التالية في كل ملف mongod.conf.
على mongo0:
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongo0.replset.member# replica set replication: replSetName: "rs0"
على mongo1:
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongo1.replset.member replication: replSetName: "rs0"
على mongo2:
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongo2.replset.member replication: replSetName: "rs0"
sudo systemctl restart mongod
باستخدام هذا ، قمت بتمكين النسخ المتماثل لكل مثيل MongoDB الخاص بالخادم.
يمكنك الآن تهيئة مجموعة النسخة المتماثلة باستخدام طريقة rs.initiate()
. هذه الطريقة مطلوبة فقط ليتم تنفيذها على نسخة واحدة من MongoDB في مجموعة النسخ المتماثلة. تأكد من تطابق اسم مجموعة النسخ المتماثلة والعضو مع التكوينات التي أجريتها في كل ملف تكوين مسبقًا.
rs.initiate( { _id: "rs0", members: [ { _id: 0, host: "mongo0.replset.member" }, { _id: 1, host: "mongo1.replset.member" }, { _id: 2, host: "mongo2.replset.member" } ] })
إذا قام الأسلوب بإرجاع "موافق": 1 في الإخراج ، فهذا يعني أن مجموعة النسخ المتماثلة قد بدأت بشكل صحيح. فيما يلي مثال على الشكل الذي يجب أن يبدو عليه الإخراج:
{ "ok": 1, "$clusterTime": { "clusterTime": Timestamp(1612389071, 1), "signature": { "hash": BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId": NumberLong(0) } }, "operationTime": Timestamp(1612389071, 1) }
قم بإيقاف تشغيل خادم MongoDB
يمكنك إيقاف تشغيل خادم MongoDB باستخدام طريقة db.shutdownServer()
. يوجد أدناه بناء الجملة لنفسه. تعد كل من force
و timeoutsecs
معلمات اختيارية.
db.shutdownServer({ force: <boolean>, timeoutSecs: <int> })
قد تفشل هذه الطريقة إذا قام عضو مجموعة النسخ المتماثلة mongod بتشغيل عمليات معينة أثناء إنشاء الفهرس. لمقاطعة العمليات وإجبار العضو على الإغلاق ، يمكنك إدخال force
المعامل المنطقي إلى true.
أعد تشغيل MongoDB مع –replSet
لإعادة ضبط التكوين ، تأكد من إيقاف كل عقدة في مجموعة النسخ المتماثلة. ثم احذف قاعدة البيانات المحلية لكل عقدة. ابدأها مرة أخرى باستخدام علامة –replSet
وقم بتشغيل rs.initiate()
على مثيل واحد فقط لمجموعة النسخ المتماثلة.
mongod --replSet "rs0"
يمكن لـ rs.initiate()
أن يأخذ وثيقة تكوين مجموعة متماثلة اختيارية ، وهي:
-
Replication.replSetName
أو الخيار—replSet
لتحديد اسم مجموعة النسخ المتماثلة في الحقل_id
. - مصفوفة الأعضاء ، التي تحتوي على وثيقة واحدة لكل عضو في مجموعة النسخ المتماثلة.
تؤدي طريقة rs.initiate()
إلى إجراء انتخابات وتنتخب أحد الأعضاء ليكون الأساسي.
إضافة أعضاء إلى مجموعة النسخ المتماثلة
لإضافة أعضاء إلى المجموعة ، ابدأ مثيلات نموذجية على أجهزة مختلفة. بعد ذلك ، ابدأ عميل mongo واستخدم الأمر rs.add()
.
الأمر rs.add()
له الصيغة الأساسية التالية:

rs.add(HOST_NAME:PORT)
على سبيل المثال،
افترض أن mongo1 هو مثيل mongod الخاص بك ، وأنه يستمع على المنفذ 27017. استخدم أمر Mongo client rs.add()
لإضافة هذا المثيل إلى مجموعة النسخ المتماثلة.
rs.add("mongo1:27017")
فقط بعد اتصالك بالعقدة الأساسية ، يمكنك إضافة مثيل mongod إلى مجموعة النسخ المتماثلة. للتحقق مما إذا كنت متصلاً بالأساسي ، استخدم الأمر db.isMaster()
.
إزالة المستخدمين
لإزالة عضو ، يمكننا استخدام rs.remove()
للقيام بذلك ، أولاً ، قم بإغلاق مثيل mongod الذي ترغب في إزالته باستخدام طريقة db.shutdownServer()
التي ناقشناها أعلاه.
بعد ذلك ، قم بالاتصال بالأساسي الحالي لمجموعة النسخ المتماثلة. لتحديد الأساسي الحالي ، استخدم db.hello()
أثناء الاتصال بأي عضو في مجموعة النسخ المتماثلة. بمجرد تحديد الأساسي ، قم بتشغيل أي من الأمرين التاليين:
rs.remove("mongodb-node-04:27017") rs.remove("mongodb-node-04")

إذا احتاجت مجموعة النسخ المتماثلة إلى اختيار أساسي جديد ، فقد يقوم MongoDB بفصل الغلاف لفترة وجيزة. في هذا السيناريو ، سيتم إعادة الاتصال تلقائيًا مرة أخرى. أيضًا ، قد يعرض خطأ DBClientCursor::init call()
فشل بالرغم من نجاح الأمر.
الطريقة 2: تكوين مجموعة نسخة MongoDB للنشر والاختبار
بشكل عام ، يمكنك إعداد مجموعات النسخ المتماثلة للاختبار إما مع تمكين RBAC أو تعطيله. في هذه الطريقة ، سنقوم بإعداد مجموعات النسخ المتماثلة مع تعطيل التحكم في الوصول لنشرها في بيئة اختبار.
أولاً ، أنشئ أدلة لجميع المثيلات التي تعد جزءًا من مجموعة النسخ المتماثلة باستخدام الأمر التالي:
mkdir -p /srv/mongodb/replicaset0-0 /srv/mongodb/replicaset0-1 /srv/mongodb/replicaset0-2
سيقوم هذا الأمر بإنشاء دلائل لمجموعة النسخ المتماثلة من ثلاث نسخ من MongoDB 0-0 ومجموعة النسخ المتماثلة 0-1 ومجموعة النسخ المتماثلة 0-2. الآن ، ابدأ مثيلات MongoDB لكل منها باستخدام مجموعة الأوامر التالية:
للخادم 1:
mongod --replSet replicaset --port 27017 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/replicaset0-0 --oplogSize 128
للخادم 2:
mongod --replSet replicaset --port 27018 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/replicaset0-0 --oplogSize 128
للخادم 3:
mongod --replSet replicaset --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/replicaset0-0 --oplogSize 128
يتم استخدام المعلمة –oplogSize
لمنع تحميل الجهاز بشكل زائد أثناء مرحلة الاختبار. يساعد في تقليل مقدار مساحة القرص التي يستهلكها كل قرص.
الآن ، قم بالاتصال بأحد المثيلات باستخدام Mongo shell عن طريق الاتصال باستخدام رقم المنفذ أدناه.
mongo --port 27017
يمكننا استخدام الأمر rs.initiate()
لبدء عملية النسخ المتماثل. سيتعين عليك استبدال معلمة hostname
باسم نظامك.
rs conf = { _id: "replicaset0", members: [ { _id: 0, host: "<hostname>:27017}, { _id: 1, host: "<hostname>:27018"}, { _id: 2, host: "<hostname>:27019"} ] }
يمكنك الآن تمرير ملف كائن الضبط كمعامل لأمر البدء واستخدامه على النحو التالي:
rs.initiate(rsconf)
وهناك لديك! لقد نجحت في إنشاء مجموعة نسخ MongoDB لأغراض التطوير والاختبار.
الطريقة الثالثة: تحويل مثيل مستقل إلى مجموعة نسخ MongoDB
تسمح MongoDB لمستخدميها بتحويل مثيلاتهم المستقلة إلى مجموعات نسخ متماثلة. بينما تُستخدم المثيلات المستقلة في الغالب لمرحلة الاختبار والتطوير ، تعد مجموعات النسخ المتماثلة جزءًا من بيئة الإنتاج.
للبدء ، دعنا نغلق مثالنا mongod باستخدام الأمر التالي:
db.adminCommand({"shutdown":"1"})
أعد تشغيل المثيل باستخدام المعلمة –repelSet
في الأمر الخاص بك لتحديد مجموعة النسخ المتماثلة التي ستستخدمها:
mongod --port 27017 – dbpath /var/lib/mongodb --replSet replicaSet1 --bind_ip localhost,<hostname(s)|ip address(es)>
يجب عليك تحديد اسم الخادم الخاص بك مع العنوان الفريد في الأمر.
قم بتوصيل shell بمثيل MongoDB الخاص بك واستخدم الأمر initiate لبدء عملية النسخ المتماثل وتحويل المثيل إلى مجموعة نسخ متماثلة بنجاح. يمكنك إجراء جميع العمليات الأساسية مثل إضافة أو إزالة مثيل باستخدام الأوامر التالية:
rs.add(“<host_name:port>”)
rs.remove(“host-name”)
بالإضافة إلى ذلك ، يمكنك التحقق من حالة مجموعة النسخ المتماثلة من MongoDB باستخدام الأمرين rs.status()
و rs.conf()
.
الطريقة الرابعة: MongoDB Atlas - بديل أبسط
يمكن أن يعمل النسخ المتماثل والتجزئة معًا لتكوين شيء يسمى مجموعة مُقسمة. في حين أن الإعداد والتكوين يمكن أن يستغرق وقتًا طويلاً وإن كان بسيطًا ، فإن MongoDB Atlas هو بديل أفضل من الطرق المذكورة سابقًا.
يقوم بأتمتة مجموعات النسخ المتماثلة الخاصة بك ، مما يجعل العملية سهلة التنفيذ. يمكنه نشر مجموعات نسخ متماثلة مُقسمة عالميًا ببضع نقرات ، مما يتيح استعادة القدرة على العمل بعد الكوارث ، وإدارة أسهل ، ومكان للبيانات ، وعمليات نشر متعددة المناطق.
في MongoDB Atlas ، نحتاج إلى إنشاء مجموعات - يمكن أن تكون إما مجموعة نسخ متماثلة أو مجموعة مجزأة. بالنسبة لمشروع معين ، يقتصر عدد العقد في مجموعة في مناطق أخرى على 40 عقدًا.
هذا يستثني المجموعات المجانية أو المشتركة ومناطق سحابة Google التي تتواصل مع بعضها البعض. يجب أن يفي العدد الإجمالي للعقد بين أي منطقتين بهذا القيد. على سبيل المثال ، إذا كان هناك مشروع فيه:
- المنطقة أ بها 15 عقدة.
- المنطقة B بها 25 عقدة
- تحتوي المنطقة C على 10 عقد
يمكننا فقط تخصيص 5 عقد إضافية للمنطقة C على النحو التالي ،
- المنطقة أ + المنطقة ب = 40 ؛ يفي بالقيد البالغ 40 وهو الحد الأقصى لعدد العقد المسموح به.
- المنطقة B + المنطقة C = 25 + 10 + 5 (العقد الإضافية المخصصة لـ C) = 40 ؛ يفي بالقيد البالغ 40 وهو الحد الأقصى لعدد العقد المسموح به.
- المنطقة أ + المنطقة ج = 15 + 10 + 5 (العقد الإضافية المخصصة ل ج) = 30 ؛ يفي بالقيد البالغ 40 وهو الحد الأقصى لعدد العقد المسموح به.
إذا قمنا بتخصيص 10 عقد إضافية للمنطقة C ، فإن المنطقة C بها 20 عقدة ، ثم المنطقة B + المنطقة C = 45 عقدة. قد يتجاوز هذا القيد المحدد ، لذلك قد لا تتمكن من إنشاء مجموعة متعددة المناطق.
عند إنشاء مجموعة ، يقوم Atlas بإنشاء حاوية شبكة في المشروع لموفر السحابة إذا لم تكن موجودة مسبقًا. لإنشاء كتلة مجموعة متماثلة في MongoDB Atlas ، قم بتشغيل الأمر التالي في Atlas CLI:
atlas clusters create [name] [options]
تأكد من إعطاء اسم مجموعة وصفي ، حيث لا يمكن تغييره بعد إنشاء الكتلة. يمكن أن تحتوي الوسيطة على أحرف وأرقام وواصلات ASCII.
هناك العديد من الخيارات المتاحة لإنشاء الكتلة في MongoDB بناءً على متطلباتك. على سبيل المثال ، إذا كنت تريد نسخًا احتياطيًا سحابيًا مستمرًا لمجموعتك ، فقم بتعيين --backup
على صحيح.
التعامل مع تأخير النسخ المتماثل
قد يكون تأخير النسخ المتماثل معطلاً تمامًا. إنه تأخير بين عملية على الابتدائية وتطبيق تلك العملية من oplog إلى الثانوي. إذا كان عملك يتعامل مع مجموعات كبيرة من البيانات ، فمن المتوقع حدوث تأخير ضمن حد معين. ومع ذلك ، في بعض الأحيان يمكن أن تسهم العوامل الخارجية أيضا في زيادة التأخير. للاستفادة من النسخ المتماثل المحدث ، تأكد من:
- تقوم بتوجيه حركة مرور الشبكة في نطاق ترددي ثابت وكافٍ. يلعب زمن انتقال الشبكة دورًا كبيرًا في التأثير على النسخ المتماثل ، وإذا كانت الشبكة غير كافية لتلبية احتياجات عملية النسخ المتماثل ، فسيكون هناك تأخير في نسخ البيانات عبر مجموعة النسخ المتماثلة.
- لديك سعة تخزين كافية للقرص. إذا كان نظام الملفات وجهاز القرص الموجود في الجهاز الثانوي غير قادرين على مسح البيانات إلى القرص بسرعة مثل الأساسي ، فسيواجه الثانوي صعوبة في مواكبة ذلك. ومن ثم ، فإن العقد الثانوية تعالج استعلامات الكتابة بشكل أبطأ من العقدة الأساسية. هذه مشكلة شائعة في معظم الأنظمة متعددة المستأجرين ، بما في ذلك المثيلات الافتراضية وعمليات النشر واسعة النطاق.
- تطلب إشعارًا بشأن كتابة إقرار بالاستلام بعد فاصل زمني لإتاحة الفرصة للموظفين الثانويين للحاق بالمرحلة الأساسية ، خاصةً عندما تريد إجراء عملية تحميل مجمع أو استيعاب البيانات التي تتطلب عددًا كبيرًا من عمليات الكتابة إلى الأساسي. لن يتمكن الثانويون من قراءة oplog بالسرعة الكافية لمواكبة التغييرات ؛ خاصة مع مخاوف الكتابة غير المعترف بها.
- يمكنك تحديد مهام الخلفية قيد التشغيل. قد يكون لبعض المهام مثل مهام cron وتحديثات الخادم وفحوصات الأمان تأثيرات غير متوقعة على استخدام الشبكة أو القرص ، مما يتسبب في تأخير عملية النسخ المتماثل.
إذا لم تكن متأكدًا مما إذا كان هناك تأخير في النسخ المتماثل في تطبيقك ، فلا تقلق - يناقش القسم التالي استراتيجيات استكشاف الأخطاء وإصلاحها!
استكشاف أخطاء مجموعات النسخ المتماثلة لـ MongoDB وإصلاحها
لقد نجحت في إعداد مجموعات النسخ المتماثلة الخاصة بك ، لكنك لاحظت أن بياناتك غير متسقة عبر الخوادم. هذا أمر مقلق للغاية بالنسبة للشركات الكبيرة ، ومع ذلك ، مع طرق استكشاف الأخطاء وإصلاحها السريعة ، قد تجد السبب أو حتى تصحح المشكلة! فيما يلي بعض الاستراتيجيات الشائعة لتحرّي الخلل وإصلاحه في عمليات نشر مجموعة النسخ المتماثلة والتي قد تكون مفيدة:
تحقق من حالة النسخ المتماثلة
يمكننا التحقق من الحالة الحالية لمجموعة النسخ المتماثلة وحالة كل عضو عن طريق تشغيل الأمر التالي في جلسة mongosh المتصلة بمجموعة النسخ المتماثلة الأساسية.
rs.status()
تحقق من تأخر النسخ المتماثل
كما تمت مناقشته سابقًا ، يمكن أن يمثل تأخر النسخ المتماثل مشكلة خطيرة لأنه يجعل الأعضاء "المتأخرين" غير مؤهلين ليصبحوا أساسيين بسرعة ويزيد من احتمال أن تكون عمليات القراءة الموزعة غير متسقة. يمكننا التحقق من الطول الحالي لسجل النسخ المتماثل باستخدام الأمر التالي:
rs.printSecondaryReplicationInfo()
هذا يعيد القيمة syncedTo
وهو الوقت الذي تمت فيه كتابة إدخال oplog الأخير إلى الثانوي لكل عضو. إليك مثال لتوضيح ذلك:
source: m1.example.net:27017 syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT) 0 secs (0 hrs) behind the primary source: m2.example.net:27017 syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT) 0 secs (0 hrs) behind the primary
قد يظهر العضو المتأخر على أنه 0 ثانية خلف الأساسي عندما تكون فترة عدم النشاط على الأساسي أكبر من قيمة members[n].secondaryDelaySecs
.
اختبار الاتصالات بين جميع الأعضاء
يجب أن يكون كل عضو في مجموعة النسخ المتماثلة قادرًا على الاتصال بكل عضو آخر. تأكد دائمًا من التحقق من التوصيلات في كلا الاتجاهين. في الغالب ، تمنع تكوينات جدار الحماية أو هياكل الشبكة الاتصال العادي والمطلوب الذي يمكن أن يمنع النسخ المتماثل.
على سبيل المثال ، لنفترض أن مثيل mongod يرتبط بكل من المضيف المحلي واسم المضيف "ExampleHostname" المرتبط بعنوان IP 198.41.110.1:
mongod --bind_ip localhost, ExampleHostname
للاتصال بهذا المثيل ، يجب على العملاء البعيدين تحديد اسم المضيف أو عنوان IP:
mongosh --host ExampleHostname mongosh --host 198.41.110.1
إذا كانت مجموعة النسخ المتماثلة تتكون من ثلاثة أعضاء ، m1 و m2 و m3 ، باستخدام المنفذ الافتراضي 27017 ، يجب عليك اختبار الاتصال على النحو التالي:
على m1:
mongosh --host m2 --port 27017 mongosh --host m3 --port 27017
على متر مربع:
mongosh --host m1 --port 27017 mongosh --host m3 --port 27017
على m3:
mongosh --host m1 --port 27017 mongosh --host m2 --port 27017
إذا فشل أي اتصال في أي اتجاه ، فسيتعين عليك التحقق من تكوين جدار الحماية الخاص بك وإعادة تكوينه للسماح بالاتصالات.
ضمان الاتصالات الآمنة مع مصادقة ملف Keyfile
بشكل افتراضي ، تعتمد مصادقة ملف المفتاح في MongoDB على آلية مصادقة استجابة التحدي المملحة (SCRAM). للقيام بذلك ، يجب على MongoDB قراءة بيانات الاعتماد المقدمة من المستخدم والتحقق من صحتها والتي تتضمن مجموعة من اسم المستخدم وكلمة المرور وقاعدة بيانات المصادقة التي يعرفها مثيل MongoDB المحدد. هذه هي الآلية الدقيقة المستخدمة لمصادقة المستخدمين الذين يقدمون كلمة مرور عند الاتصال بقاعدة البيانات.
عند تمكين المصادقة في MongoDB ، يتم تمكين التحكم في الوصول المستند إلى الدور (RBAC) تلقائيًا لمجموعة النسخ المتماثلة ، ويتم منح المستخدم دورًا واحدًا أو أكثر يحدد وصوله إلى موارد قاعدة البيانات. عندما يتم تمكين RBAC ، فهذا يعني أن مستخدم Mongo المصادق عليه والذي يتمتع بالامتيازات المناسبة فقط سيكون قادرًا على الوصول إلى الموارد الموجودة على النظام.
يعمل ملف المفتاح مثل كلمة مرور مشتركة لكل عضو في الكتلة. يتيح ذلك لكل مثيل mongod في مجموعة النسخ المتماثلة استخدام محتويات ملف المفتاح ككلمة مرور مشتركة لمصادقة الأعضاء الآخرين في النشر.
يمكن فقط لتلك المثيلات النموذجية مع ملف المفتاح الصحيح الانضمام إلى مجموعة النسخ المتماثلة. يجب أن يتراوح طول المفتاح بين 6 و 1024 حرفًا ويمكن أن يحتوي فقط على أحرف في مجموعة base64. يرجى ملاحظة أن MongoDB يقطع أحرف المسافات البيضاء عند قراءة المفاتيح.
يمكنك إنشاء ملف مفتاح باستخدام طرق مختلفة. في هذا البرنامج التعليمي ، نستخدم openssl
لإنشاء سلسلة معقدة مكونة من 1024 حرفًا عشوائيًا لاستخدامها ككلمة مرور مشتركة. It then uses chmod
to change file permissions to provide read permissions for the file owner only. Avoid storing the keyfile on storage mediums that can be easily disconnected from the hardware hosting the mongod instances, such as a USB drive or a network-attached storage device. Below is the command to generate a keyfile:
openssl rand -base64 756 > <path-to-keyfile> chmod 400 <path-to-keyfile>
Next, copy the keyfile to each replica set member . Make sure that the user running the mongod instances is the owner of the file and can access the keyfile. After you've done the above, shut down all members of the replica set starting with the secondaries. Once all the secondaries are offline, you may go ahead and shut down the primary. It's essential to follow this order so as to prevent potential rollbacks. Now shut down the mongod instance by running the following command:
use admin db.shutdownServer()
After the command is run, all members of the replica set will be offline. Now, restart each member of the replica set with access control enabled .
For each member of the replica set, start the mongod instance with either the security.keyFile
configuration file setting or the --keyFile
command-line option.
If you're using a configuration file, set
- security.keyFile to the keyfile's path, and
- replication.replSetName to the replica set name.
security: keyFile: <path-to-keyfile> replication: replSetName: <replicaSetName> net: bindIp: localhost,<hostname(s)|ip address(es)>
Start the mongod instance using the configuration file:
mongod --config <path-to-config-file>
If you're using the command line options, start the mongod instance with the following options:
- –keyFile set to the keyfile's path, and
- –replSet set to the replica set name.
mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> --bind_ip localhost,<hostname(s)|ip address(es)>
You can include additional options as required for your configuration. For instance, if you wish remote clients to connect to your deployment or your deployment members are run on different hosts, specify the –bind_ip. For more information, see Localhost Binding Compatibility Changes.
Next, connect to a member of the replica set over the localhost interface . You must run mongosh on the same physical machine as the mongod instance. This interface is only available when no users have been created for the deployment and automatically closes after the creation of the first user.
We then initiate the replica set. From mongosh, run the rs.initiate()
method:
rs.initiate( { _id: "myReplSet", members: [ { _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27017" }, { _id: 2, host: "mongo3:27017" } ] } )
As discussed before, this method elects one of the members to be the primary member of the replica set. To locate the primary member, use rs.status()
. Connect to the primary before continuing.
Now, create the user administrator . You can add a user using the db.createUser()
method. Make sure that the user should have at least the userAdminAnyDatabase
role on the admin database.
The following example creates the user 'batman' with the userAdminAnyDatabase
role on the admin database:
admin = db.getSiblingDB("admin") admin.createUser( { user: "batman", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
Enter the password that was created earlier when prompted.
Next, you must authenticate as the user administrator . To do so, use db.auth()
to authenticate. على سبيل المثال:
db.getSiblingDB(“admin”).auth(“batman”, passwordPrompt()) // or cleartext password
Alternatively, you can connect a new mongosh instance to the primary replica set member using the -u <username>
, -p <password>
, and the --authenticationDatabase
parameters.
mongosh -u "batman" -p --authenticationDatabase "admin"
Even if you do not specify the password in the -p
command-line field, mongosh prompts for the password.
Lastly, create the cluster administrator . The clusterAdmin
role grants access to replication operations, such as configuring the replica set.
Let's create a cluster administrator user and assign the clusterAdmin
role in the admin database:
db.getSiblingDB("admin").createUser( { "user": "robin", "pwd": passwordPrompt(), // or cleartext password roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] } )
Enter the password when prompted.
If you wish to, you may create additional users to allow clients and interact with the replica set.
And voila! You have successfully enabled keyfile authentication!
ملخص
Replication has been an essential requirement when it comes to databases, especially as more businesses scale up. It widely improves the performance, data security, and availability of the system. Speaking of performance, it is pivotal for your WordPress database to monitor performance issues and rectify them in the nick of time, for instance, with Kinsta APM, Jetpack, and Freshping to name a few.
Replication helps ensure data protection across multiple servers and prevents your servers from suffering from heavy downtime(or even worse – losing your data entirely). In this article, we covered the creation of a replica set and some troubleshooting tips along with the importance of replication. Do you use MongoDB replication for your business and has it proven to be useful to you? Let us know in the comment section below!