[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 นี้เลยจ้า คลิกที่นี่