สถาปัตยกรรมเบื้องหลัง Instagram

by mk
13 April 2012 - 08:08

ข่าวนี้เก่าไปหลายเดือน แต่น่าจะเป็นประโยชน์สำหรับคนที่อยากรู้ว่าบริการยอดฮิตอย่าง Instagram สามารถรองรับโหลดปริมาณมหาศาลจากผู้ใช้ทั่วโลกได้อย่างไร

เรื่องนี้มีอธิบายไว้ในบล็อก Instagram Engineering

เซิร์ฟเวอร์

  • Instagram ใช้เซิร์ฟเวอร์เสมือน คือเช่าบริการ Amazon EC2 ทั้งหมด ด้วยเหตุผลว่าปริมาณวิศวกรที่มี ไม่พอสำหรับการตั้งเซิร์ฟเวอร์เอง ดังนั้นเลือกเช่าใช้งาน EC2 ง่ายกว่า
  • ระบบปฏิบัติการเซิร์ฟเวอร์เป็น Ubuntu 11.04 โดยทีมงานบอกว่า Ubuntu รุ่นก่อนๆ มีปัญหากับ EC2 แต่ในรุ่นนี้ไม่มีแล้ว

    Load Balancing

  • เดิมที Instagram ใช้เซิร์ฟเวอร์ NGINX สองตัว สลับกันแบบ DNS Round-Robin

  • ภายหลังเปลี่ยนมาใช้ Amazon Elastic Load Balancer (ELB), NGINX 3 instance สำหรับทำ load balancer
  • ใช้เทคนิคตัดการเชื่อมต่อแบบ SSL ที่ตัว ELB เพื่อลดโหลดของ NGINX
  • ใช้ Amazon Route53 สำหรับ DNS

Application Servers

  • ใช้ Django เป็น application server (ภาษา Python)
  • เครื่องที่รันเป็นเครื่องรองรับโหลดหนักพิเศษของ EC2 คือรุ่น High-CPU Extra-Large (ข้อมูลเมื่อ 4 เดือนก่อน ใช้ 25 instance)
  • ลักษณะงานของ Instagram เน้นซีพียูมากกว่าแรม จึงเลือกรุ่น High-CPU Extra-Large
  • ใช้ Green Unicorn สำหรับเซิร์ฟเวอร์ WSGI ของ Python (เดิมทีใช้ Apache + mod_wsgi แต่เปลืองพลังซีพียูมากไป
  • ใช้ Fabric สำหรับงานต่างๆ บนคอมมานด์ไลน์

Data storage

  • ข้อมูลส่วนใหญ่เก็บใน PostgreSQL
  • เครื่องที่ใช้รันฐานข้อมูลเป็นรุ่น Quadruple Extra-Large memory จำนวน 12 instance
  • งานเกือบทั้งหมดรันบนหน่วยความจำตลอดเวลา เพื่อประสิทธิภาพที่ดี เพราะระบบการเก็บข้อมูลบนดิสก์ของ Amazon ตอบสนองช้าเกินไป
  • ระบบไฟล์ของเครื่องที่ใช้ทำฐานข้อมูล เป็น XFS
  • เครื่องที่รัน PostgreSQL ทุกเครื่องจะต่อแบบ master-replica โดยใช้ Streaming Replication
  • รูปภาพทั้งหมดเก็บอยู่บน Amazon S3
  • ใช้ Amazon CloudFront เป็น CDN ช่วยกระจายโหลดรูปภาพ
  • ใช้ Redis สำหรับข้อมูล feed ทุกประเภท งานรันอยู่บนหน่วยความจำทั้งหมด ใช้เครื่อง Quadruple Extra-Large Memory สำหรับ Redis เช่นกัน
  • งานด้าน geolocation เดิมทีค้นที่ระดับ PostgreSQL แต่เปลี่ยนมาใช้ Apache Solr ในภายหลัง
  • ใช้ Memcached จำนวน 6 instance สำหรับแคช

Task Queue & Push Notifications

  • Gearman สำหรับการจัดคิวงานแบบ asynchronous (งานพวกอัพรูปไปยัง social network จะรันอยู่เบื้องหลังผ่านระบบคิวงานนี้ แยกจากการอัพไฟล์รูป)
  • pyapns สำหรับ push notification

Monitoring

  • Munin สำหรับตรวจสอบสถานะการทำงานของโพรเซส
  • ใช้ Pingdom ช่วยตรวจสอบโพรเซสจากภายนอกอีกชั้นหนึ่ง

รายละเอียดแบบเต็มๆ อ่านได้จาก What Powers Instagram: Hundreds of Instances, Dozens of Technologies

นอกจากนี้ยังมีบล็อกอีกตอนคือ Keeping Instagram up with over a million new users in twelve hours ที่อธิบายว่า Instagram รองรับโหลดที่เพิ่มขึ้นจากเวอร์ชัน Android ได้อย่างไร

Blognone Jobs Premium