Vì sao Precog chọn Fargate?

Ở phần trước tôi đã giới thiệu về AWS Lambda và CloudWatch được sử dụng trong dự án Precog.

Phần này, chúng ta sẽ tiếp tục với chủ đề thay thế EC2 bằng AWS Fargate trong dự án Precog. Vì sao chúng tôi cần sử dụng Fargate thay vì EC2?

Khi sử dụng EC2 lượng dữ liệu tính toán tăng nhanh, ban đầu chúng tôi chọn scale up để vận hành hệ thống. Nhưng, điều này không thực sự hiệu quả vì chúng tôi đã scale up đến m5.2xlarge mà hệ thống vẫn chạy hết 8-9h trong khi lượng dữ liệu cần tính toán thì không ngừng tăng lên.

Vì vậy, chúng tôi nghĩ đến việc scale out hệ thống. Tận dụng AWS chúng tôi chọn Fargate để giải quyết vấn đề này.

Vậy Fargate là gì?

AWS Fargate cho phép chạy các container mà không cần phải quản lý servers hoặc clusters hay nói cách khác Fargate sẽ chịu trách nhiệm quản lý từ đầu đến cuối container của bạn. Bạn không cần ssh vào server hay instance để xem container của mình hoạt động ra sao scale như thế nào. Fargate sẽ giúp bạn lo hết những vấn đề này, bạn chỉ cần tập trung vào thiết kế và xây dựng ứng dụng của mình.

I. Các công nghệ được sử dụng:

GitLab: quản lý source code của dự án, được sử dụng như một công cụ triển khai CI/CD.

ECR: quản lý các image.

ECS: dựng và quản lý các container dựa trên các image có sẵn. Có 2 chế độ: khởi chạy Fargate hoặc khởi chạy EC2.

EC2: là một cloud server cung cấp tài nguyên máy ảo theo yêu cầu.

Task Definition: dùng để định nghĩa các nhiệm vụ sẽ được thực thi bao gồm cả các định nghĩa về tài nguyên sử dụng. Chúng tôi sử dụng một plugin của Digdag để khởi tạo task definition một cách tự động. Điều này sẽ giúp việc vận hành trở nên dễ dàng hơn và tuân thủ theo cách tiếp cận infrastructure as code.

Digdag: là một tool open source của Treasure data giúp tạo và quản lý các task theo một workflow. Nó bao gồm các thành phần sau:

1. REST API: cung cấp giao diện cho phía người dùng

2. Task Agent: triển khai các task trong workflow

3. Workflow executor: quản lý qúa trình thực hiện workflow

4. Schedule executor: quản lý lịch trình các workflow

 

II. Những lợi ích của Fargate mà ta có thể thấy:

  • Không cần quản lý cụm máy chủ: Ta chỉ cần quan tâm đến container vì vậy ta chỉ cần tập trung xây dựng và vận hành ứng dụng. Việc quản lý một cluster Amazon EC2 sẽ được thay thế bở AWS Fargate. Bạn không cần phải chọn phiên bản, lập lịch cluster hay tối ưu hoá việc sử dụng cluster tất cả những điều này cứ để fargate lo.
  • Với Fargate ứng dụng của bạn sẽ dễ dàng trong việc mở rộng, bạn chỉ cần xác định các yêu cầu với ứng dụng (như CPU, bộ nhớ,…) sau khi bạn xác định rõ ràng các thông số của ứng dụng, AWS Fargate sẽ quản lý tất cả những hoạt động thay đổi và các cơ sở hạ tầng cần thiết để chạy các container với độ sẵn sàng cao. Với Fargate bạn có thể khởi chạy nhiều container trong vài giây và dễ dàng scale để chạy các ứng dụng quan trọng của bạn.
  • Tích hợp với Amazon ECS: AWS Fargate được tích hợp với AWS ECS, bạn chỉ cần định nghĩa ứng dụng của bạn như cách làm với Amazon ECS. Bạn đóng gói ứng dụng vào các task, chỉ rõ CPU và bộ nhớ cần thiết, xác định networking và các IAM mà các container cần. Sau đó tải mọi thứ lên Amazon ECS, sau khi mọi thứ được setup AWS Fargate khởi chạy và quản lý các container.

III. Giá cả:

  • AWS Fargate không yêu cầu bất kỳ khoản phí trả trước nào, bạn chỉ cần trả phí cho những gì mình sử dụng như vCPU và memory
  • Về AWS ECS, giá của AWS Fargate được tính dựa theo tài nguyện vCPU và memory đã sử dụng từ khi bạn bắt đầu download image (docker pull) cho đến khi AWS ECS Task dừng (một Task là một tập các container chạy cùng nhau như một ứng dụng), làm chòn đến số giây gần nhất. Áp dụng mức phí tối thiểu là một phút.
  • Phụ phí: bạn có thể phải trả thêm phụ phí nếu container của bạn sử dụng dịch vụ AWS khác.

Chi tiết giá (khu vực Singapore):

Mỗi vCPU theo mỗi giờ: 0,05056 USD

Mỗi GB theo mỗi giờ: 0,00553 USD

Các cấu hình được hỗ trợ:

