จากบทความเรื่อง Scaling Rails at Aura Frames: Splitting to 8 Primary DBs
มีความน่าสนใจสำหรับการปรับปรุงระบบให้รองรับ
การใช้งานที่สูงขึ้นทั้งอัตราการ write และ read ข้อมูล
โดย technology ที่ใช้ในการพัฒนาระบบคือ Ruby on Rails และ PostgreSQL ใน AWS RDS
มาดูกันว่า ก่อนและหลังการปรับปรุงจากปัญหาที่เจอ
มีอะไรที่น่าสนใจบ้าง ?

เริ่มต้นการพัฒนาระบบนั้น

ใช้ Active record ในการเข้าถึงข้อมูลใน database
และ database ที่ใช้งานจะขยายด้วยการขยายเครื่องให้ใหญ่ขึ้นตามปริมาณการใช้งาน
และทำการขยายไปเรื่อย ๆ จนไปถึงขนาดใหญ่ที่สุดเท่าที่มีให้
แต่ก็ยังเจอปัญหาหนัก ๆ ในช่วง peak load !!
จึงเป็นที่มาของการ re-design ระบบเพื่อลดหรือไม่ให้เกิดปัญหาอีก
เพราะว่าโครงสร้างเดิมไม่ไหวแล้ว (Start with simple)

ในการเปลี่ยนแปลงระบบนั้น จะเพิ่มจำนวน database server เข้ามา

ซึ่งทำการ sharding data ไปยัง database server ต่าง ๆ
โดย logic ของการ sharding นั้นจะอยู่ในระดับ application
จาก database 1 เครื่อง เพิ่มมาเป็น 8
ซึ่งช่วยกระจายข้อมูลไปยังเครื่องต่าง ๆ ทำให้การ write/read ดีขึ้นมาก

ในส่วนของการพัฒนานั้นก็ใช้งานผ่าน Docker container นั่นเอง
เพื่อจำลอง database ขึ้นมาเพื่อพัฒนาและทดสอบ
และมีชุดของการทดสอบ เพื่อการันตีการทำงานที่ถูกต้อง
หรือถ้ามีความผิดพลาดก็จะแก้ไขให้ให้ถูกต้อง

ต่อมาก็ทำการเปลี่ยนแปลงแนวทางการ query ผ่าน Active Record

ซึ่งพบว่าในการ read นั้นมีการ join table ต่าง ๆ จำนวนมาก
และเจอ slow query จำนวนมาก
หนึ่งในแนวทางที่น่าสนใจคือ disable-join

นั่นคือปิดการ join นั่นเอง
ซึ่งก็ช่วยลดปัญหา แต่ก็ก่อให้เกิดปัญหาใหม่
นั่นก็คือ เราไม่ได้ใช้ความสามารถของ database เลย
ต้องทำการ query ตามจำนวน table ที่ต้อง join กัน !!
เพราะว่า มีการแยก database server กันเลย ซึ่ง join ข้ามเครื่องไม่ได้ !!

แต่ในเรื่องนี้ทางทีม ได้ทำการ load testing ดูก่อน
ก็พบว่าจำนวนการ query เพิ่มขึ้นจริง แต่ไม่ได้กระทบต่อ performance
หรือมีปัญหาใด ๆ ต่อระบบ
ดังนั้นจึงเลือกใช้วิธีนี้ในการแก้ไขปัญหา

จากนั้นก็ได้ปรับปรุงเครื่องอื่น ๆ อีกเช่น

  • Read/query พวก batch data
  • ในการทำ paging เปลี่ยนมาใช้ keyset แทนการใช้ offset ซึ่งใช้ I/O น้อยลง และเร็วขึ้นมาก
  • ทำการ query เฉพาะ column ที่ต้องการใช้งานเท่านั้น ไม่ใช้ค่า default ช่วยลด memory ไปได้เยอะ
  • ใช้ bulk insert เข้ามา
  • มีการใช้ caching เช่น memcached เข้ามาแทนการ update ข้อมูลลง database ตรง ๆ รวมทั้งพวก hot data ต่าง ๆ ก็ใช้ caching มาช่วยทั้งหมด

เป็นแนวทางในการแก้ไขบนปัญหาต่างๆ ใน context นั้น ๆ ที่น่าสนใจ