ความหมายของ High cardinality ใน MongoDB Sharding

--

Photo by JOSHUA COLEMAN on Unsplash

ในการออกแบบ Sharding Strategy ใน MongoDB เนี่ย อย่างน้อยที่สุดในการดีเบตหาโซลูชันที่เหมาะสมที่สุด ที่พูดกัน คือ คีย์ที่เราเลือก มัน High cardinality หรือยัง?

ย้อนกลับไปถึงเอกสาร ตัวนี้

อย่างน้อยที่สุด MongoDB พูดถึง ความเป็นอยู่ของ cardinality, frequency และ range of change

“Cardinality means the amount of variation”

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

สั้นๆ คือ คีย์ที่ช่วยให้กระจายข้อมูลได้ดี

เพราะ ถ้าเราเลือกคีย์ไม่ได้ จะเกิดสิ่งที่เรียกว่า Hot Chunk / Invisible Chunk / Hot Spotting หรือ ข้อมูลไปกองอยู่ที่ Replicaset เครื่องเดียว

ยกตัวอย่าง

ลูกอม M&M

ซึ่งการบอกว่ามัน Low หรือ High cardinality เราใช้หลักการโดยการพยายามหา สิ่งที่มันทำให้ Unique ได้ก่อน เช่น

ภาพนี้แสดงให้เราเห็นว่า การมีอยู่ของ cardinality มีน้อย “Low Cardinality” เพราะ variation ประเภทข้อมูลที่มีอยู่มันน้อย

ทำไม?

สมมุติเรามี M&M เป็น mongodb collection และมีชนิดของวัตถุดิบ 5 ประเภท และ มี 6 สี เช่น

types := [plain, peanut, almond, pretzel, crispy]
colors := [blue, green, yellow, orange, red, brown]

ถ้าเราใช้ colors สำหรับ sharding key ความแตกต่างของข้อมูลก็มี แค่ 6 ตามสี แต่ถ้าเราบอกว่า งั้นใช้ compound index สิ จะได้แบบนี้

cardinality := types * colors
cardinality := 5 * 6 = 30
shard key := { types: 1, colors: 1}

เราได้มา 30 options เลยนะ ซึ่งในกรณีนี้ น่าจะเหมาะสมกว่า เพราะเกิด High Cardinality ใน MongoDB

ตัวอย่างคีย์ที่ทำให้เกิด Low Cardinality

สมมุติว่าถ้าเราเลือก X เป็นตัวแทนของ Sharding key สิ่งที่ตาามา คือ มันมีโอกาสที่จะเกิด Jumbo Chunk และ ข้อมูลไปกองที่ Shard B ดังภาพ

ดังนั้น เราต้องพิจารณาอีกทีว่า คีย์ที่เราเลือกนั้นถูกต้อง หรือ มาถูกทางไหม ให้ลองพิจารณาการใช้ Campound Key แทนน่าจะเหมาะสมกว่า สำหรับการทำ Range Shard Key หรือ ใช้ Hash ไปเลยถ้าคิดว่า Write Heavy เหมาะสมกว่า และ ต้องการกระจายข้อมูลไปทุกๆ Shard โดยไม่แคร์เรื่อง การอ่านข้อมูลที่ช้าลง เพราะอย่าลืมว่างาน Read Heavy ก็อาจจะทำให้ Network ต้องไป Hit ทุก Shard และนำข้อมูลมาประกอบกัน

ทั้งนี้ก็ไม่ได้หมายความว่า High cardinality จะตอบโจทย์ทั้งหมด

high cardinality ไม่ได้การันตีการกระจายตัวของข้อมูลไปทุกๆ shard cluster และ chunk เสมอไป ยังมีอีก 2 เรื่องที่ต้องดูต่อ

--

--

Teerapong Singthong 👨🏻‍💻

Engineering Manager, ex-Solution Engineering Lead at LINE | Tech | Team Building | System Design | Architecture | SWE | Large Scaling System