بيع حساب Alibaba Cloud: تجمع توصيل مثيل MongoDB ممتلئ والتحقيق في حظر الاستعلام البطيء الناجم عن عدم وجود فهرس
في عملية تحسين تحسين أداء موقع الويب وتعديل الأداء ، واجهت العديد من "الحوادث" المروعة: لا يزال موقع الويب يعمل بسلاسة قبل ثانية واحدة ، وفجأة ارتفع وقت استجابة واجهة API إلى بضع ثوانٍ أو حتى عشر ثوانٍ ، ثم تم إلقاء عدد كبير من 504 Gateway Timeout على الواجهة الأمامية ، تزحف محركات البحث Spider (مثل Googlebot و Baidubot) إلى معدل نجاح الانهيار الجليدي الفوري.
بصفتي محسّنًا لموقع SEO ، فأنا أدرك تمامًا التأثير المميت لأداء قاعدة البيانات على موقع SEO. متطلبات محركات البحث لسرعة تحميل الصفحة (TTFB و LCP وغيرها من مؤشرات Core Web Vitals) صارمة للغاية. إذا كان هناك توقف في قاعدة البيانات ، مما يؤدي إلى مهلة الواجهة الأمامية ، فسيحدد محرك البحث بسرعة موقع الويب الخاص بك على أنه "غير موثوق به" ، ويقطع تكرار الزحف مباشرة ، مما يؤدي إلى تعليق التضمين وتراجع ترتيب الكلمات الرئيسية.
وفي الاستخدام
علي يون ApsaraDB for MongoDB
في ذلك الوقت ، فإن "الجاني" الأكثر شيوعًا الذي يسبب هذا النوع من كوارث الأداء هو
الاستعلام البطيء (Slow Query) الناجم عن عدم وجود فهرس وحجب السلسلة الناجم عن Connection Pool Exhaustion
.
اليوم ، من التحقيق القتالي الفعلي ، وتحليل المبدأ إلى تحسين الكود والهندسة المعمارية ، سأشرح لك تمامًا كيفية التحقيق في هذه المشكلة وحلها تمامًا.
1. لماذا يفجر "غير الفهرس" على الفور "تجمع الاتصال" ؟
لحل المشكلة ، يجب علينا أولاً معرفة ما بين الاثنين
تأثير كرة الثلج (تأثير الانهيار الجليدي)
.
1-مسح الجدول الكامل (COLLSCAN) يستنفد وحدة المعالجة المركزية مع I/O
عندما يبدأ تطبيقك طلب استعلام إلى MongoDB (مثل الاسترجاع وفقًا لمعرف المستخدم أو تصنيف المقالة أو العلامة) ، إذا كان الحقل المقابل
لا يوجد فهرس
، كان على MongoDB تنفيذ
COLLSCAN
(مسح الجدول الكامل).
يحتاج إلى قراءة المجموعة بأكملها (المجموعة) على القرص واحدة تلو الأخرى ومقارنتها. إذا كان هناك مئات الآلاف أو حتى ملايين البيانات في المجموعة ، فسيستهلك استعلام واحد الكثير من موارد حساب وحدة المعالجة المركزية و I/O للقرص.
2. عالق الاستعلام البطيء في الاتصال ، ويتم ضغط تجمع الاتصال بسرعة
عادةً ما تستخدم أطر الويب (مثل Node.js و Java Spring Boot و Python Django وما إلى ذلك) مجموعة اتصال قاعدة البيانات لإعادة استخدام الاتصال.
الظروف العادية: يتم الانتهاء من الاستعلام 2 مللي ثانية ، ويتم تحرير الاتصال ، ويتم إعادة تدويره إلى تجمع الاتصال ، ويتم توفير الطلب التالي للاستخدام.
حالة غير عادية: يستغرق الاستعلام البطيء غير المفهرس 3 ثوانٍ لإكماله. في هذه الثواني الثلاث ، يكون الاتصال حصريًا.
يبدأ الانهيار الجليدي: يستمر تدفق الطلبات الجديدة مع وصول المستخدمين إلى محرك البحث Spider والاستيلاء عليه. نظرًا لأن جميع الاتصالات السابقة عالقة في الاستعلام البطيء ، لا يمكن إجبار الطلبات الجديدة إلا على إنشاء طلبات جديدة
الاتصال. في وقت قصير جدًا ، سيصل عدد الاتصالات إلى الحد الأعلى لترخيص مواصفات مثيل Alibaba Cloud MongoDB (Max Connections).
في النهاية ، يكون تجمع الاتصال ممتلئًا تمامًا ، وسيتم طرح جميع الطلبات اللاحقة التي تحاول الحصول على اتصال بقاعدة البيانات
إتّبع من الباب
، مما تسبب في شل أعمال المحطة بأكملها.
2. الخطوة الأولى: كيفية استخدام Alibabi Cloud Console and Order لتحديد موقع "الاستعلام البطيء" بسرعة
عندما تكون مجموعة الاتصال ممتلئة ، فإن إعادة تشغيل خدمات الويب بشكل أعمى أو ترقية تكوين مثيل MongoDB غالبًا ما يعالج الأعراض وليس السبب الجذري. تحتاج إلى تحديد موقع "الجاني" بدقة وفقًا لعملية التوحيد القياسي التالية.
1. استخدام وظيفة "السجل البطيء" لوحدة التحكم Alibaba Cloud MongoDB
قم بتسجيل الدخول إلى وحدة التحكم Alibaba Cloud MongoDB.
حدد المنطقة التي توجد بها المثيل في شريط التنقل العلوي ، وانقر على معرف المثيل المستهدف.
حدد مراقبة السحاب والسجلات-> السجلات البطيئة (أو إدارة السجلات) في شريط القوائم الأيسر.
قم بتعيين النطاق الزمني للتحقيق (أي نقطة البداية للإبلاغ عن أخطاء العمل) ، مع التركيز على المعلمات التالية: وقت التنفيذ (وقت التنفيذ): يجب أن تكون جميع الاستفسارات التي تتجاوز 100 مللي ثانية متيقظة ، وآلاف المللي ثانية هي استعلامات بطيئة قاتلة. Docs Examined (عدد المستندات الممسوحة ضوئيًا) و Docs Returned (عدد المستندات التي تم إرجاعها): إذا كان Docs Examined عشرات أو حتى مئات الآلاف ، في حين أن Docs Returned لا يحتوي إلا على عدد قليل أو أكثر من عشرة ، فهذا نقص نموذجي في خصائص الفهرس!
نصائح التشغيل والصيانة والبنية التحتية: عند التحقق من أداء قاعدة البيانات السحابية والاستعداد لإجراء تغييرات مؤقتة في المواصفات (مثل إضافة وحدة المعالجة المركزية/الذاكرة لوقف النزيف في حالات الطوارئ) أو فتح خدمة السجل (SLS) لاسترجاع السجل العميق ، تأكد من الحفاظ على حالة تشغيل الحساب والصيانة طبيعية. يوصى بترتيب تخطيط الميزانية مسبقًا واستكمال إعادة شحن حساب Alibaba Cloud في تعديل هيكل حفظ السلام العادي لضمان وجود رصيد كافٍ من الحساب. يمكن أن يؤدي ذلك إلى تجنب محدودية وظائف المراقبة المتقدمة لوحدة التحكم ، أو انقطاع النسخ الاحتياطي ، أو حتى تخفيض أو قفل قاعدة البيانات السحابية بالقوة بسبب المتأخرات ، مما يؤثر على وقت الإنقاذ الذهبي لاستكشاف الأخطاء وإصلاحها.
2. تسجيل الدخول إلى تنفيذ MongoDB
CurrentOp ()
تشخيص انسداد في الوقت الحقيقي
إذا كان لديك حق القراءة والكتابة في قاعدة بيانات MongoDB ، يمكنك تسجيل الدخول إلى قاعدة البيانات مباشرة من خلال Mongo Shell أو Data Management Service (DMS) ، وتشغيل الأوامر التالية لعرض الإجراءات التي يتم تنفيذها حاليًا والتي تستغرق وقتًا طويلاً:
جافا سكريبت
// الاستعلام عن العمليات غير المتعلقة بالنظام التي تم تنفيذها لأكثر من ثانيتين وهي قيد التشغيل
Db. currentOp({
"Active": صحيح ،
"Secs_running": {"$ gt": 2} ،
"Ns": {
"$ Ne": "local.oplog.rs"}
})
في النتائج التي تم إرجاعها ، ركز على:
Summary: إذا تم عرضه على أنه COLLSCAN ، فهذا يعني أن البيان يتم مسحه ضوئيًا في الجدول الكامل.
Client: عنوان IP لخادم التطبيق الذي يبدأ هذا الاستعلام البطيء.
Command: استعلام محدد عن بيان JSON.
3. الخطوة الثانية: تشخيص الاستعلام البطيء وتحسين الفهرس
بعد تحديد موقع بيان الاستعلام البطيء محددة ، نحن بحاجة إلى استخدام MongoDB
Explain ()
يقوم المحلل بتشخيصه وفهرسته بدقة.
1-الاستخدام
Explain ("executionStats")
تحليل خطة الاستعلام
في DMS أو أداة العميل ، بعد عبارة الاستعلام البطيء ، أضف
. Explain ("executionStats")
:
جافاسكريبت
Db. articles.find({ "category": "seo" ، "status": "published" }).sort({ "created_at": -1 }).explain("executionStats")
التركيز على المؤشرات الأساسية في نتائج المخرجات:
Stage: إذا كان COLLSCAN ، فيجب فهرسته ؛ إذا كان IXSCAN ، يتم استخدام الفهرس.
TotalDocsExamined: العدد الإجمالي للوثائق الممسوحة ضوئيا.
NReturned: عدد المستندات التي تتطابق بالفعل. في الحالة المثالية ، يجب أن تكون totalDocsExamined قريبة من nReturned قدر الإمكان.
Stage: "SORT": إذا حدثت هذه المرحلة ، فهذا يعني أن MongoDB يتم فرزها في الذاكرة ، وسوف تستهلك وحدة المعالجة المركزية بشكل كبير عندما تكون كمية البيانات كبيرة.
2. اتبع مبادئ ESR لإنشاء فهرس مركب (مؤشر مركب)
بالنسبة للاستعلام متعدد الشروط والمشاهد مع الفرز ، يجب أن يتبع إنشاء فهرس مركب
مبادئ ESR
:
E - Equality (مطابقة القيمة المكافئة): ضع حقلاً للبحث الدقيق (مثل status: "published").
S - Sort (الفرز): ضع الحقول المستخدمة لـ sort() (مثل created_at: -1).
R - Range (استعلام النطاق): ضع حقلاً للبحث عن النطاق (مثل views: { $ gt: 100 }).
مثال على إنشاء فهرس:
جافاسكريبت
// إنشاء فهرس مركب لمجموعة من المقالات يتوافق مع مبادئ ESR
Db. articles.createIndex (
{"Status
": 1 ،" created_at ": -1 ،" views ": 1} ،
{Background: true ، name: "idx_status_created_views"}
)
ملاحظة: لإنشاء فهرس في بيئة الإنتاج ، يوصى بإضافة {background: true }(تم تحسين الخلفية افتراضيًا في الإصدار 4.2 من MongoDB) لتجنب جدول قفل عملية الفهرس الذي يؤدي إلى حدوث كارتون جديد.
4. الخطوة الثالثة: ضبط معلمات تجمع التوصيل وآلية منع الانهيارات الجليدية
بعد حل مشكلة الفهرس ، نحتاج أيضًا إلى تكوين معلمات تجمع اتصال قاعدة البيانات المعقولة في طبقة التطبيق لمنع تجمع الاتصال من الأكل مرة أخرى بسبب التدفق المفاجئ في المستقبل.
1. التكوين العلمي حجم تجمع توصيل طبقة التطبيق (Max Pool Size)
يعتقد العديد من المطورين خطأً أنه "كلما زاد إعداد تجمع الاتصال ، كان ذلك أفضل" ، وهو في الواقع سوء فهم كبير. سوف أعمى
MaxPoolSize
لن يستهلك تعيين 500 أو حتى 1000 الكثير من ذاكرة الخادم فحسب ، بل سيؤدي أيضًا إلى انخفاض الإنتاجية الإجمالية بسبب تبديل السياق المتكرر لوحدة المعالجة المركزية.
الصيغة الموصى بها: Max Connections = (وحدة المعالجة المركزية الأساسية * 2) عدد التزامن على القرص
تكوين التطبيق العام: تقوم عقدة تطبيق ويب واحدة بتعيين maxPoolSize إلى 20 ~ 50 عادة ما تكون كافية للتعامل مع التزامن العالي. إذا كانت هناك عدة عقد تطبيق ، فمن الضروري التأكد من أن مجموع maxPoolSize لجميع العقد أقل من الحد الأقصى لعدد الاتصالات التي تدعمها مواصفات مثيل Alibrian MongoDB.
تكوين الاتصال الموصى به مع Node.js Mongoose كمثال:
جافاسكريبت
Const mongoose = require ("mongoose") ؛
Const options = {
MaxPoolSize: 30 ، // الحد من الحد الأقصى لعدد الاتصالات ، ومنع الأكل الكامل في قاعدة البيانات
MinPoolSize: 5, // الحفاظ على الحد الأدنى لعدد الاتصالات الخاملة
ServerSelectionTimeoutMS: 5000, // البحث عن وقت مهلة الخادم المتاحة (5 ثواني)
SocketTimeoutMS: 45000, // Socket القراءة والكتابة مهلة الوقت
Family: 4 // فرض استخدام IPv4
} ؛
Mongoose. connect('mongodb:// root:[email protected]
Om: 3717/admin ؟ ReplicaSet = mgset-xxx' ، options) ؛
2. إدخال الحماية من العمل الإضافي والانصهار
عند بدء استعلام قاعدة البيانات في طبقة التطبيق ، تأكد من تعيين وقت مهلة معقول (مثل
MaxTimeMS
) ، تأكد من أنه حتى عند مواجهة استعلام معقد ، يمكنك التخلص من الحالات الشاذة وتحرير الاتصال خلال فترة زمنية محددة ، بدلاً من تعليق تجمع الاتصال إلى أجل غير مسمى.
جافاسكريبت
// الحد الأقصى لوقت التنفيذ لاستعلام واحد هو 2000 مللي ثانية
Db. articles.find({الفئة: "seo" }).maxTimeMS(2000) ؛
5. ملخص تحسين موقع SEO: الأداء هو شريان الحياة لـ SEO
بصفتي محسّنًا لموقع SEO ، غالبًا ما أقول:"
أي SEO خارج القاعدة التقنية وسرعة التحميل هي جناح في السماء.
”
Crawl Budget (Crawl Budget): عندما يكون لدى MongoDB مهلة متكررة للواجهة بسبب عدم وجود فهرس ومجمع اتصال كامل (504) ، فإن كفاءة الزحف لمحرك البحث Spider ستنخفض بشكل كبير. قم بتنظيف الاستعلام البطيء في الوقت المناسب وتحسين تجمع الاتصال ، بحيث يمكن لواجهة موقع الويب الحفاظ على استجابة ميلي ثانية ، مما يزيد بشكل مباشر من سرعة الزحف والتضمين لمحرك البحث.
ضمان تجربة Core Web Vitals: استجابة قاعدة البيانات السريعة هي أساس تقليل TTFB (وقت البايت الأول). كلما كان عرض الصفحة أسرع ، انخفض معدل الارتداد للمستخدم ، وزاد الوزن الشامل للصفحة في محرك البحث.
انتبه إلى إدارة البنية التحتية السحابية: لا يقتصر تعديل قاعدة البيانات على كتابة رمز جيد وإنشاء فهرس جيد فحسب ، بل ينعكس أيضًا في التشغيل والصيانة اليومية الدقيقة للموارد السحابية. عند توسيع مواصفات MongoDB ، أو فتح DAS (خدمة ضبط قاعدة بيانات قاعدة البيانات تلقائيًا) أو تدقيق السجل ، يمكن أن يضمن الحفاظ على تخطيط ميزانية جيد وعادات إعادة شحن حساب Alibaba Cloud أن خدمات المراقبة السحابية والإنذار وقاعدة البيانات المستقلة تكون دائمًا على الإنترنت لمنع المشاكل قبل حدوثها.
من خلال"
تحديد موقع السجل البطيء-> تحليل explain()-> فهرسة ESR-> تحسين معلمات تجمع الاتصال
"هذه المجموعة من التحقيق القياسي في الحلقة المغلقة ، يمكنك حل المشكلة المزمنة تمامًا لحجب الاستعلام البطيء عن Alibabyun MongoDB ومسبح الاتصال الكامل ، وبناء بنية قاعدة بيانات أساسية سريعة ومستقرة لموقع الويب!

