MongoDB: Replication และ Sharding 101

--

Photo by Jandira Sonnendeck on Unsplash

บันทึกเกี่ยวกับ database replicas กับ sharding concept โดยบทความนี้อ้างอิง MongoDB Architecture เป็นหลัก ซึ่งแนวคิดพื้นฐาน โดยส่วนใหญ่ สามารถใช้กับ database ค่ายอื่นๆได้เหมือนกัน

บทความนี้เหมาะสำหรับ: มือใหม่ที่กำลังสนใจเรื่อง database scaling

Replication

การทำ database replication คือ การทำสำเนาข้อมูลไปลงไป database ก้อนสำรอง redundant เพื่อรับประกันได้ว่า หาก database ตัวหลักล่มไป หรือ เกิดข้อมูลพลาด ระบบยังมี database สำรองขึ้นมาทำหน้าที่แทน

เพื่อเพิ่มความทนทาน durability ให้กับระบบจัดเก็บข้อมูล และช่วยให้เกิดความพร้อมของระบบ high-availability อยู่ตลอดเวลา

Replica Set คือ กลุ่มของ mongodb servers มากกว่า 1 เครื่อง เพื่อทำให้เกิด durability และ high-availability โดยจะมี Primary ทำหน้าที่ write/read ข้อมูลที่ได้จาก client และมี background job replicate data ไป secondary database ส่วน Secondary หน้าที่หลักเอาไว้จัดเก็บสำเนาข้อมูล

replicaset architecture

Sharding

การทำ data partitioning หรือ การกระจาย data collection ไป multiple servers ที่เรียกว่าการทำ shards เพื่อเป็นการกระจายโหลดออกไป server อื่นๆที่มีอยู่ แทนที่จะให้เครื่องเดียวแบกรับการประมวลผลข้อมูลทั้งหมด หรือ กระจายข้อมูลไปหลายๆเครื่องที่มี

อย่างไรก็ดีการทำ sharding ต้องคำนึงถึง sharding strategies ที่เลือกด้วย เช่น hash, range, etc. เพราะแต่ละประเภทมีวิธีการกระจาย หรือ จัดกองข้อมูลที่แตกต่างกัน นอกจากนี้ยังต้องเลือก shards key ให้เหมาะสมกับการ distribute data ด้วย

เมื่อมีการเลือก shard key ไม่ดีจะเกิดอะไรขึ้น?

  1. Hot Shards/Imbalance ปัญหา classic ที่มือใหม่มักเจอ คือ ข้อมูลไปกระจุกตัวอยู่เครื่องๆเดียว
  2. Jumbo Chunk หน่วยย่อยที่สุดภายใน shards คือ chunk ที่ไม่ยอม split ตัวออกไป เมื่อมีขนาดตามที่กำหนด default 64mb
  3. Read Slowly เพราะ ข้อมูลกระจายกันเกินไป

ดังนั้นสิ่งที่ต้องพิจารณาให้ดีก่อนเลือก shards key คือ รู้ลักษณะข้อมูลที่เก็บก่อน และ เราอยากให้ข้อมูลเก็บแบบไหน

mongodb shards cluster

mongos ทำหน้าที่เป็น router เพื่อบอกว่า queries จาก client นั้นควรไป shard server ไหนใน cluster โดยจะพิจารณาจาก shards key ที่ระบุมา

mongod ทำหน้าที่เป็น daemon คอยจัดการ queries ที่เข้ามา จัดการข้อมูล และ response กลับไป โดยการทำงานทั้งหมดจะเป็น background process

References

ส่วนสำหรับหัวข้อถัดไปจะพูดถึง Improve Read Scaling ใน MongoDB ไว้ติดตามกันครับ

--

--

Teerapong Singthong 👨🏻‍💻

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