Screen Shot 2558-11-21 at 11.18.45 PM
จาก Engineering blog ของ Pinterest เรื่อง Deploy software at Pinterest
ทำการอธิบายเรื่องการ deploy ระบบงานว่าเป็นอย่างไร
รวมไปถึงขั้นตอนการพัฒนา และ แก้ไข Bug
อีกทั้งเครื่องมือต่าง ๆ เพื่อให้แต่ละทีมทำงานร่วมกันได้อย่างมีประสิทธิภาพ
มาดูในรายละเอียดกันหน่อย

เริ่มด้วยเครื่องมือต่าง ๆ ที่ใช้งาน

  • Github Enterprise สำหรับจัดการเวอร์ชัน ของ code, จัดการ code review , การ merge code และใช้งาน API ต่างๆ
  • Jenkins สำหรับจัดการระบบ Continuous Integration เพื่อทำการ build และ ทดสอบ unit test ของแต่ละการเปลี่ยนแปลง
  • Zookeeper สำหรับจัดการสถานะ และ บอกแต่ละ node ของ server ว่าทำงานอยู่บน code เวอร์ชันอะไร
  • Amazon S3 สำหรับจัดเก็บผลการ build รวมทั้งให้สำหรับ share data ของระบบอีกด้วย ซึ่งสามารถรองรับการขยายตัวได้ง่าย

Build pipeline ของระบบเป็นอย่างไร ?

เนื่องจากระบบของ Pinterest นั้นมันดีมาก ๆ
สามารถที่จะทำการ deploy code จาก branch master
ไปยัง production server ได้ตลอดเวลา

ดังนั้นมาดูกันว่ามีขั้นตอนการทำงาน หรือ build pipeline อย่างไร
แสดงดังรูป ซึ่งไม่ได้เยอะเลยนะ !!

build-pipeline

โดย Software Engineering แต่ละคนจะทำงานตามขั้นตอนนี้เสมอ

  1. เมื่อต้องพัฒนา feature ต้องทำการสร้าง branch ขึ้นมา ด้วยคำสั่ง git branch
  2. เมื่อพัฒนาเสร็จแล้ว ให้ทำการ commit และ push ขึ้น Github Enterprise
  3. ทำการสร้าง และ ส่ง Pull Request การเปลี่ยนแปลง
  4. จากนั้น Jenkins ทำการ run automated test เพื่อตรวจสอบว่า Pull Request นั้น ๆ มันทำงานได้ถูกต้อง
  5. ทางผู้ดูแล code หลักจะทำการ approve และ Jenkins ทำการ merge code ไปยัง branch master
  6. ระบบจะมี trigger เมื่อทำการ merge code ไปยัง branch master เพื่อทำการ run automated ในข้อ 4 อีกรอบ
  7. เมื่อทำการทดสอบผ่าน ทำการสร้าง branch jenkins-stable ขึ้นมา จากนั้นทำการสร้าง TAR file ของระบบ และ upload ไปยัง Amazon S3
  8. ระบบที่ทำการ deploy แบบอัตโนมัติ ก็จะทำการ copy TAR file จาก Amazon S3 ไป deploy ทันที
  9. ส่วนระบบที่ทำการ deploy แบบ manual อยู่ก็เข้าไป copy มาจาก Amazon S3 เอง

ส่วนการ deploy ของ Pinterest จะเรียกว่า Atomic Deploy System

ซึ่งแก้ไขปัญหาของการ deploy
ไม่ต้องทำการ restart server ใด ๆ เลย
การ deploy แบบนี้ทำให้ service ที่ต่างไม่ต้องหยุด หรือ ปิดการใช้งานระบบอีกต่อไป
นั่นคือให้ทำการทั้ง version เก่า และ ใหม่ ไปเลย
ใช้วิธีการสลับที่เรียกว่า Flip flop แสดงดังรูป
pinterest-deploy

คำอธิบาย
ถ้าเราต้องการ deploy ระบบงาน version B มีขั้นตอนการทำงานดังนี้

  1. Zookeeper ทำการส่งข้อมูลไปยัง Varnish (Load Balance) ว่า version A จะไม่ใช้งานแล้วนะ
  2. Varnish รอทำการเปลี่ยน
  3. ทำการ Rollout ระบบ นั่นคือ uninstall version A และ install version B
  4. เมื่อทำการ install version B เรียบร้อยแล้ว จะทำการแจ้งไปยัง Varnish ว่า version B พร้อมแล้วนะ
  5. Varnish ก็จะทำงานตามการแจ้ง คือเปลี่ยนไปใช้งานที่ version B แทน
  6. นั่นคือ ในตอนนี้ version ปัจจุบันของระบบคือ version B แล้ว

สามารถอ่านเพิ่มเติมได้ที่ Stealthy shipping with atomic deploys

สิ่งที่น่าสนใจมาก ๆ คือ Design Principle

Don’t touch the deployed code directly

นั่นคือ script ของการ deploy ห้ามแตะต้อง หรือ แก้ไขโดยตรง
มันคืออะไรกันนะ ?

ในช่วงเริ่มต้นของ pinterest นั้น
ทำการจับเก็บ script การ deploy ไว้ที่ repository เดียวกับ code
แต่เมื่อระบบใหญ่ขึ้น รวมทั้งมีการพัฒนาเครื่องการ deploy ขึ้นมา
ทำให้ต้องย้าย script การ deploy ไปยัง repository ของระบบการ deploy ซะ
รวมทั้งเปลี่ยนจากการใช้งาน git command ไปใช้ Github API แทน
ซึ่งทำให้การ deploy รวดเร็วขึ้น
และลดจำนวน dependency ต่าง ๆ ออกไป

โดยสิ่งที่ต้องการ คือ
ต้องการให้ขั้นตอน deploy มันเหมือนกันทั้งหมด
ไม่ว่าจะพัฒนาด้วยภาษาโปรแกรมอะไรก็ตาม
ทำให้ทุก ๆ คนมีขั้นตอนการ deploy เดียวกัน

อีกทั้งพยายามจะให้ระบบทำงานแบบอัตโนมัติได้มากที่สุดเท่าที่จะทำได้
และสิ่งที่ต้องคิดเพิ่มคือ
ในแต่ละขั้นตอนมันทำให้การทำงานง่ายขึ้นไหม ?
ถ้าทำไปแล้ว มันทำให้ชีวิตยากขึ้น ก็ไม่น่าทำนะ !!
เช่น ทำให้การ deploy ง่ายขึ้นหรือไม่ ?

Crash early, Crash often !!

Biggest challenges ของทีมมีอะไรบ้าง ?

  • Provisioning system
  • Configuration management
  • Python Packaging ซึ่งพบว่า PIP ไม่ตอบโจทย์ในการทำงาน และ มีปัญหาอย่างมาก ดังนั้นต้องใช้การจัดการรูปแบบอื่น ๆ
  • การสร้าง service ใหม่ ๆ ให้ง่ายสำหรับการ configuration และ deploy