Skip to toolbar

[แปล] สิ่งที่ได้รู้ เมื่อใช้ Mongo มานานกว่า 1 ปี

MongoDB

วันนี้เพื่อนของผมได้เจอบทความน่าสนใจจึงอยากจะแชร์ต่อเพราะเห็นว่าเป็นประโยชน์ต่อผู้ใช้ MongoDB ในประเทศไทยครับ หากมีความผิดพลาดประการใดสามารถเพิ่มเติมได้ที่ comment ได้ทันทีครับผม

1. คำสั่ง count นั้นช้า แม้จะติด Index
2. เมื่อทำ Replica ปัญหาจะตามมามากมาย (whole world of trouble)
เช่น insert แล้วอ่านทันที จะไม่ได้ข้อมูลเพราะ sync ไม่ทัน เป็นต้น
3. เมื่อทำ Compound Index จะพบว่า Query แบบ Range ดันติด Index ทีหลัง Sort

เช่น

db.ensureIndex({_id:1, last_name:1});

 

เมื่อ query แบบนี้

db.collection.find({_id: {$in : [
ObjectId("505bd76785ebb509fc183733"),
ObjectId("505bd76785ebb509fc183734"),
ObjectId("505bd76785ebb509fc183735"),
ObjectId("505bd76785ebb509fc183736")
]}}).sort({last_name: 1});

 

Mongo ดัน Sort ข้อมูลทั้ง Collection ก่อนแล้วค่อย $in เจอ 4 ตัว
(จึงช้ากว่ามาก แทนที่จะ ดึงมา 4 ตัวก่อนแล้วค่อย Sort)

4. ข้อดีของ Mongo OnjectID
4.1 ในนั้นในสร้างมาจากเวลา ดังนั้น ObjectId(“505bd76785ebb509fc183733”).getTimestamp(); ก็จะได้ return ออกมาเป็นเวลา
4.2 ถ้าเรียงด้วย _id ก็เหมือนเรียงด้วย date
4.3 มันทำ Index แบบ Auto จึงประหยัดเนื้อที่ (ใช้ได้เลย ไม่ต้องทำเพิ่มอีก)
4.4 มันค้นได้เร็วมาก

5. ทุก queries ต้องติด Index
( ข้อนี้แย้งเหะ เพราะพบว่า ถ้าข้อมูลมีน้อยหลักร้อยหลักพัน ไม่ทำ Index เร็วกว่า )

6. เมื่อมี query ใหม่ให้รัน expaint ด้วยเสมอ (บน production)

เพื่อตรวจสอบหลาย ๆ อย่างและอย่าไปกลัว
เพราะต่อให้มันช้าก็แค่รันครั้งเดียว ไม่น่ากลัวเท่าปล่อยให้โค้ดใหม่ ๆ
ที่ไม่ติด Index โผล่ขึ้นไปรันรัว ๆ บน production หรอก

7. ควรทำ Profiler ด้วยทุกครั้ง

เพราะถ้ามี Query ที่ช้าโผล่มา จะได้รู้ตัวทันท่วงที

8. คำสั่ง Mongo ที่สำคัญได้แก่

db.currentOp() – แสดง operation ทั้งหมด
db.killOp(opid) – ระบุเลข operation เพื่อกำจัด operation ที่ช้าออกไป
db.serverStatus() – แสดง stats ของ Server เพื่อ Monitor
db.stats() – แสดง stats ของ database ที่ใช้อยู่
db.collection.stats() – แสดง stats ของ collection ที่ระบุ

9. ควรเฝ้าดูสิ่งต่าง ๆ ดังนี้

เมื่อใช้ Mongo ผ่านไปเป็นปีควรสังเกตสิ่งเหล่านี้ (ทำเป็นกราฟไว้เลยจะดีมาก)

Index sizes – อย่าให้ขนาด Index ของ Collection ที่ query ถี่ ๆ ใหญ่กว่า RAM
Current ops – ปมิมาณ operation ที่เยอะเกินก็ทำให้เป็นปัญหาได้ (traffic อาจเยอะ)
Index misses – เลขยิ่งเยอะยิ่งแย่ แปลว่าต้องอ่านจาก disk อยู่เรื่อย ๆ (อาจแปลว่า RAM น้อยไป)
Replication lag – ถ้าข้อมูลใน Secondary ช้ากว่า Master มาก ๆ จะเป็นปัญหาได้
I/O performance – ถ้า Disk รับไม่ไหว จะส่งสัญญาณบอกคุณก่อน

10. คำสั่ง Monitor ที่มีประโยชน์
mongotop – แสดงเวลาที่ใช้ในการ อ่าน/เขียน ล่าสุดในแต่ละ Collection
mongostat – แสดงข้อมูลที่มีประโยชน์ในการ Debug ปัญหาแบบ Realtime

11. อย่าลืมติดตั้งตัว Monitor ที่ frontends ด้วย เช่น
MMS – ตัว Monitor ของ 10en เอง
Kibana – วิเคราะห์แนวโน้มจาก Log ของ Mongo ได้ (มีประโยชน์เพราะชัดเจนดี)

หากมีแปลผิดพลาดประการใด ขออภัยมา ณ ที่นี้ด้วยครับ

Credit

ผู้แปล: เพื่อนในกลุ่ม Dev pantip ที่ไม่ประสงค์ออกนาม
ที่มา: http://snmaynard.com/2012/10/17/things-i-wish-i-knew-about-mongodb-a-year-ago/


Deprecated: Theme without comments.php is deprecated since version 3.0.0 with no alternative available. Please include a comments.php template in your theme. in /home/zp1291/domains/oxygenyoyo.com/public_html/wp-includes/functions.php on line 4913

ฝากข้อคิดเห็น

This site uses Akismet to reduce spam. Learn how your comment data is processed.