Load Balancing trên AWS
Cân bằng tải - Load balancing là gì?
Load Balances có thể hiểu là các máy chủ phục vụ việc chuyển các requests (forward traffic) tới các đích đến khác nhau, ở đây có thể hiểu là các servers khác đang cung cấp dịch vụ (Ví dụ các máy chủ Amazon EC2).
Vậy các bộ cân bằng tải có tác dụng gì?
Mặc dù có rất nhiều ứng dụng, tuy nhiên ở giai đoạn mở đầu, chúng ta có thể hiểu rằng cân bằng tải sẽ giúp phân phối các request từ người dùng đến các máy chủ khác nhau, nhằm tránh tình trạng một cụm server hoạt động như nhau nhưng server A thì bị quá tải trong khi các server khác thì lại đang dư thừa tài nguyên. Giống như một đầu mối phân chia công việc cho team, các bộ cân bằng tải sẽ đảm bảo cho không "nhân viên" nào phải nghỉ việc vì quá tải, cũng như không trả lương cho ông nào chỉ để ngồi chơi.
Tại sao nên sử dụng các bộ cân bằng tải?
Ở phần trên, có lẽ chúng ta cũng nắm được cơ bản ý tưởng vì sao cần dùng đến các bộ cân bằng tải, tuy nhiên về mặt kỹ thuật thì chúng có thể làm được những gì?
Các bộ cân bằng tải nói chung có thể thực hiện được nhiều công việc hơn là chỉ đơn thuần là một đầu mối phân phối các requests. Thông thường, một bộ cân bằng tải có thể đảm nhiệm được các vai trò như sau:
- Phân phối các requests tới các máy chủ/instances khác nhau (Forward traffic), nhằm đảm bảo hệ thống có thể hoạt động bình thường khi lượng traffic tăng lên đột ngột (đạt đỉnh - peak) hoặc khi một số máy chủ bị lỗi, đồng thời đảm bảo việc sử dụng tài nguyên một cách hiệu quả, tránh lãng phí.
- Cân bằng tải theo các thuật toán khác nhau, ví dụ như Round Robin, Least Connection, Least Time, IP Hash, ... nhằm tối ưu hóa theo bài toán mà doanh nghiệp gặp phải.
- Expose ra một điểm truy cập duy nhất cho ứng dụng. Điều này có thể được hiểu là khi chúng ta cần gắn domain cho ứng dụng, bạn đơn giản là trỏ domain tới bộ cân bằng tải. Sau đó bộ cân bằng tải sẽ phân phối các requests tới các máy chủ/instances khác nhau. Điều này giúp chúng ta có thể nhanh chóng thực hiện chuyển đổi dự phòng khi một server gặp vấn đề, hay đơn giản là chuyển sang một server mới với ít thời gian downtime hơn so với việc cấu hình record DNS một cách thủ công.
- Cung cấp các tính năng healthcheck, bảo mật như SSL termination (HTTPS), Sticky sessions, ... cũng như điều phối lưu lượng một cách hợp lý giữa các nhóm traffic khác nhau (Ví dụ các Public Traffic và Private Traffic).
- Là một phần không thể thiếu khi thưc hiện các chiến lược High Availability & Scalability trên AWS.
Healthcheck là gì?
Healthcheck là một tính năng quan trọng của các bộ cân bằng tải. Nó cho phép chúng ta kiểm tra sức khỏe của các máy chủ/instances đang được cân bằng tải. Khi một máy chủ/instance nào đó không còn khả năng phục vụ các requests nữa, bộ cân bằng tải sẽ ngừng phân phối các requests tới máy chủ/instance đó, tránh làm request bị lỗi.
Healthcheck thực thi như thế nào?
Các bộ cân bằng tải sẽ định kỳ gửi các requests (gọi là request healthcheck) tới các máy chủ/instances đang được cân bằng tải. Nếu máy chủ/instance đó trả về response với HTTP status code 200, bộ cân bằng tải sẽ tiếp tục phân phối các requests tới máy chủ/instance đó. Ngược lại, nếu máy chủ/instance đó trả về response với HTTP status code khác 200 hoặc không phản hồi, bộ cân bằng tải sẽ ngừng phân phối các requests tới máy chủ/instance đó. Các API được gọi đến này thường được gọi là API Healthcheck, thường có path là /health hoặc /healthcheck, tuy nhiên chúng có thể được tùy biến dễ dàng.
Elastic Load Balancer (ELB) trên AWS là gì?
Elastic Load Balancer là các bộ cân bằng tải được cung cấp và quản lý bởi chính AWS. AWS sẽ đảm bảo chúng sẽ được hoạt động liên tục, cũng như chịu trách nhiệm upgrades, maintainance và giải quyết các bài toán high availability.
Chính vì được AWS quản lý từ A - Z như vậy nên AWS cũng chỉ cung cấp một số lượng hạn chế các cấu hình mà người dùng có thể tùy biến. Tuy nhiên trong đa phần các trường hợp, các cấu hình này là đủ dùng.
Nhìn chung, chi phí để setup một bộ cân bằng tải là không nhiều khi đem so sánh với các lợi ích mà nó đem lại.
Đối với các bộ Elastic Load Balancer trên AWS, chúng được AWS trang bị cho khả năng làm việc với hầu hết các dịch vụ phổ biến trên AWS, có thể kể đến các nhóm dưới đây:
- EC2, EC2 Auto Scaling Groups, Amazon ECS.
- AWS Certificate Manager (ACM), CloudWatch.
- Route 53, AWS WAF, AWS Global Accelerator.
Layer - lớp mạng là gì?
Ở phần tiếp theo, chúng ta sẽ vài lần đã nhắc đến các lớp mạng - Layer trong các bộ cân bằng tải. Vậy các lớp mạng này có thể hiểu như thế nào?
Layer 1 - Physical Layer
: là lớp mạng thấp nhất, nó đảm nhiệm việc truyền dữ liệu qua các kết nối vật lý như cáp, đường truyền, ...Layer 2 - Data Link Layer
: là lớp mạng bao gồm các quá trình phân giải MAC Address, các quá trình kiểm soát lỗi, và cả các dạng công nghệ như Ethernet hay Wifi được triển khai trên hạ tầng phần cứng.
Thông thường, Layer 1 và 2 liên quan đến các hệ thống nhúng (embedded systems) và các thiết bị mạng (network devices) như switch, router, ... nên không mấy quan trọng khi làm việc với AWS, ngoại trừ việc mất Internet.
Layer 3 - Network Layer
: là lớp mạng đảm nhiệm việc định tuyến (routing) các gói tin dữ liệu. Các giao thức như IP, ICMP, ARP, ... đều hoạt động ở lớp này. Gateway Load Balancer (GWLB) cũng là bộ cân bằng tải duy nhất hoạt động ở Layer 3.Layer 4 - Transport Layer
: Là lớp mạng đảm bảo tính an toàn, ổn định của việc truyền tài dữ liệu trên mạng. Lớp này bao gồm các giao thức TCP (Transmission Control Protocol) và UDP (User Datagram Protocol). Classic Load Balancer (CLB) và Network Load Balancer (NLB) là các bộ cân bằng tải hoạt động trên lớp này.Layer 5 - Session Layer
: Là lớp mạng quản lý các session hoặc quản lý quá trình giao tiếp giữa các ứng dụng trên các thiết bị khác nhau. Chúng đảm nhiệm việc Establishes, duy trì cũng như ngắt các session nói trên.Layer 6 - Presentation Layer
: Là lớp mạng đảm nhiệm việc mã hóa, giải mã, nén, giải nén, ... các dữ liệu trước khi chúng được truyền đi.Layer 7 - Application Layer
: Là lớp mạng đảm nhiệm việc xử lý các dữ liệu trên các ứng dụng. Các giao thức như HTTP (Hypertext Transfer Protocol), SMTP (Simple Mail Transfer Protocol) ... đều hoạt động ở lớp này. Classic Load Balancer (CLB) và Application Load Balancer (ALB) là các bộ cân bằng tải hoạt động trên lớp này.
Các loại cân bằng tải trên AWS
Elastic Load Balancer là khái niệm chung để chỉ các bộ cân bằng tải trên AWS.
Từ trước đến nay, AWS cung cấp cho chúng ta 4 loại Load Balancers khác nhau (trong đó có 3 loại vẫn còn đang được sử dụng), mỗi loại có những ưu điểm và hạn chế riêng và được phân chia theo các lớp mạng mà chúng hoạt động.
- Classic Load Balancer (CLB) (v1 - thế hệ cũ) – 2009: Cân bằng tải ở lớp TCP, cho phép điều phối các request dạng HTTP, HTTPS, TCP, SSL (secure TCP). Loại cân bằng tải này đã bị loại bỏ và được thay thế bởi các thế hệ kế tiếp ở phía dưới. Đây cũng là ALB phổ biến và hay được sử dụng nhất.
- Application Load Balancer (ALB) (v2 - thế hệ mới) – 2016: Được sinh ra để thay thế và là thế hệ tiếp sau của CLB, ALB hoạt động tương tự như CLB, chúng hoạt động ở lớp ứng dụng, giúp điều phối các request dạng HTTP, HTTPS, WebSocket.
- Network Load Balancer (NLB) (v2 - thế hệ mới) – 2017: Khác với ALB, NLB được sinh ra để hoạt động ở lớp các giao thức mạng, cho phép điều phối các request ở tầng thấp hơn như TCP, TLS (secure TCP), UDP.
- Gateway Load Balancer (GWLB) - 2020: GWLB chủ yếu hoạt động ở Layer 3 (Network Layer) - hay nói cách khác là hoạt động ở các lớp mạng (IP Protoco).
Về Security Groups cho các bộ cân bằng tải
Thông thường, các bộ cân bằng tải nên được gắn vào các security groups riêng biệt, và chúng cũng được cấu hình tương tự như khi làm việc với security group của các dịch vụ khác trên AWS.
Một điểm cần lưu ý là đối với các máy chủ/instances được kết nối tới các bộ cân bằng tải, chúng nên được cấu hình Security Group sao cho Allow traffic only from Load Balancer, điều này giúp các bộ cân bằng tải có thể hoạt động hiệu quả nhất, tránh các trường hợp ngoài ý muốn có thể xảy đến.