The Story of Apollo – Amazon's Deployment Engine
Bài tóm tắt Amazon 2014 3. Quy mô lớn Độ khó: Dễ
Amazon · 2014 · 3. Quy mô lớn · Độ khó: Dễ — bài gốc
Bài ngắn của CTO Amazon, viết nhân dịp ra mắt AWS CodeDeploy (có phần quảng bá). Sheet trỏ tới bài ZDNet tóm tắt; wiki dùng bài gốc. Bài không nêu năm Apollo ra đời ("nhiều năm trước").
Bối cảnh
- Khi chuyển sang service-oriented architecture, Amazon tách phần mềm thành nhiều service nhỏ và tổ chức thành các team nhỏ tự chủ, mỗi team sở hữu cả phát triển lẫn vận hành một service. Team ra tính năng nhanh hơn, nhưng deploy thành nút cổ chai: các bước tay làm chậm release và gây lỗi do con người.
- Nhiều team tự tự động hoá deploy, nhưng việc này khó hơn tưởng: deploy lên một máy thì dễ (SSH, chạy script), còn ứng dụng của Amazon chạy trên đội máy lớn qua nhiều data center, không được downtime, nên phải xếp thứ tự cập nhật khi máy đang nhận traffic và xử lý đúng mọi kiểu lỗi.
Thay đổi chính
- Không để mỗi team làm lại việc này, Amazon dựng Apollo, dịch vụ deploy nội bộ dùng chung: developer định nghĩa cách cài phần mềm lên một máy, Apollo điều phối cho cả fleet; "bấm nút" deploy lên máy dev, staging, rồi production.
- Tính năng tích luỹ dần qua sử dụng:
- Rolling update: mỗi lần chỉ rút một phần máy ra để cập nhật, ứng dụng vẫn phục vụ.
- Fleet ở nhiều data center thì chia đều đợt cập nhật cho từng nơi, giữ fleet cân bằng và dư thừa khi có sự cố.
- Máy mới thêm khi scale up tự được cài bản mới nhất.
- Tự dừng deploy khi số máy cập nhật lỗi vượt ngưỡng cấu hình được, trước khi ảnh hưởng availability; lần deploy sau (ví dụ rollback nhanh) cập nhật các máy lỗi trước.
- Lịch sử deploy theo từng máy: bản nào lên production lúc nào, máy nào đang chạy bản nào, tuần trước chạy bản nào.
- Quy mô theo Vogels: trong 12 tháng tính tới 11/2014, hàng nghìn developer dùng Apollo cho 50 triệu lần deploy (dev, test, production), trung bình hơn một lần mỗi giây.
Vì sao
- Kiến trúc nhiều service nhỏ chỉ nhanh khi deploy rẻ và an toàn; logic deploy an toàn trên fleet lớn đủ khó để đáng làm một lần ở nền tảng chung.
Bài học cho SWE
- Microservice và team tự chủ đẩy nút cổ chai sang deploy; đầu tư nền tảng deploy chung đi cùng với việc tách service (Nền tảng nội bộ cho service (đường ray chung)).
- Các thành phần cơ bản của deploy an toàn trên fleet đã có từ trước 2014: rolling theo phần, chia đều theo vùng lỗi, ngưỡng tự dừng, ưu tiên sửa máy lỗi khi rollback (Deploy và release an toàn).
- Ghi lại trạng thái deploy theo từng máy để trả lời "đang chạy bản nào ở đâu" khi điều tra sự cố.
Liên quan
#Deployment#SOA#Rolling update#Fleet#Multi-datacenter#Auto-halt#Rollback#Internal platform#CodeDeploy
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (2)