วิธีการสำหรับการ scale database
ให้รองรับข้อมูล และ traffic ที่มากขึ้นนั้น มีหลายวิธี
ยกตัวอย่างเช่น
- การขยายเครื่องให้ใหญ่ขึ้น
- การเพิ่มเรื่องให้มากขึ้น
- การจัดทำ index แต่ถ้ามีข้อมูลในแต่ละ table มากขึ้น ก็ใหญ่ ดังนั้นต้องทำ partition เพื่อให้ table เล็กลง และ index มีขนาดเล็กลง
- การทำ replication เช่น master-slave, multi-master เป็นต้น เพื่อแยกระหว่างการ read กับ write data ออกจากกัน
- การทำ house keeping ของข้อมูล ให้มีใช้และเก็บเท่าที่จำเป็น
แต่ก็ยังมีวิธีการอื่น ๆ เช่น การทำ Database Sharding
เพื่อทำการกระจายข้อมูลไปยัง database server ที่อยู่ต่างที่กัน
นั่นคือการกระจายข้อมูลไปจัดเก็บในแต่ละที่
จะช่วย share เรื่องของ data และ load ที่เข้ามาได้
แต่ความยากคือ จะแยกข้อมูลด้วยอะไร ?
เพื่อให้เกิดประโยชน์สูงสุด
โดยตรงนี้ต้องดูตาม use case ไป ว่าเป็นอย่างไรด้วย
ยกตัวอย่างเช่น
- Hash-based
- Range-based
- Location-based
- Key/Directory-based
แน่นอนว่า แนวทางนี้มีทั้งข้อดีและข้อเสียเช่นกัน
ถ้าแบ่งข้อมูลผิด อาจจะทำให้ข้อมูลกระจุกอยู่ในบาง shard มากจนเกินไป
หรือในการดึงข้อมูลนั้น อาจจะต้องไปดึงจากหลาย ๆ shard ก็จะส่งผลเสียมาก ๆ
ยิ่งถ้ามีการ re-shard ก็ยิ่งใช้เวลามาก หรือ หนักกว่านั้นต้องปิดระบบเพื่อจัดการอีก
รวมไปถึงเรื่องของการ monitoring และ backup
ดังนั้นจึงมีเครื่องมือเข้ามาช่วยบ้าง
ยกตัวอย่างเช่น Vitess สำหรับ RDBMS
หรือจะเป็นพวก MonogDB และ Redis ก็มีเช่นกัน
กลับมาดูก่อนว่า ปัญหาของเราคืออะไร
แล้วจะมาดูว่า มีวิธีการอะไรช่วยแก้ไขหรือบรรเทาได้บ้าง
Reference Websites