การขายบัญชี Alibaba Cloud: พูลการเชื่อมต่ออินสแตนซ์ MongoDB เต็มและไม่มีการสร้างดัชนี
ในกระบวนการเพิ่มประสิทธิภาพ SEO เว็บไซต์และการปรับแต่งประสิทธิภาพฉันพบ "อุบัติเหตุ" ที่น่าตกใจมากมาย: เว็บไซต์ยังคงดำเนินไปอย่างราบรื่นในวินาทีแรกและทันใดนั้นเวลาตอบสนองของอินเทอร์เฟซ 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) ระบาย CPU กับ I/O
เมื่อแอปพลิเคชันของคุณเริ่มคำขอแบบสอบถามไปยัง MongoDB (เช่นการค้นหาตาม ID ผู้ใช้การจัดหมวดหมู่บทความหรือแท็ก) หากฟิลด์ที่เกี่ยวข้อง
ไม่มีการจัดทำดัชนี
MongoDB ต้องดำเนินการ
COLLSCAN
(การสแกนแบบเต็มตาราง)
ต้องอ่านและเปรียบเทียบคอลเล็กชันทั้งหมดบนดิสก์ทีละรายการหากมีข้อมูลหลายแสนหรือหลายล้านชิ้นในคอลเลกชันแบบสอบถามจะใช้ทรัพยากรคอมพิวเตอร์ CPU และดิสก์ I/O จำนวนมาก
2.การเชื่อมต่อจะติดอยู่ในแบบสอบถามช้าและพูลการเชื่อมต่อจะถูกบีบออกอย่างรวดเร็ว
เว็บเฟรมเวิร์ก (เช่น Node.js, Java Spring Boot, Python Django ฯลฯ) มักใช้พูลการเชื่อมต่อฐานข้อมูลเพื่อใช้การเชื่อมต่อซ้ำ
สถานการณ์ปกติ: แบบสอบถามหนึ่งรายการเสร็จสมบูรณ์ใน2มิลลิวินาทีการเชื่อมต่อจะถูกปล่อยกู้คืนไปยังพูลการเชื่อมต่อและส่งไปยังคำขอถัดไป
สถานการณ์ผิดปกติ: แบบสอบถามช้าที่ไม่มีดัชนีจะใช้เวลา3วินาทีในการดำเนินการให้เสร็จสมบูรณ์ใน3วินาทีนี้การเชื่อมต่อจะถูกผูกขาด
หิมะถล่มเริ่มขึ้น: เมื่อผู้ใช้เยี่ยมชมหรือค้นหา Spider และรวบรวมข้อมูลพร้อมกันคำขอใหม่ๆก็ยังคงหลั่งไหลเข้ามาเนื่องจากการเชื่อมต่อก่อนหน้านี้ติดขัดด้วยการสืบค้นช้าคำขอใหม่จึงสามารถบังคับให้สร้างใหม่ได้เท่านั้น
การเชื่อมต่อในเวลาอันสั้นจำนวนการเชื่อมต่อจะถึงขีดจำกัดสูงสุดของข้อกำหนดของเลเยอร์แอปพลิเคชันหรืออินสแตนซ์ของ Alibaba Cloud MongoDB (Max Connections)
ในท้ายที่สุดพูลการเชื่อมต่อก็เต็มและคำขอที่ตามมาทั้งหมดสำหรับการพยายามรับการเชื่อมต่อฐานข้อมูลจะถูกโยนออกไป
Timeout waiting for connection from pool
, ทำให้ธุรกิจทั้งไซต์เป็นอัมพาต.
2.ขั้นตอนแรก: วิธีใช้คอนโซลและคำสั่งของ Alibaba Cloud เพื่อค้นหา "การสืบค้นช้า" อย่างรวดเร็ว
เมื่อพูลการเชื่อมต่อเต็มไปด้วยสัญญาณเตือนการรีสตาร์ทบริการเว็บแบบสุ่มสี่สุ่มห้าหรือการอัปเกรดการกำหนดค่าอินสแตนซ์ MongoDB มักจะรักษาอาการมากกว่าสาเหตุที่แท้จริงคุณต้องปฏิบัติตามขั้นตอนที่เป็นมาตรฐานต่อไปนี้เพื่อค้นหา "ผู้ร้าย"
1.ใช้ฟังก์ชั่น "บันทึกช้า" ของคอนโซล Alibaba Cloud MongoDB
ลงชื่อเข้าใช้คอนโซล Alibaba Cloud MongoDB
เลือกภูมิภาคที่อินสแตนซ์ตั้งอยู่ในแถบนำทางด้านบนแล้วคลิก ID อินสแตนซ์เป้าหมาย
ในแถบเมนูด้านซ้ายให้เลือก Cloud Monitoring and Log-> Slow Log (หรือ Log Management)
ตั้งค่าช่วงเวลาของการแก้ไขปัญหา (นั่นคือจุดเริ่มต้นของข้อผิดพลาดทางธุรกิจ) และมุ่งเน้นไปที่พารามิเตอร์ต่อไปนี้: เวลาดำเนินการ (เวลาดำเนินการ): การสืบค้นที่เกิน100มิลลิวินาทีต้องใช้ความระมัดระวังและการสืบค้นที่ช้ากว่าพันมิลลิวินาทีเป็นอันตรายถึงชีวิตเอกสารที่สแกน (จำนวนเอกสารที่สแกน) และเอกสารที่ส่งคืน (ส่งคืนจำนวนเอกสาร): หากเอกสารที่ได้รับการตรวจสอบเป็นหมื่นหรือหลายแสนและเอกสารที่ได้รับการตรวจสอบมีเพียงไม่กี่หรือโหลนี่คือการขาดคุณสมบัติของดัชนีโดยทั่วไป!
การแจ้งเตือนการดำเนินการและการบำรุงรักษาและโครงสร้างพื้นฐาน: เมื่อตรวจสอบประสิทธิภาพของฐานข้อมูลบนคลาวด์และเตรียมเปลี่ยนแปลงข้อมูลจำเพาะชั่วคราว (เช่นการเพิ่ม CPU/หน่วยความจำเพื่อหยุดเลือดในกรณีฉุกเฉิน) หรือการเปิดบริการบันทึก (SLS) สำหรับการดึงบันทึกเชิงลึกโปรดรักษาสถานะการดำเนินการและการบำรุงรักษาบัญชีให้เป็นปกติขอแนะนำให้จัดเตรียมการวางแผนงบประมาณล่วงหน้าและเติมเงินในบัญชี Alibaba Cloud ในการปรับแต่งโครงสร้างการรักษาสันติภาพประจำวันเพื่อให้แน่ใจว่ายอดเงินในบัญชีเพียงพอสิ่งนี้สามารถป้องกันไม่ให้ฟังก์ชันการตรวจสอบขั้นสูงของคอนโซลถูกจำกัดการสำรองข้อมูลถูกขัดจังหวะและแม้แต่ฐานข้อมูลบนคลาวด์ก็ถูกบังคับให้ลดระดับหรือล็อกเนื่องจากการค้างชำระซึ่งจะส่งผลต่อเวลาในการช่วยเหลือทองของการแก้ไขปัญหา
2.เข้าสู่ระบบการดำเนินการ MongoDB
CurrentOp ()
การวินิจฉัยการอุดตันแบบเรียลไทม์
หากคุณมีสิทธิ์ในการอ่านและเขียนฐานข้อมูล MongoDB คุณสามารถลงชื่อเข้าใช้ฐานข้อมูลได้โดยตรงผ่าน Mongo Shell หรือ Data Management Service (DMS) และเรียกใช้คำสั่งต่อไปนี้เพื่อดูการดำเนินการที่กำลังดำเนินการอยู่และใช้เวลานานมาก:
JavaScript
// การดำเนินการที่ไม่ใช่ระบบที่ดำเนินการมานานกว่า2วินาทีและกำลังทำงานอยู่
Db.currentOp ({
"Active": true,
"Secs_running": {"$ gt": 2 },
"Ns": {
"$ Ne": "local.oplog.rs"}
})
ในผลลัพธ์ที่ส่งคืนให้เน้นที่:
สรุป: หากแสดงเป็น COLLSCAN แสดงว่าคำสั่งกำลังทำการสแกนแบบเต็มตาราง
ไคลเอนต์: ที่อยู่ IP ของแอ็พพลิเคชันเซิร์ฟเวอร์ที่เริ่มต้นการสืบค้นช้านี้
คำสั่ง: คำสั่ง JSON แบบสอบถามที่เฉพาะเจาะจง
3.ขั้นตอนที่2: การวินิจฉัยและการเพิ่มประสิทธิภาพดัชนีของแบบสอบถามช้า
หลังจากค้นหาคำสั่งแบบสอบถามช้าที่เฉพาะเจาะจงแล้วเราจำเป็นต้องใช้ MongoDB
Explain ()
เครื่องวิเคราะห์วินิจฉัยและจัดทำดัชนีอย่างถูกต้อง
1.ใช้
Explain ("executionStats")
วิเคราะห์แผนการสืบค้น
ใน DMS หรือเครื่องมือไคลเอ็นต์ให้เพิ่มหลังคำสั่งแบบสอบถามช้า
.Explain ("executionStats")
:
จาวาสคริปต์
Db.articles. find({ "category": "seo", "status": "published" }).sort({ "created_at": -1 }).explain("executionStats")
มุ่งเน้นไปที่ตัวชี้วัดหลักในผลลัพธ์:
ขั้นตอน: หากเป็น COLLSCAN จะต้องได้รับการจัดทำดัชนีหากเป็น IXSCAN แสดงว่ามีการใช้ดัชนี
TotalDocsExamined: จำนวนเอกสารทั้งหมดที่สแกน
NReturned: จำนวนเอกสารที่ตรงกันจริงตามหลักการแล้ว totalDocsExamined ควรใกล้เคียงกับ nReturned มากที่สุด
ขั้นตอน: "SORT": หากขั้นตอนนี้ปรากฏขึ้นหมายความว่า MongoDB จะทำการเรียงลำดับแบบยาก (In-memory Sort) ในหน่วยความจำซึ่งจะใช้ CPU อย่างมากเมื่อข้อมูลมีจำนวนมาก
2.สร้างดัชนีคอมโพสิตตามหลักการ ESR (Compound Index)
สำหรับแบบสอบถามแบบหลายเงื่อนไขและสถานการณ์การเรียงลำดับการสร้างดัชนีคอมโพสิตต้องปฏิบัติตาม
หลักการ ESR
:
E-equality (การจับคู่เทียบเท่า): วางฟิลด์สำหรับการค้นหาที่แม่นยำ (เช่น status: "เผยแพร่")
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 }(ค่าเริ่มต้นคือการเพิ่มประสิทธิภาพพื้นหลังในเวอร์ชัน MongoDB 4.2) เพื่อหลีกเลี่ยงการล็อกตารางระหว่างการสร้างดัชนีและทำให้เกิดการหยุดใหม่
4.ขั้นตอนที่สาม: การปรับแต่งพารามิเตอร์พูลการเชื่อมต่อและกลไกป้องกันหิมะถล่ม
หลังจากแก้ปัญหาดัชนีแล้วเราจำเป็นต้องกำหนดค่าพารามิเตอร์พูลการเชื่อมต่อฐานข้อมูลที่เหมาะสมในเลเยอร์แอปพลิเคชันเพื่อป้องกันไม่ให้พูลการเชื่อมต่อถูกเติมเต็มอีกครั้งเนื่องจากการรับส่งข้อมูลอย่างกะทันหันในอนาคต
1.การกำหนดค่าทางวิทยาศาสตร์ของขนาดพูลการเชื่อมต่อชั้นแอปพลิเคชัน (Max Pool Size)
นักพัฒนาหลายคนเข้าใจผิดว่า "ยิ่งตั้งค่าพูลการเชื่อมต่อมากเท่าไหร่ก็ยิ่งดีเท่านั้น" ซึ่งเป็นความเข้าใจผิดอย่างมากคนตาบอด
MaxPoolSize
ตั้งค่าเป็น500หรือ1,000ไม่เพียงแต่จะใช้หน่วยความจำเซิร์ฟเวอร์จำนวนมากแต่ยังทำให้ปริมาณงานโดยรวมลดลงเนื่องจากการสลับบริบทของ CPU บ่อยๆ
สูตรที่แนะนำ: Max Connections = (จำนวนแกน CPU * 2) จำนวนดิสก์พร้อมกัน
การกำหนดค่าแอปพลิเคชันทั่วไป: โหนดแอปพลิเคชันเว็บเดียวตั้งค่า maxPoolSize เป็น20 ~ 50มักจะเพียงพอที่จะรับมือกับภาวะพร้อมกันสูงหากมีโหนดแอปพลิเคชันหลายโหนดจำเป็นต้องตรวจสอบให้แน่ใจว่าผลรวมของ maxPoolSize ของโหนดทั้งหมดน้อยกว่าจำนวนการเชื่อมต่อสูงสุดที่รองรับโดยข้อกำหนดอินสแตนซ์ Alibaba Cloud 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 ({ category: "seo" }).maxTimeMS(2000);
5.บทสรุปของเครื่องมือเพิ่มประสิทธิภาพเว็บไซต์ SEO: ประสิทธิภาพคือเส้นชีวิตของ SEO
ในฐานะเครื่องมือเพิ่มประสิทธิภาพเว็บไซต์ SEO ฉันมักจะพูดว่า:"
SEO ใดๆที่แยกออกจากฐานทางเทคนิคและความเร็วในการโหลดคือปราสาทบนท้องฟ้า
”
ปกป้องงบประมาณการรวบรวมข้อมูลของเครื่องมือค้นหา (Crawl Budget): เมื่อ MongoDB ทำงานล่วงเวลาบ่อยครั้งเนื่องจากดัชนีที่ไม่ได้สร้างและพูลการเชื่อมต่อเต็ม (504) ประสิทธิภาพในการรวบรวมข้อมูลของเครื่องมือค้นหา Spider จะลดลงอย่างมากล้างข้อความค้นหาที่ช้าลงในเวลาและเพิ่มประสิทธิภาพพูลการเชื่อมต่อเพื่อให้อินเทอร์เฟซเว็บไซต์สามารถรักษาการตอบสนองในระดับมิลลิวินาทีและเพิ่มปริมาณการรวบรวมข้อมูลและความเร็วในการรวบรวมของเครื่องมือค้นหาได้โดยตรง
รับประกันประสบการณ์ Core Web Vitals: การตอบสนองฐานข้อมูลที่รวดเร็วเป็นพื้นฐานในการลด TTFB (เวลาไบต์แรก) ยิ่งเพจแสดงผลเร็วขึ้นอัตราตีกลับของผู้ใช้ก็จะยิ่งลดลงและน้ำหนักที่ครอบคลุมของเพจในเครื่องมือค้นหาก็จะยิ่งสูงขึ้น
ให้ความสนใจกับการจัดการโครงสร้างพื้นฐานบนคลาวด์: การปรับแต่งฐานข้อมูลไม่เพียงแต่เกี่ยวกับการเขียนโค้ดและการสร้างดัชนีเท่านั้นแต่ยังรวมถึงการใช้งานและการบำรุงรักษาทรัพยากรคลาวด์ในแต่ละวันด้วยเมื่อขยายข้อมูลจำเพาะของ MongoDB เปิด DAS (บริการปรับแต่งฐานข้อมูลอัตโนมัติ) หรือการตรวจสอบบันทึกรักษาการวางแผนงบประมาณที่ดีและนิสัยการเติมเงินบัญชี Alibaba Cloud เพื่อให้แน่ใจว่าสัญญาณเตือนการตรวจสอบระบบคลาวด์และบริการอิสระของฐานข้อมูลออนไลน์ตลอดเวลาเพื่อป้องกันปัญหาก่อนที่จะเกิดขึ้น
ผ่าน"
ตำแหน่งบันทึกช้า-> explain() การวิเคราะห์-> ESR สร้างดัชนี-> เพิ่มประสิทธิภาพพารามิเตอร์พูลการเชื่อมต่อ
"ชุดการตรวจสอบมาตรฐานแบบวงปิดนี้คุณสามารถแก้ปัญหาการบล็อกการสืบค้นช้าของ Alibaba Cloud MongoDB และพูลการเชื่อมต่อเต็มรูปแบบได้อย่างสมบูรณ์และสร้างสถาปัตยกรรมฐานข้อมูลพื้นฐานที่รวดเร็วและเสถียรสำหรับเว็บไซต์!