CPUGiá trị bộ nhớ
0,25 vCPU0,5GB, 1GB và 2 GB
0,5 vCPUMin 1GB và Max 4GB, tăng dần theo mỗi 1GB
1 vCPUMin 2GB và Max 8GB, tăng dần theo mỗi 1GB
2 vCPUMin 4GB và Max 16GB, tăng dần theo mỗi 1GB
4 vCPUMin 8GB và Max 30GB, tăng dần theo mỗi 1GB

Ví dụ về tính tri phí (mức giá tính theo Khu vực Miền Đông Hoa Kỳ – Virginia):

Dịch vụ của bạn dùng 5 Task ECS, chạy 10 phút (600 giây) cho mỗi ngày trong suốt 1 tháng (30 ngày), với ECS Task dùng 1vCPU và 2GB bộ nhớ.

Mức phí CPU hàng tháng: Tổng phí vCPU = số lượng Task x số lượng vCPU x giá mỗi CPU theo giây x thời lượng CPU mỗi ngày (theo giây) x số ngày.

=> Tổng phí vCPU = 5 x 1 x 0,000011244 x 600 x 30 = 1.01 USD

Mức phí memory hàng tháng: Tổng phí bộ nhớ = số lượng Task x bộ nhớ theo GB x giá mỗi GB x thời lượng bộ nhớ mỗi ngày (giây) x số ngày.

=> Tổng phí memory = 5 x 2 x 0,000001235 x 600 x 30 = 0.22 USD

Phí Fargate hàng tháng = phí vCPU + phí memory

=> Phí Fargate hàng tháng = 1.01 USD + 0.22 USD = 1.23 USD

IV. Áp dụng trong dự án Precog:

Hệ thống cũ sử dụng EC2:

Như các bạn thấy, EC2 sẽ chịu trách nhiệm tất cả các công việc. Từ việc lấy dữ liệu từ Treasure data và PostgreSQL -> thực hiện tính toán -> đổ dữ liệu đã tinh chỉnh vào MySQL.

Sử dụng Fargate:


Chúng tôi sử dụng Fargate, khối lượng công việc lớn đã được phân chia nhỏ cho từng container, việc scale up/scale out cũng trở nên dễ dàng hơn hệ thống cũ rất nhiều.

Quá trình vận hành bao gồm các bước:

  1. Merge code trên gitlab
  2. Gitlab runner build image docker và push lên AWS ECR
  3. ECS thực hiện khởi chạy Fargate dựa trên các task được định ngĩa trong Digdag.
  4. Các task trong Digdag vận hành như đã được định nghĩa, mỗi task tương ứng với một ECS.

Khi hệ thống vận hành:

  • start task: nguồn tài nguyên tương ứng được cung cấp để container hoạt động
  • stop task: nguồn tài nguyên này sẽ được tự động giải phóng

Chúng tôi thực hiện xác định memory, cpu và các biến đầu vào cần sử dụng cho từng container, những item có lượng dữ liệu tính toán lớn chúng tôi yêu cầu cấp phát cpu và memory lớn hơn những item có lượng dữ liệu nhỏ, như những gì chúng ta thấy ở hình dưới:

Các bạn có thể quan sát các task đã được định nghĩa và tiến trình làm việc bằng màn hình dashboard của Digdag như sau:

 

 

             

Thông tin chi tiết của container thực thi task trên:

 

AWS cho bạn quan sát các task đang làm việc. Chúng ta có thể chạy nhiều container một lúc để tăng hiệu suất công việc. Trong ví dụ này tôi chỉ tính toán dữ liệu cho 1 media và chỉ run 1 task duy nhất:

 

Mỗi container sẽ chạy và giải phóng tài nguyên ngay khi công việc kết thúc. Nhờ vậy chúng tôi có thể tối ưu hoá việc sử dụng tài nguyên, dễ ràng scale up/scale out khi cần thiết, rút ngắn thời gian chạy batch và giảm chi phí vận hành dự án.

Trước đây khi sử dụng EC2 chúng tôi phải ngồi đợi batch chạy cả giờ đồng hồ chưa kể nếu có task nào ngỏm thì lại phải chạy lại rồi ngồi chờ tiếp cả giờ đồng hồ nữa. Mỗi tuần chúng tôi thực hiện chạy tính toán một vài lần với lượng dữ liệu lớn – mỗi item đến 20M (record), điều đó có nghĩa là server của chúng tôi vẫn bật liên tục trong khi chúng tôi chỉ sử dụng nó trong một vài thời điểm nhất định → bỏ phí ra thuê mà không dùng hết thì thật là lãng phí, hơn nữa việc mở rộng khi gặp những item có lượng lớn dữ liệu cũng tốn công.

→ Rõ ràng Fargate cho chúng tôi hiệu suất cao hơn, thời gian chạy batch nhanh hơn (sự thật là đã nhanh hơn gấp 4 lần), tiết kiệm chi phí hơn và việc mở rộng khi gặp những item có lượng dữ liệu cần tính toán lớn cũng linh hoạt hơn nhiều EC2.

V. Kết luận

Fargate đã giúp chúng tôi tăng hiệu suất công việc, giảm chi phí vận hành, giảm thời gian chạy batch.

Tuy nhiên, hiện tại chúng tôi chỉ có thể chạy tối đa 20 task cùng một thời điểm. Đây sẽ là vấn đề khi khối lượng công việc tăng lên trong tương lai.

Chúng tôi sẽ tiếp tục tìm kiếm các giải pháp tối ưu hơn nữa và chia sẻ với các bạn.

Add a Comment

Scroll Up