f8268aec-8560-48b0-99e4-2bdbc80b03ba
ช่วงหลังไปงาน meetup มักจะได้ยินคำแปลก ๆ ใหม่ ๆ เยอะมาก
หนึ่งในนั้นก็คือ Blue-Green Deployment จาก Docker Meetup
ดังนั้น มาทำความรู้จักกันหน่อยสิ
ว่ามันคืออะไร ?
ว่ามันมีขั้นตอนการทำงานอย่างไร ?
ว่ามันมีประโยชน์อย่างไรบ้าง ?

มาดูรูปแบบการ deploy และ release ระบบงาน แบบเดิม ๆ กันก่อน

เมื่อต้องการ deploy ระบบงานใหม่ ๆ ขึ้นไปยัง production server
มักจะมีขั้นตอนดังนี้

  1. ต้องหยุดให้บริการระบบงานเดิมก่อน นั่นคือต้องปิดระบบกันก่อน
  2. ทำการ deploy ระบบงานใหม่ขึ้นไป
  3. ต้องทำการทดสอบภายในกันก่อน ว่าทำงานถูกต้องหรือไม่ ถ้าระบบซับซ้อนก็ใช้เวลานานหน่อย
  4. เมื่อทุกอย่างพร้อม ก็เปิดใช้งานระบบกันเลย (Release)

สิ่งที่เราจะได้รับจากวิธีการนี้คือ เวลา Downtime นั่นเอง
เราพยายามที่จะปรับปรุงขั้นตอนการ deploy ให้ใช้เวลาน้อยสุด ๆ

แต่อย่างไรก็ตามในโลกของระบบงานที่เป็น Monolithic
หรือทุกอย่างของระบบรวมกันอยู่ที่เดียวกันแบบใหญ่ ๆ
ก็ต้องพบปัญหา Downtime เป็นปกติ แถมหนักขึ้นทุกวันไปอีก
เนื่องจากระบบมีความซับซ้อนขึ้นในทุก ๆ วัน

ดังนั้นจึงมีแนวคิดในการ deploy งานแบบใหม่ ๆ ขึ้นมา
เพื่อลดเวลา Downtime ของการ deploy ลงไป
นั่นก็คือ Blue-Green Deployment

มาดูแนวคิดของ Blue-Green Deployment

เป็นแนวคิดที่เรียบง่ายมากคือ
เมื่อต้องการ deploy ระบบงานใหม่ ๆ ก็ไม่ต้องปิดระบบเดิม
ก็ปล่อยให้ระบบเดิมทำงานไป
และทำการ deploy ระบบใหม่ขึ้นไปแบบขนานเลย

โดยที่

  • Blue คือ ระบบเดิม หรือ New Green
  • Green คือ ระบบใหม่

แสดงดังรูป

immutable-microservices-only

จะสังเกตุได้ว่า พวก service หรือระบบงานต่าง ๆ
ต้องถูกกั้นด้วย proxy/router/load balance ซะ
เพื่อง่ายต่อการปรับเปลี่ยนการใช้งาน service ต่าง ๆ

โดยข้อดีของวิธีการนี้ประกอบไปด้วย

  • ลดเวลา Downtime
  • ลดความเสี่ยงในการ deploy
  • สามารถทดสอบได้นานเท่าที่ต้องการจนกว่าจะมั่นใจ

แต่สิ่งที่ตามมา และ สิ่งที่ต้องปรับปรุง ก็มีเยอะเช่นกัน ตัวอย่างเช่น

  • Environment ของระบบที่เพิ่มขึ้น
  • กระบวนการทดสอบระบบที่รวดเร็วขึ้น เช่น Automated testing
  • การออกแบบ service ในรูปแบบของ Microservice และ SOA เป็นต้น เพื่อให้แต่ละ service แยกออกจากกันอย่างชัดเจน เพื่อลดความซับซ้อนของระบบ และ ผลกระทบต่าง ๆ

ยิ่งในปัจจุบันมีทั้ง VM และ Docker ก็ยิ่งทำให้
การ deploy ระบบแบบ Blue-Green Deployment ทำได้ง่าย และ สะดวกมากยิ่งขึ้น

สิ่งที่น่าสนใจ และ สำคัญมาก ๆ คือ Database
บ่อยครั้งเราต้องการ update โครงสร้างของ database ทั้ง 2 version
ปัญหามักจะเกิดจากการ deploy และ release แต่ละครั้งนานจนเกินไป
ทำการทั้ง 2 version แตกต่างกันมากไป
และนั่นก็คือ ปัญหาใหญ่ !!

ดังนั้น การแก้ไขที่ง่าย และ ดีมาก ๆ คือ
ให้ทำการ deploy และ release database บ่อย ๆ สิ
จะทำให้เราสามารถดูแลและจัดการการเปลี่ยนแปลงของ database ได้ง่ายมากขึ้น

จำไว้เลยว่า ยิ่งเวลาแต่ละ deploy แต่ละ release
บ่อย ๆ ก็ยิ่งดีครับ

ปิดท้ายด้วย ขั้นตอนการทำงานของ Blue-Green Deployment

โดยใช้ตัวอย่างของ Microservice
ซึ่งถูกบรรจุไว้ใน container
มีขั้นตอนการทำงานดังนี้

1. เริ่มจากระบบการทำงานของระบบปัจจุบัน จะเรียกว่า Blue
ซึ่ง traffic การใช้งานจะผ่าน Proxy เสมอ
แสดงดังรูป

immutable-microservices-01

2. เมื่อต้องการ deploy ระบบใหม่ หรือเรียกว่า Green
จะทำการ deploy ระบบใหม่ขึ้นมาให้ทำงานแบบขนานกับของเดิมไปเลย
ซึ่งต้องทดสอบด้วยว่า ต้องไม่มีการใช้งานจากที่อื่นนะ
แน่นอนว่า ต้องไม่ส่งผลกระทบต่อระบบเดิมด้วย
แสดงดังรูป

immutable-microservices-02

3. เมื่อทดสอบระบบใหม่จนมั่นใจแล้ว ก็จะทำการ release ระบบงาน
ด้วยการเปลี่ยน configuration ที่ Proxy
เพื่อให้ traffic การใช้งานมายังระบบใหม่
แสดงดังรูป

immutable-microservices-03

4. เมื่อทุกอย่างเรียบร้อยก็ทำการ stop การทำงานของระบบเก่า หรือ ลบไปซะ
บางครั้งอาจจะยังไม่ลบออกไป
เนื่องจากเผื่อเอาไว้ใช้ rollback
เมื่อระบบใหม่ทำงานผิดพลาด
แสดงดังรูป

immutable-microservices-04

นี่คือความรู้พื้นฐานสำหรับการ deploy ระบบงานแบบ Blue-Green Deployment

น่าจะพอมีประโยชน์บ้างสำหรับการพัฒนา software
ซึ่ง Deployment != Release นะครับ

Reference Websites
http://technologyconversations.com/2016/02/08/blue-green-deployment/
https://docs.pivotal.io/pivotalcf/devguide/deploy-apps/blue-green.html
http://martinfowler.com/bliki/BlueGreenDeployment.html