[MongoDB] Mongo ขาโตข้างเดียว

logo mongdb

สำหรับคนที่จะย้ายมาเล่น Database ( ต่อไปขอเรียกว่า DB นะจ๊ะ ) แบบ no-index ที่เน้นความเร็วและรองรับปริมาณของข้อมูลมหาศาลอย่างที่ pantip.com ทำอยู่ทุกวันนี้นั้นคงต้องเจอกับปัญหาขาโตข้างเดียวอย่างแน่นอน เอ๊ะ ! แล้วมันคืออะไรล่ะ เคยได้ยินแต่นางมณโฑนมโตข้างเดียว อันนี้ Mongo ขาโตข้างเดียว ( ฮา )

ปัญหานี้นั้นจะเกิดจากการ Sharding ( ไปดูกันว่า sharding ทำงานอย่างไร ) หรือพูดให้เห็นภาพคือเราจะให้เครื่อง server หลายๆตัวช่วยกันเก็บข้อมูลและทำให้สปีดความเร็วเพิ่มขึ้น ฟังดูก็เหมือนจะดีมีที่เก็บข้อมูลแยกๆกัน เก็บข้อมูลกันน้อยๆ เวลาค้นหาพร้อมกันใครเจอก่อนก็ return ค่ากลับมาให้เราใช่ครับ ฟังดูเหมือนจะเป็นเช่นนั้น แต่ …

คำถามคือ computer จะทราบได้อย่างไรว่าจะเอาข้อมูลไหนไปเก็บไว้ในถัง ( server ) ตัวไหน ? ถ้าเราบอกว่าก็ให้แยกเก็บตามเลขที่ที่หาร 2 ลงตัวที่ server 2 ทำนองเนี้ย คำตอบคือ ไม่ได้ เพราะว่าตัว Mongos หรือให้เราเข้าใจว่าคนค่อยจัดการว่าจะให้ข้อมูลอะไรไปเก็บไว้ที่ไหนเนี้ย เรากำหนดอย่างนั้นไม่ได้ครับ มันจะตัดสินใจเองว่าจะเอาข้อมูลอะไรเก็บที่ไหน

คราวนี้จึงเกิดปัญหาแรกที่ว่าหากเราจัดเก็บแบบที่คุ้นเคยนั่นคือการเก็บแบบ ID ไล่ตั้งแต่ 1,2,3, … , n แล้วเนี้ยตัว Mongos เนี้ยจะทำการเก็บแบบที่ทำให้เกิดปัญหาขาโตข้างเดียวคือ เอาข้อมูลทุกอย่างไปไว้ที่ถัง ( server ) ตัวแรกซึ่งหากว่ามีข้อมูลที่มันตัดสินใจไม่ได้แล้วนั้นมันจะเอาไปลงถังอื่นซึ่งเกิดยากทำให้ข้อมูลไปกระจุกที่ถังแรกเลย

25560621-155351.jpg

ต่อมาพวกเราทดลองกันว่าหากเป็นการ random แม่มทุกตัวเลยจะเป็นอย่างไร ปรากฎว่ามันตัดสินใจให้ข้อมูลใส่เฉลี่ยๆเท่าๆกัน เหมือนจะดีแต่ว่าเราจะไม่สามารถหยิบข้อมูลได้ถูกหากเราไม่มี shard key ( ตัวนี้เหมือนกับตำแหน่งของมันในถังไหน ที่เท่าไรทำนองนั้น ) ซึ่งจะให้ติด shard key มาทุกที่ก็ใช่เรื่องเพราะมันแอบยาว ข้อกำหนดนี้จึงตกไป

25560621-155358.jpg

สุดท้ายก็เจอกับเทคนิคที่ว่าเอาสองแบบแรกมารวมกันคือเอาพวก ID มาใช้ในการ Query ค่าข้อมูลและทำให้มัน random shard key ไปด้วยเวลาจัดเก็บจะได้ไม่เกิดปัญหาขาโตข้างเดียวและสามารถ Query ข้อมูลได้ง่ายๆหน่อยโดยมี id หรืออะไรก็ตามที่เราใช้ในเงื่อนไขการ Query ต่างๆ เย้

คนที่อ่านแล้วไม่เข้าใจไม่เป็นไรเพราะว่าต้องลองเล่นไปซักพักใหญ่ๆก่อนถึงจะเจอปัญหานี้และหากว่าจำลองเล่นในเครื่องตัวเองก็อาจจะเจอได้เหมือนกัน โดยมีเว็บที่ให้ดูอยู่ว่าการเกิดปัญหานี้นั้นเป็นได้จริงๆตาม link นี้เลยจ้า คลิกที่นี่

ถ้าคุณชอบบทความในเว็บนี้ และอยากสนับสนุนเรา เพียงแค่คุณสมัครรับข่าวสารด้านล่างจะได้รับสิทธิ์พิเศษก่อนใคร เราสัญญาว่าจะส่งบทความที่เป็นประโยชน์ต่อคุณอย่างแน่นอนครับ

Loading

Comments

    1. ไม่ได้ครับเพราะว่าตัว mongod ที่ทำการเลือกนั้นเราไม่สามารถบังคับการตัดสินใจของมันได้ครับ หากเราทำการไล่เลขมันก็ตัดสินใจอย่างที่บอกในเนื้อหาอ่ะครับมันไม่ยอมใส่ให้เท่าๆกัน ก็เลยต้องทำให้เลขมาเรียงแบบเหมือน random ไปด้วยครับผม

  1. แบบสุดท้ายที่ว่านี้ยกตัวอย่าง code ให้ดูหน่อยได้เปล่าครับ

Leave a Reply

Your email address will not be published.

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

Message us

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ปฎิเสธทั้งหมด
Manage Consent Preferences
  • คุกกี้ที่จำเป็น
    Always Active

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้

  • คุกกี้ที่จำเป็น

    คุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้

บันทึก