เห็นใน feed มีการ share บทความเรื่อง How Quora scaled MySQL to 100k+ Queries Per Second
เป็นการ scale MySQL database ของระบบ Quora
ซึ่งเป็นระบบถามตอบปัญหาต่าง ๆ นั่นเอง
โดยมีการใช้งานคร่าว ๆ คือ

  • ผู้ใช้งานจำนวน 300 ล้านคนต่อเดือน
  • มีการ post คำถามประมาณ 10,000 post ต่อวัน

ข้อมูลต่าง ๆ จะเก็บไว้ใน MySQL นั่นเอง
ดังนั้นมาดูกันว่าทางระบบทำการ scale กันอย่างไร

ในการจัดการนั้น จะแบ่งออกเป็น 3 เรื่องตามรูปแบบของการใช้งาน

  • จำนวนการอ่านข้อมูล (Select)
  • จำนวนการเขียนข้อมูล (Insert, Update, Delete)
  • ขนาดของข้อมูลที่จัดเก็บ

มารายละเอียดแต่ละหัวข้อดังนี้

เรื่องที่ 1 จำนวนการอ่านข้อมูล (Select)

เนื่องจากระบบ Quora นั้นมีอัตราการอ่านข้อมูลที่สูงมาก ๆ
การ scale ด้านอ่านข้อมูลจึงสำคัญมาก ๆ
ซึ่งจะแบ่งการจัดการหรือปรับปรุงเป็น 2 เรื่องหลัก ๆ คือ

  • Query ที่ซับซ้อน เนื่องจากใช้งาน CPU สูงมาก ๆ รวมไปถึงการ join ที่เยอะ ๆ (ลูกอีช่าง join) และการ aggregate ข้อมูล (group by) รวมทั้งการดึงข้อมูลใน table ที่มีจำนวน row เยอะ
  • ในเรื่องหนึ่ง ๆ มีจำนวนการดึงข้อมูลที่สูง หรือ บ่อย ๆ ต้องทำการขยาย หรือ เพิ่มเครื่อง หรือต้องมีการทำ caching ขึ้นมา

โดยรวม ๆ แล้ว ต้องให้ database ทำงานเท่าที่จำเป็นเท่านั้น
ไม่ควรให้ทำงานอะไรที่เยอะเกินไป
ยกตัวอย่างเช่น

  • ถ้าต้อง join เยอะ ๆ ก็ลดการ join ด้วยการทำ pre-aggregation/join ไว้ก่อนดีกว่าไหม
  • ใช้งาน paging เพื่อลดการดูข้อมูลลงไป

ส่วนในการใช้งาน caching ก็ต้องระวังการ cache ที่ไม่ดีด้วยเช่นกัน
ไม่ใช่ต้อง caching ข้อมูลทั้งหมดเสมอไป

ใน table ใด มีข้อมูลที่เยอะ ๆ ก็ต้องระวัง
เพราะว่า เปลือง resource มาก ๆ performance ก็แย่
การ backup ก็ลำบาก
ดังนั้น ต้องเข้าใจก่อนว่าข้อมูลอะไรที่ต้องการใช้งาน หรือ ใช้งานจริง ๆ
อะไรที่ไม่ใช้ก็ลบทิ้งไปบ้าง (retention policy)
หรือต้อง split ข้อมูลเป็นกลุ่ม ๆ ตามการใช้งานเป็นต้น

ส่วนเรื่องการจัดการ storage ของ database จะใช้งาน RockDB

เรื่องที่ 2 จำนวนการเขียนข้อมูล (Insert, Update, Delete)

ในระบบมีการเขียนข้อมูลที่ไม่เยอะมากนัก
โดย MySQL จะเป็น cluster (master/slave)
ก็ยังมีปัญหาการ sync ข้อมูลจาก master ไปยัง slave ที่ช้า เมื่อมีการใช้งานเยอะขึ้น
เลยปรับมาใช้การ sunc แบบ parallel แทน
ถ้าส่วนงานไหนที่ต้องเขียนเยอะ ๆ จะใช้งาน HBase แทน
รายละเอียดการ optimize database เพิ่มเติม

Reference Websites