اختار الكاتب صندوق الإنترنت المفتوح / الحرية في التعبير لتلقي التبرع كجزء من برنامج الكتابة مقابل التبرعات.
المقدمة
الرصد هو جزء أساسي من إدارة قواعد البيانات، فهو يتيح لك فهم أداء قاعدة البيانات والصحة العامة. من خلال مراقبة أداء قاعدة البيانات الخاصة بك ، يمكنك أن يكون لديك فكرة أفضل عن قدرتها الحالية، ومراقبة كيفية تغير عبئها العملي مع مرور الوقت، والتخطيط للمستقبل لتوسيع قاعدة البيانات بمجرد أن تبدأ في الاقتراب من حدودها. يمكن أن يساعدك أيضًا على ملاحظة المشكلات الأساسية في الأجهزة أو السلوك غير الطبيعي مثل زيادة غير متوقعة في استخدام قاعدة البيانات. أخيرًا، يمكن أن يساعد الرصد في تشخيص المشكلات المتعلقة بالتطبيقات التي تستخدم قاعدة البيانات، مثل استعلامات التطبيق التي تسبب العرقلة.
MongoDB يأتي مثبتًا مع مجموعة من الأدوات والمرافق التي يمكنك استخدامها لمراقبة أداء قاعدة البيانات الخاصة بك. في هذا البرنامج التعليمي، ستتعلم كيفية مراقبة مقاييس قاعدة البيانات حسب الطلب باستخدام الأوامر المدمجة والأدوات. سوف تصبح أيضا على دراية مع الملف الشخصي لقاعدة البيانات MongoDB الذي يمكن أن يساعدك في الكشف عن استعلامات غير محسنة.
المتطلبات الأساسية
لمتابعة هذا البرنامج التعليمي، ستحتاج إلى:
- A server with a regular, non-root user with
sudo
privileges and a firewall configured with UFW. This tutorial was validated using a server running Ubuntu 20.04, and you can prepare your server by following this initial server setup tutorial for Ubuntu 20.04. - تثبيت MongoDB على الخادم الخاص بك. لإعداد هذا، اتبع البرنامج التعليمي الخاص بنا حول كيفية تثبيت MongoDB على أوبونتو 20.04.
- تأمين نسخة MongoDB الخاصة بخادمك عن طريق تمكين المصادقة وإنشاء مستخدم إداري. لتأمين MongoDB مثل هذا، اتبع البرنامج التعليمي الخاص بنا حول كيفية تأمين MongoDB على أوبونتو 20.04.
- إلمام باستعلامات مجموعات MongoDB وتصفية النتائج. لتعلم كيفية استخدام استعلامات MongoDB، اتبع دليلنا حول كيفية إنشاء استعلامات في MongoDB.
ملاحظة: البرامج التعليمية المرتبطة بكيفية تكوين خادمك، تثبيت MongoDB، وتأمين تثبيت MongoDB تشير إلى أوبونتو 20.04. يركز هذا البرنامج التعليمي على MongoDB نفسه، ليس على نظام التشغيل الأساسي. سيعمل بشكل عام مع أي تثبيت MongoDB بغض النظر عن نظام التشغيل طالما تم تمكين المصادقة.
الخطوة 1 — إعداد البيانات التجريبية
لشرح كيفية مراقبة أداء MongoDB، توضح هذه الخطوة كيفية فتح واجهة سطر الأوامر الخاصة بـ MongoDB للاتصال بنسخة MongoDB المثبتة محليًا على جهاز الكمبيوتر الخاص بك وإنشاء مجموعة عينية ضمنها.
لإنشاء مجموعة العينات المستخدمة في هذا الدليل، اتصل بـ واجهة سطر الأوامر الخاصة بقاعدة بيانات MongoDB كمستخدم إداري. يتبع هذا البرنامج التعليمي تقليدات البرنامج التعليمي أمان MongoDB السابقة ويفترض أن اسم هذا المستخدم الإداري هو AdminSammy وقاعدة البيانات الخاصة به للمصادقة هي admin
. تأكد من تغيير هذه التفاصيل في الأمر التالي ليعكس إعدادك الخاص، إذا كان مختلفًا:
أدخل كلمة المرور التي تم تعيينها أثناء التثبيت للوصول إلى واجهة سطر الأوامر. بعد تقديم كلمة المرور، سترى علامة الإشارة >
على سطر الأوامر.
ملاحظة: عند الاتصال لأول مرة، ستتصل واجهة سطر الأوامر الخاصة بقاعدة بيانات MongoDB بقاعدة البيانات test
تلقائيًا. يمكنك استخدام هذه القاعدة بأمان لتجربة MongoDB وواجهة سطر الأوامر الخاصة بها.
بالبدل من ذلك، يمكنك التبديل إلى قاعدة بيانات أخرى لتشغيل جميع الأوامر المثالية المذكورة في هذا البرنامج التعليمي. للتبديل إلى قاعدة بيانات أخرى، قم بتشغيل الأمر use
تلاه اسم قاعدة البيانات الخاصة بك:
من الغير عملي أو المفيد جدًا مراقبة قاعدة البيانات عند العمل مع مجموعة بيانات صغيرة، حيث ستحتاج نظام قاعدة البيانات فقط إلى فحص عدد قليل من السجلات لأي استعلام معطى. لتوضيح ميزات مراقبة الأداء في MongoDB، ستحتاج إلى قاعدة بيانات تحتوي على عدد كافٍ من البيانات بحيث يستغرق MongoDB وقتًا طويلاً لتنفيذ الاستعلامات.
لهذا الغرض، تشير الأمثلة في جميع أنحاء هذا الدليل إلى مجموعة عينية تسمى accounts
تحتوي على عدد كبير من الوثائق. يُمثل كل وثيقة حسابًا بنكيًا فرديًا برصيد حساب مولد عشوائيًا. ستحتوي كل وثيقة في المجموعة على هيكل مثل هذا:
تحتوي هذه الوثيقة المثالية على المعلومات التالية:
number
: يُمثل هذا الحقل رقم الحساب للحساب المعطى. في هذه المجموعة، سيحتوي كل رقم حساب على بادئة1000-
تليها معرف رقمي متزايد.currency
: يشير هذا الحقل إلى نوع العملة التي يتم تخزين رصيد كل حساب بها. قيمة العملة لكل حساب ستكون إماUSD
أوEUR
.balance
: يوضح هذا الحقل الرصيد لكل حساب بنكي معطى. في قاعدة البيانات العينية هذه، ستحتوي حقول الرصيد في كل وثيقة على قيمة مولدة عشوائيًا.
بدلاً من إدراج عدد كبير من الوثائق يدويًا، يمكنك تنفيذ الكود JavaScript التالي لإنشاء مجموعة تدعى accounts
وإدراج مليون وثيقة من هذا القبيل فيها:
يُنفّذ هذا الكود حلقة for
تقوم بالتشغيل مليون مرة متتالية. في كل مرة يتم فيها تكرار الحلقة، يُنفّذ الأسلوب insertOne()
على مجموعة الحسابات لإدراج وثيقة جديدة. في كل تكرار، يتم تخصيص قيمة لحقل number
تتكون من البادئة 1000-
مع القيمة الموجودة في القيمة i
لهذا التكرار. وهذا يعني أنه في المرة الأولى التي تتكرر فيها هذه الحلقة، ستُعين قيمة الحقل number
على 1000-1
؛ وفي آخر مرة يتم فيها التكرار، سيتم تعيينها على 1000-1000000
.
العملة دائمًا ممثلة بصورة USD
للحسابات التي يكون رقمها أعلى من 500000 وكـ EUR
للحسابات التي يكون رقمها أقل من ذلك. يستخدم حقل الرصيد الوظيفة Math.random()
لتوليد رقم عشوائي بين 0 و 1، ثم يضرب الرقم العشوائي بـ 100000 لتوفير قيم أكبر.
ملاحظة: قد يستغرق تنفيذ هذه الحلقة وقتًا طويلاً، حتى يتجاوز 10 دقائق. فمن الآمن ترك العملية تعمل حتى تنتهي.
سيقوم الإخراج بإبلاغك بنجاح العملية وإرجاع ObjectId
لآخر وثيقة تم إدراجها:
Output{
"acknowledged" : true,
"insertedId" : ObjectId("61a38a4beedf737ac8e54e82")
}
يمكنك التحقق من أن الوثائق تم إدراجها بشكل صحيح عن طريق تشغيل الأسلوب count()
بدون وسيطات، الذي سيسترجع عدد الوثائق في المجموعة:
Output1000000
في هذه الخطوة، لقد قمت بنجاح بإنشاء قائمة من الوثائق المثالية التي ستستخدم كبيانات اختبار في هذا الدليل لشرح الأدوات التي يوفرها MongoDB لمراقبة الأداء. في الخطوة التالية، ستتعلم كيفية التحقق من إحصاءات استخدام الخادم الأساسية.
الخطوة 2 — التحقق من إحصائيات استخدام الخادم
تتتبع MongoDB تلقائياً عددًا من الإحصائيات الأدائية المفيدة، والتحقق منها بانتظام هو وسيلة أساسية لمراقبة قاعدة البيانات الخاصة بك. يجب أن تكون على علم بأن هذه الإحصائيات لن تقدم رؤية فورية فيما يحدث مع قاعدة البيانات الخاصة بك، ولكن يمكن أن تكون مفيدة لتحديد كيفية أداء قاعدة البيانات وما إذا كانت هناك أي مشاكل قريبة.
تحذير: تُرجع الأوامر لمراقبة MongoDB الموضحة في هذا الدليل معلومات حساسة بشكل محتمل حول قاعدة البيانات الخاصة بك وأدائها. بسبب هذا، تتطلب بعض هذه الأوامر الحصول على أذونات متقدمة.
تتطلب بالضبط الطريقة serverStatus()
الموضحة في هذه الخطوة بالإضافة إلى الأوامر mongostat
و mongotop
المسلط الضوء عليها في الخطوة التالية من المستخدمين أن يكون قد تم منحهم دور clusterMonitor
لتشغيلها. وبالمثل، تتطلب الطريقة setProfilingLevel()
الموضحة في الخطوة 4 الحصول على دور dbAdmin
.
بناءً على افتراضك بمتابعة البرنامج التعليمي السابق عن كيفية تأمين MongoDB على Ubuntu 20.04 والاتصال بمثيل MongoDB الخاص بك كمستخدم إداري أنشأته في ذلك الدليل، ستحتاج إلى منحه هذه الأدوار الإضافية لمتابعة الأمثلة الموجودة في هذا الدليل.
أولاً، قم بالتبديل إلى قاعدة بيانات المصادقة الخاصة بمستخدمك. هذا هو admin
في المثال التالي، ولكن قم بالاتصال بقاعدة بيانات المصادقة الخاصة بك إذا كانت مختلفة:
Outputswitched to db admin
ثم قم بتشغيل الطريقة grantRolesToUser()
ومنح مستخدمك دور clusterMonitor
بالإضافة إلى دور dbAdmin
على قاعدة البيانات التي أنشأت فيها مجموعة accounts
. يفترض المثال التالي أن مجموعة accounts
موجودة في قاعدة البيانات test
:
يرجى ملاحظة أنه يُعتبر عمومًا أكثر أمانًا أن تكون للملفات الشخصية للمستخدمين أغراض محددة. بهذه الطريقة، لن يمتلك أي مستخدم صلاحيات غير ضرورية. إذا كنت تعمل في بيئة إنتاجية، قد ترغب في وجود مستخدم مخصص يهدف فقط إلى مراقبة قاعدة البيانات.
ينشئ المثال التالي مستخدم MongoDB يُدعى MonitorSammy ويمنحه الأدوار اللازمة لكي تتمكن من متابعة الأمثلة في هذا البرنامج التعليمي. يُلاحظ أيضًا أنه يتضمن دور readWriteAnyDatabase
، الذي سيسمح لهذا المستخدم بقراءة وكتابة البيانات في أي قاعدة بيانات في المجموعة:
بعد منح مستخدمك الأدوار المناسبة، انتقل مرة أخرى إلى قاعدة البيانات التي تخزن فيها مجموعة accounts
:
Outputswitched to db test
ابدأ بفحص إحصائيات قاعدة البيانات العامة عن طريق تنفيذ الطريقة stats()
:
الوسيطة المستخدمة لهذه الطريقة (1024*1024
) هي عامل النسبة وتخبر MongoDB بإعادة معلومات التخزين بالميجابايت. إذا حذفت هذا، فسيتم عرض القيم بالبايت جميعًا.
تقوم طريقة stats()
بإرجاع مخرجات مختصرة وموجزة تتعلق ببعض الإحصائيات الهامة المتعلقة بقاعدة البيانات الحالية:
Output{
"db" : "test",
"collections" : 3,
"views" : 0,
"objects" : 1000017,
"avgObjSize" : 80.8896048767171,
"dataSize" : 77.14365005493164,
"storageSize" : 24.109375,
"indexes" : 4,
"indexSize" : 9.9765625,
"totalSize" : 34.0859375,
"scaleFactor" : 1048576,
"fsUsedSize" : 4238.12109375,
"fsTotalSize" : 24635.703125,
"ok" : 1
}
توفر هذه المخرجات نظرة عامة على البيانات التي تخزنها هذه النسخة من MongoDB. يمكن أن تكون المفاتيح التالية المُرجعة في هذه المخرجات مفيدة بشكل خاص:
- المفتاح
objects
يوضح العدد الإجمالي للمستندات في قاعدة البيانات. يمكنك استخدام هذا لتقييم حجم قاعدة البيانات ونموها عند المراقبة عبر الوقت. avgObjectSize
يوضح الحجم المتوسط لهذه المستندات، مما يعطي فكرة عما إذا كانت قاعدة البيانات تعمل على مستندات كبيرة ومعقدة أم صغيرة. يتم عرض هذه القيمة دائمًا بالبايت، بغض النظر عما إذا كنت تحدد عامل مقياس أم لا.- المفاتيح
collections
وindexes
تُظهر عدد المجموعات والفهارس المعرفة حاليًا في قاعدة البيانات. - يُشير المفتاح
totalSize
إلى مقدار التخزين الذي تستهلكه قاعدة البيانات على القرص.
تساعد المعلومات التي تُرجعها طريقة stats()
في الحصول على فكرة حول كمية البيانات المخزنة حاليًا في قاعدة البيانات الخاصة بك، لكنها لا توفر رؤية حول أدائها أو المشاكل القائمة. لذلك، تأتي طريقة serverStatus()
الأكثر تفصيلاً ومفيدة:
تتميز مخرجات هذه الطريقة بالطول وتقدم الكثير من المعلومات حول استخدام الخادم:
Output{
"host" : "ubuntu-mongo-rs",
"version" : "4.4.6",
"process" : "mongod",
"pid" : NumberLong(658997),
"uptime" : 976,
. . .
"ok" : 1
}
على الرغم من أن كل هذه المعلومات يمكن أن تكون مفيدة بالإمكان، إلا أن هذا الدليل سيركز على ثلاثة أقسام بشكل خاص. أولاً، ابحث عن قسم connections
في هذه المخرجات:
Output . . .
"connections" : {
"current" : 4,
"available" : 51196,
"totalCreated" : 4,
"active" : 2,
"exhaustIsMaster" : 1,
"exhaustHello" : 0,
"awaitingTopologyChanges" : 1
},
. . .
كل خادم قاعدة بيانات يمكنه دعم عدد معين من الاتصالات في نفس الوقت. المفتاح current
يُظهر عدد العملاء المتصلين حاليًا بقاعدة البيانات، بينما available
هو عدد الاتصالات الغير المستخدمة التي تتوفر في قاعدة البيانات. قيمة totalCreated
تحتوي على عدد الاتصالات المستخدمة منذ بدء تشغيل الخادم.
معظم التطبيقات مصممة لإعادة استخدام الاتصالات الحالية ونادرًا ما تفتح اتصالات متعددة. لذلك، يمكن أن يكون عدد الاتصالات العالي، إذا لم يتم توقعه، علامة مربكة على سوء التكوين في كيفية وصول العملاء إلى الخادم.
إذا كان من المتوقع وجود عدد كبير من الاتصالات بسبب طبيعة الأعمال المنجزة، يمكنك النظر في إضافة واحد أو أكثر من الأقسام إلى مجموعة الشرائح لتوزيع حركة المرور عبر عدة نسخ من MongoDB.
بعد ذلك، ابحث عن قسم globalLock
في الإخراج. يتعلق هذا القسم بالقفل العام عبر كامل خادم قاعدة البيانات:
Output . . .
"globalLock" : {
"totalTime" : NumberLong(975312000),
"currentQueue" : {
"total" : 0,
"readers" : 0,
"writers" : 0
},
"activeClients" : {
"total" : 0,
"readers" : 0,
"writers" : 0
}
},
تستخدم MongoDB القفل لضمان تناسق البيانات عند تنفيذ عمليات متعددة، مما يضمن عدم قيام استعلامين متزامنين بتعديل نفس البيانات في نفس الوقت. على الخوادم المستخدمة بشكل كبير، هناك فرصة لحدوث تعطل في القفل، حيث ينتظر أحد أو أكثر من الاستعلامات حتى يتم إطلاق القفل قبل أن يتم تنفيذها.
تُظهر قيمة currentQueue.total
عدد الاستعلامات في انتظار إطلاق القفل لتنفيذها. إذا كانت هذه القيمة مرتفعة، فهذا يعني أن أداء قاعدة البيانات يتأثر وسيستغرق الاستعلامات وقتًا أطول للاكتمال.
غالبًا ما ينتج ذلك عن العديد من الاستعلامات طويلة الأمد التي تحمل القفل وقد يكون دليلاً على استخدام غير فعّال للفهارس أو استعلامات مصممة بشكل سيء، بين أسباب أخرى محتملة.
أخيرًا، ابحث عن قسم opcounters
:
Output "opcounters" : {
"insert" : NumberLong(10000007),
"query" : NumberLong(6),
"update" : NumberLong(6),
"delete" : NumberLong(0),
"getmore" : NumberLong(0),
"command" : NumberLong(1298)
},
يمكن أن يساعد هذا القسم من إخراج serverStatus()
على فهم ما إذا كانت خادم قاعدة البيانات مستخدمة بشكل رئيسي للقراءة أم الكتابة، أو ما إذا كان استخدامها متوازنًا بشكل جيد. في هذا المثال، بعد إدراج مستندات الاختبار، عداد العمليات للإدراج هو أعلى بكثير من العمليات للاستعلام. في سيناريو الحياة الواقعية، من المحتمل أن تكون هذه القيم مختلفة.
قد تستفيد قواعد البيانات الثقيلة في الكتابة من التوسيع الأفقي من خلال التجزئة. وبالمثل، ستستفيد قواعد بيانات MongoDB الثقيلة في القراءة عادةً من التكرار.
يمكن أن تعطي هذه الإحصاءات فكرة عامة عن كيفية استخدام الخادم وما إذا كانت هناك مشاكل في الأداء مثل طوابير القفل الطويلة في لحظة الوصول إليها. ومع ذلك، فإنها لا تعطي أي معلومات في الوقت الفعلي حول كيفية استخدام الخادم. لذا، فإن الأدوات المفيدة هي أوامر mongostat
و mongotop
.
الخطوة ٣ — استخدام mongostat
و mongotop
للحصول على إحصائيات قاعدة البيانات في الوقت الحقيقي
على الرغم من أن الأوامر المستخدمة للوصول إلى إحصائيات خادم MongoDB يمكن أن توفر نظرة فيما بعد على كيفية استخدام الخادم، إلا أنها لا تستطيع توفير معلومات في الوقت الحقيقي حول المجموعات التي تُستخدم بشكل أكثر نشاطًا في الوقت الحالي أو نوع الاستعلامات التي يتم تنفيذها.
توفر MongoDB أداتي نظام مفيدتين للرصد في الوقت الحقيقي تحليل لنشاط قاعدة البيانات وتحديث مستمر للمعلومات التي تقدمها: mongostat
و mongotop
. mongostat
يوفر نظرة عامة موجزة عن حالة مثيل MongoDB الحالي، بينما mongotop
يتتبع كم من الوقت يقضي المثيل في العمليات القراءة والكتابة. يتم تشغيل هذه الأدوات من سطر الأوامر، بدلاً من واجهة سطر الأوامر في MongoDB.
لاستخدام mongostat
، احتفظ باتصال سطر الأوامر الحالي بـ MongoDB، وافتح نافذة الطرفية الثانية للوصول إلى واجهة سطر الأوامر للخادم الخاص بك. في نافذة سطر الأوامر الثانية، قم بتشغيل الأمر mongostat
:
كما ذكر سابقاً، يتطلب mongostat
امتيازات متقدمة. إذا كنت قد قمت بتمكين المصادقة على مثيل MongoDB الخاص بك وقمت بإعداد مستخدم بالأدوار المناسبة، فستحتاج إلى المصادقة كذلك باستخدام اسم المستخدم الخاص بهم وقاعدة البيانات للمصادقة (كما هو موضح في هذا المثال) ثم إدخال كلمة المرور الخاصة بهم عند الطلب.
في التكوين الافتراضي، يطبع mongostat
العدادات للاستعلامات التي تُنفذ حاليًا بفواصل زمنية تبلغ ثانية واحدة:
Outputinsert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 1|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 223b 84.4k 7 Nov 28 15:40:40.621
*0 *0 *0 *0 0 2|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 224b 84.8k 7 Nov 28 15:40:41.619
*0 *0 *0 *0 0 1|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 223b 84.5k 7 Nov 28 15:40:42.621
*0 *0 *0 *0 0 3|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 365b 85.0k 7 Nov 28 15:40:43.619
إذا كانت نتيجة إخراج mongostat
تُظهر قيمة 0
لنوع استعلام معين، فهذا يشير إلى أن قاعدة البيانات لا تقوم بتنفيذ أي عمليات من هذا النوع. يُظهر هذا المثال قيمة 0
لكل نوع استعلام، مما يعني أنه لا توجد استعلامات قيد التشغيل حالياً.
يجب أن تظل لديك نافذة الطرفية الأولى مفتوحة ومتصلة بالمجموعة الفرعية الخاصة بك في MongoDB. أدخل بعض المستندات التجريبية الإضافية في مجموعة accounts
وتحقق مما إذا كان mongostat
سيلاحظ النشاط:
هذا هو حلقة for
مماثلة لتلك التي قمت بتشغيلها في الخطوة 1. ومع ذلك، في هذه المرة، تقوم الحلقة بإدخال فقط 10000 إدخال. يتم بادئة أرقام الحساب بـ 2000
، والعملة هي دائمًا الدولار الأمريكي.
أثناء إدخال المستندات الجديدة، تحقق من إخراج mongostat
:
Output. . .
*0 *0 *0 *0 0 1|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 112b 42.5k 4 Nov 28 15:50:33.294
*0 *0 *0 *0 0 0|0 0.0% 38.7% 0 1.54G 210M 0|0 1|0 111b 42.2k 4 Nov 28 15:50:34.295
755 *0 *0 *0 0 1|0 0.1% 38.8% 0 1.54G 210M 0|0 1|0 154k 79.4k 4 Nov 28 15:50:35.294
2853 *0 *0 *0 0 0|0 0.4% 39.1% 0 1.54G 211M 0|0 1|0 585k 182k 4 Nov 28 15:50:36.295
2791 *0 *0 *0 0 1|0 0.7% 39.4% 0 1.54G 212M 0|0 1|0 572k 179k 4 Nov 28 15:50:37.293
2849 *0 *0 *0 0 0|0 1.0% 39.7% 0 1.54G 213M 0|0 1|0 584k 182k 4 Nov 28 15:50:38.296
745 *0 *0 *0 0 2|0 1.1% 39.8% 0 1.54G 213M 0|0 1|0 153k 79.2k 4 Nov 28 15:50:39.294
*0 *0 *0 *0 0 0|0 1.1% 39.8% 0 1.54G 213M 0|0 1|0 111b 42.2k 4 Nov 28 15:50:40.295
*0 *0 *0 *0 0 2|0 1.1% 39.8% 0 1.54G 213M 0|0 1|0 167b 42.7k 4 Nov 28 15:50:41.293
. . .
أثناء تشغيل الاستعلام، تبدأ الأسطر الجديدة المُرجعة بواسطة mongostat
في عرض قيم غير 0
. في عمود الإدراج الذي يُظهر عدد الاستعلامات التي تقوم بإدراج بيانات جديدة إلى قاعدة البيانات، كانت القيم أعلى لعدة ثوانٍ. نظرًا لأن mongostat
يعرض البيانات بفاصل زمني يبلغ ثانية واحدة، يمكنك أن تجد ليس فقط نسبة الإدراجات مقارنة بأنواع العمليات الأخرى في قاعدة البيانات، ولكن أيضًا مدى سرعة إدراج البيانات الجديدة في قاعدة البيانات. في هذا المثال، تحقق الخادم من تقريبًا 3000 إدراج في الثانية.
يمكنك استخدام mongostat
لمراقبة العبء الحالي لخادم قاعدة البيانات، مجمعًا حسب أنواع الاستعلامات. الأداة الثانية التي تأتي مع MongoDB — mongotop
— تُظهر نشاط خادم قاعدة البيانات مجمعًا حسب المجموعات.
قم بإيقاف تشغيل mongostat
في نافذة الطرفية الثانية الخاصة بك عن طريق الضغط على CTRL + C
. ثم قم بتشغيل mongotop
في نفس الطرفية. مرة أخرى، إذا كان التحقق من الهوية ممكنًا، فستحتاج إلى التحقق من الهوية كمستخدم ذي صلاحيات مناسبة:
mongotop
يخرج قائمة بجميع المجموعات في قاعدة البيانات، مصحوبة بالوقت المستغرق في القراءات والكتابات وبالإجمالي داخل نافذة الزمن. بالمثل، مثل mongostat
، يُحدَّث الإخراج كل ثانية:
Output2021-11-28T15:54:42.290+0000 connected to: mongodb://localhost/
ns total read write 2021-11-28T15:54:43Z
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
test.accounts 0ms 0ms 0ms
. . .
حاول إدراج بعض الوثائق الإضافية في قاعدة البيانات لمعرفة ما إذا كان النشاط مُسجَّلًا في mongotop
. في واجهة سطر الأوامر لـ MongoDB، قم بتنفيذ الحلقة التالية بعد ذلك، ثم أراقب النافذة الطرفية مع mongotop
في التشغيل:
هذه المرة، سيكون النشاط مرئيًا في إحصائيات mongotop
.
Output. . .
ns total read write 2021-11-28T15:57:27Z
test.accounts 127ms 0ms 127ms
admin.$cmd.aggregate 0ms 0ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
ns total read write 2021-11-28T15:57:28Z
test.accounts 130ms 0ms 130ms
admin.$cmd.aggregate 0ms 0ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
. . .
هنا، يوضح mongotop
أن جميع أنشطة قاعدة البيانات حدثت في مجموعة accounts
في قاعدة البيانات test
وأن جميع العمليات في نافذة الوقت كانت عمليات كتابة. يجب أن تتماشى كل هذه المعلومات مع عملية الحلقة for
التي قمت بتنفيذها.
كما هو الحال مع mongostat
، يمكنك إيقاف mongotop
عن طريق الضغط على CTRL + C
.
عند الملاحظة أثناء ذروة العبء، يمكنك استخدام mongotop
لمراقبة كيفية انتشار أنشطة قاعدة البيانات عبر مجموعات مختلفة لمساعدتك في فهم مخطط البيانات الخاص بك والتخطيط للتوسيع. كما يوفر نظرة داخلية في ما إذا كان استخدام مجموعة معينة أكثر توجهًا نحو القراءة أم الكتابة.
الخطوة 4 — استخدام مسجل قاعدة بيانات MongoDB لتحديد الاستعلامات البطيئة
يمكن أن تأتي العقبات في أداء قاعدة البيانات من مصادر متعددة. على الرغم من أن توسيع قاعدة البيانات (أفقيًا أو رأسيًا) هو في كثير من الأحيان الحل لعقبات الأداء، إلا أن سببها قد لا يكون في الحقيقة حدود قاعدة البيانات بل مشاكل في تصميم البيانات أو الاستعلام.
إذا كانت الاستعلامات تعمل لفترة زمنية طويلة، قد يكون السبب في استخدام غير فعال للفهارس أو أخطاء في الاستعلام نفسه. غالبًا ما تذهب الاستعلامات طويلة الأمد دون أن تلاحظ خلال تطوير التطبيق، عادةً لأن مجموعات البيانات الاختبارية صغيرة جدًا أو الظروف مختلفة عن تلك في الإنتاج.
يمكنك بشكل محتمل العثور على المسبب عن طريق تنفيذ استعلامات الاختبار يدوياً والتحقق من الاستعلامات التي تعمل بشكل غير جيد، على الرغم من أن هذا قد يكون مملًا للغاية. لحسن الحظ، يمكن لأداة تتبع قاعدة بيانات MongoDB أن تقوم بذلك تلقائيًا.
يمكن لأداة تتبع قاعدة بيانات MongoDB تسجيل الاستعلامات والإحصائيات حول تنفيذها عندما تتطابق مع شروط معينة. من بين أهم هذه الشروط هو وقت تنفيذ الاستعلام: إذا استغرق استعلام وقتًا أطول من الوقت المحدد لتنفيذه، فسوف يقوم المتتبع بتمييز تلك الاستعلامات تلقائيًا كاستعلامات مشكلة. باستخدام المتتبع، يمكنك تحديد الاستعلامات التي تؤدي بشكل سيء ثم التركيز على إصلاح تلك المشاكل بشكل خاص.
قبل استخدام المتتبع، قم بتنفيذ الاستعلام التالي. سيقوم هذا الاستعلام باسترداد أحد الحسابات التي أدخلتها، على الرغم من أنه ليس بسيطًا كما قد يبدو في البداية:
سيقوم الأمر باسترداد الحساب الدقيق الذي طلبته:
Output{ "_id" : ObjectId("61a38fd5eedf737ac8e54e96"), "number" : "1000-20", "currency" : "EUR", "balance" : 24101.14770458518 }
قد لاحظت أن الاستعلام لم يتم تنفيذه على الفور، واستغرق MongoDB لحظة أو لحظتين للعثور على الحساب. في تطبيق العالم الحقيقي، قد يكون هناك أنواع كثيرة من الاستعلامات التي تؤدي بشكل سيء، وقد لا تلاحظ أدائها ضعفها في الممارسة.
يمكنك تكوين MongoDB لمساعدتك في تحديد الاستعلامات التي تستغرق وقتًا أطول من المتوقع. للقيام بذلك، قم أولاً بتمكين المتتبع عن طريق تنفيذ الأمر التالي:
تأخذ طريقة setProfilingLevel()
معها متغيرين. الأول هو مستوى التتبع، والذي يمكن أن يكون إما 0
، 1
، أو 2
:
0
يعطل المتتبع1
يمكّن المتتبع فقط على الاستعلامات البطيئة التي تستوفي الشرط2
يُمكن المُلف الشخصي لجميع الاستعلامات.
في هذا المثال، سيقوم المُلف الشخصي بتحليل الاستعلامات التي تستغرق وقتًا أطول من 100 ميلي ثانية، كما هو محدد بالمعامل الثاني، { slowms: 100 }
.
ملاحظة: استخدام المُلف الشخصي يؤثر سلبًا على الأداء، حيث يجب على MongoDB الآن تحليل الاستعلامات بالإضافة إلى تنفيذها. يجب استخدامه بحذر عند مراقبة نقاط ضعف الأداء.
من الممكن تخصيص مجموعة فرعية أكبر من الاستعلامات التي سيتم تسجيلها بواسطة المُلف الشخصي عن طريق تكوينه لتسجيل نسبة معينة من الاستعلامات فقط أو تصفية حسب نوع الاستعلام. لمعرفة المزيد حول كيفية الحصول على مزيد من التحكم في المُلف الشخصي، راجع الوثائق الرسمية حول هذا الموضوع.
سيقوم هذا الأسلوب بإرجاع رسالة نجاح:
Output{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
من الآن فصاعدًا، ستُمكّن مُراقبة قاعدة البيانات و MongoDB سيُراقب بنشاط كل استعلام تقوم بتنفيذه للعثور على أي استعلام يستغرق أكثر من 100 ميلي ثانية لاستكماله.
جرّب ذلك عن طريق تنفيذ بعض الاستعلامات المختلفة. أولاً، استخدم أمر count
للعثور على عدد الوثائق في مجموعة accounts
:
سيُرجع هذا الأمر بسرعة عدد الوثائق في المجموعة:
Output1020000
ثم، حاول البحث عن أول ثلاثة حسابات بنكية تظهر في المجموعة:
مرة أخرى، ستُرجع قاعدة البيانات النتائج بسرعة:
Output{ "_id" : ObjectId("61ef40640f2ba52efc56ee17"), "number" : "1000-1", "currency" : "EUR", "balance" : 25393.132960293842 }
{ "_id" : ObjectId("61ef40640f2ba52efc56ee18"), "number" : "1000-2", "currency" : "EUR", "balance" : 63629.42056192393 }
{ "_id" : ObjectId("61ef40640f2ba52efc56ee19"), "number" : "1000-3", "currency" : "EUR", "balance" : 75602.12331602155 }
وأخيرًا، قم بتشغيل استعلام البحث عن الحساب المصرفي الخاص مرة أخرى:
ستعيد هذا الاستعلام النتيجة ولكن، مثل السابق، سيستغرق لحظة أو اثنتين أطول من العمليات السابقة:
Output{ "_id" : ObjectId("61a38fd5eedf737ac8e54e96"), "number" : "1000-20", "currency" : "EUR", "balance" : 24101.14770458518 }
لا ينتج الملف التعريفي أي إخراج بالرغم من أن الاستعلام كان أبطأ بوضوح. بدلاً من ذلك، يتم تسجيل تفاصيل عمليات البطء في مجموعة خاصة داخل قاعدة البيانات المسماة system.profile
. تعتبر هذه المجموعة مجموعة محدودة الحجم لا تتجاوز 1 ميغابايت. وهذا يعني أنها ستحتوي دائمًا على قائمة تحتوي على أحدث استعلامات بطيئة فقط.
لاسترداد المعلومات حول الاستعلامات التي تم تحديدها بواسطة الملف التعريفي، يجب عليك الاستعلام عن مجموعة system.profile
بطريقة مثل هذه:
يستخدم هذا الاستعلام الطريقة find()
كالمعتاد. كما أنه يتضمن شرط sort
الذي يحتوي على { "ts" : -1 }
كوسيطة. سيقوم هذا بفرز مجموعة النتائج بالاستعلامات الأخيرة أولاً. وأخيرًا، ستقوم الطريقة pretty()
في النهاية بعرض الإخراج بتنسيق أكثر قراءة.
يتم تمثيل كل استعلام بطيء كوثيقة عادية، و system.profile
هو مثل أي مجموعة عادية. وهذا يعني أنه يمكنك تصفية النتائج، وفرزها، وحتى استخدامها في خطوط أنابيب التجميع لتضييق أو تحليل قائمة الاستعلامات التي تم تحديدها بواسطة الملف التعريفي.
لاحظ أن النتيجة تتكون فقط من وثيقة واحدة. تم تنفيذ الاستعلامين الآخرين بسرعة كافية لعدم تنشيط الملف التعريفي:
Output{
"op" : "query",
"ns" : "test.accounts",
"command" : {
"find" : "accounts",
"filter" : {
"number" : "1000-20"
},
. . .
},
"nreturned" : 1,
"keysExamined" : 0,
"docsExamined" : 1030000,
. . .
"millis" : 434,
"planSummary" : "COLLSCAN",
. . .
}
يوفر هذا الإخراج عددًا من التفاصيل حول تنفيذ الاستعلام البطيء:
- مفتاح
op
يُظهر نوع العملية التي تمثل هذه المعلومات. هنا، إنها عمليةquery
، حيث تُمثّل عملية استخدمت فيهاfind()
لاسترجاع البيانات من قاعدة البيانات. - مفتاح
ns
يشير إلى قاعدة البيانات والمجموعة التي شاركت في العملية. كما يُظهر الإخراج، تم استعلام المجموعةaccounts
في قاعدة البياناتtest
. - مفتاح
command
يوفر مزيدًا من المعلومات حول الاستعلام نفسه. في هذه الحالة، يحتوي مفتاحfilter
على مستند الفلترة بالكامل. باستخدام المعلومات الواردة من الحقولop
وcommand
، يمكنك إعادة بناء الاستعلام المطروح. - في حقل
millis
، ستجد الوقت الدقيق الذي استغرقه الاستعلام للاكتمال. في هذا المثال، تقريبًا نصف ثانية. - يوفر حقل
docsExamined
عدد الوثائق التي تم فحصها لإرجاع مجموعة النتائج. nreturned
يُمثل عدد الوثائق التي أرجعتها الاستعلام. في هذا المثال، تم إرجاع وثيقة واحدة فقط من أكثر من مليون تم فحصها.- تُظهر
planSummary
الطريقة التي استخدمتها MongoDB لتنفيذ الاستعلام.COLLSCAN
يُقابل فحص المجموعة بالكامل، مما يعني أنه استعرض كل وثيقة في المجموعة واحدة تلو الأخرى للعثور على الحساب المصرفي المطابق.
جميع هذه المعلومات تؤكد على الحاجة إلى فهرس يمكن أن يساعد MongoDB في تنفيذ هذا الاستعلام بشكل أسرع. كان على قاعدة البيانات أن تتفحص المجموعة بأكملها للعثور على وثيقة واحدة، كما يشير الفارق الكبير بين عدد الوثائق التي تم فحصها والتي تم إرجاعها، فضلاً عن استراتيجية التنفيذ.
في هذا المثال المحدد، إنشاء فهرس لدعم الاستعلامات التي تقوم بتصفية البيانات استنادًا إلى حقل number
سيوفر دفعة فورية لأداء هذه الأنواع من الاستعلامات. في السيناريوهات الحقيقية، قد تختلف حلول الاستعلامات البطيئة وتعتمد على الاستعلام الدقيق الذي يسبب المشاكل.
لإنهاء جلسة التحليل، يمكنك تعطيل المحلل عن طريق ضبط مستوى التحليل على الصفر:
سينجح العملية مع رسالة تأكيد:
Output{ "was" : 1, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
الآن تعود قاعدة البيانات إلى التشغيل العادي دون حدوث تحليل خلف الكواليس.
كلما اشتبهت في أن الاستعلامات البطيئة قد تكون لها تأثير سلبي على أداء قاعدة بياناتك، يمكنك استخدام المحلل للعثور عليها وفهم هيكلها بشكل أفضل وكيفية تنفيذها. بهذه المعلومات، ستكون مجهزًا بشكل أفضل لضبطها وتحسين أدائها.
الاستنتاج
بمتابعة هذا الدليل، تعلمت كيفية العثور على إحصائيات خادم MongoDB وكيفية استخدام أدوات التشخيص مثل mongotop
، mongostat
، بالإضافة إلى آلية تتبع قاعدة بيانات MongoDB. يمكنك استخدام هذه الأدوات للحصول على فهم أفضل لأعباء عمل قاعدة البيانات الخاصة بك، وتحديد المجموعات الأكثر نشاطًا، وما إذا كان الخادم يؤدي أساسًا عمليات كتابة أم قراءة. يمكنك أيضًا تحديد الاستعلامات البطيئة التي تؤثر على أداء MongoDB من أجل استبدالها بأخرى أكثر كفاءة.
هذه مجرد مجموعة مختارة من الأدوات والتقنيات التي يمكنك استخدامها لمراقبة صحة وأداء تثبيت MongoDB الخاص بك والتصرف وفقًا لها. يمكن تكوين كل هذه الأدوات بشكل أكبر وتخصيصها لتوفير رؤية مستهدفة أكثر لأداء الخادم. نشجعك على دراسة وثائق MongoDB الرسمية لمعرفة المزيد حول التقنيات التي يمكنك استخدامها لمراقبة أداء الخادم والتصرف وفقًا لها.
Source:
https://www.digitalocean.com/community/tutorials/how-to-monitor-mongodb-s-performance