Distributed System: Load balancing trong Distributed System
Load Balancing là gì?
Load Balancing (cân bằng tải) là một thành phần cực kỳ quan trọng trong một distributed system. Nó giúp cho hệ thống có thể phân tải các request tới các Server khác nhau (Application hoặc Database), giúp cho hệ thống có tính sẵn sàng cao (high availability).
Load Balancing sẽ liên tục kiểm tra (health checks) tình trạng của các server trong hệ thống. Nếu trạng thái của server là khỏe mạnh (healthy) thì nó sẽ gửi request tới. Ngược lại, nếu trạng thái của server là không sẵn sàng (not available) hoặc không có response trả về (not healthy) thì Load Balancing sẽ không gửi request tới server đó nữa cho tới khi server đó hoạt động trở lại.
Các mô hình Load Balancing
Single Load Balancing
Chỉ sử dụng một Load Balancer để cân bằng tải, giúp tiết kiệm chi phí và nâng cao tính sẵn sàng của hệ thống. Tuy nhiên sẽ có nguy cơ dẫn tới tình trạng thắt cổ chai (bottleneck) ngay tại Load Balancer. Và nếu Load Balancer này gặp sự cố thì không thể truy cập hệ thống được.
Load Balancing nhiều lớp
Để hệ thống có tính high availability, thì ta có thể áp dụng Load Balancing nhiều lớp (layer). Ví dụ: áp dụng Load Balancing cho Website, web API server, … Tuy nhiên Load Balancing nhiều lớp vẫn có nguy cơ dẫn tới tình trạng thắt cổ chai (bottleneck) ngay tại Load Balancer. Và nếu Load Balancer này gặp sự cố thì không thể truy cập hệ thống được.
Active-Standby Load Balancing
Để khắc phục các nhược điểm ở hai mô hình trên tốt nhất nên có 2 Load Balancer kết hợp với nhau thành một cụm Load Balancing chạy dưới dạng active-standby
. Điều này có nghĩa là luôn có một Load Balancer backup cho Load Balancer chính.
Những lợi ích của Load Balancing
- Trải nghiệm người dùng sẽ tốt hơn, hệ thống sẽ không bị gián đoạn bởi bất kỳ một sự cố nào xảy ra trên một hoặc vài server. Ngoài ra Load Balancing cũng giúp tăng tốc độ truy vấn của người dùng nhờ năng lực của nhiều server hợp lại.
- Load Balancing giúp cho quản trị viên dễ dàng thực hiện scale up hoặc scale down hệ thống mà không làm gián đoạn hệ thống, ảnh hướng tới tính sẵn sàng cao (high available) của hệ thống.
- Một Load Balancing thông minh sẽ giúp người quản trị viên xác định được những tắc nghẽn hay quá tải (traffic bottlenecks) trước khi nó xảy ra, để người quản trị có thể hành động kịp thời, như scale up hệ thống.
- Bằng cách sử dụng Load Balancing, những yêu cầu từ người dùng sẽ được tiếp nhận và xử lý trước khi phân chia đến các server. Đồng thời, quá trình phản hồi cũng được thông qua Load Balancing, ngăn cản việc người dùng giao tiếp trực tiếp với máy chủ, ẩn đi thông tin và cấu trúc mạng nội bộ, từ đó chặn đứng những cuộc tấn công mạng hay truy cập trái phép…
Các giao thức mà Load Balancing hỗ trợ
Load Balancing hỗ trợ 4 loại giao thức chính sau đây:
- HTTP: dựa trên cơ chế HTTP chuẩn, HTTP Balancing đưa ra yêu cầu tác vụ. Load Balancer đặt X-Forwarded-For, X-Forwarded-Proto và tiêu đề X-Forwarded-Port cung cấp các thông tin backends về những yêu cầu ban đầu.
- HTTPS: các chức năng tương tự HTTP Balancing. HTTPS Balancing được bổ sung mã hóa và nó được xử lý bằng 2 cách: passthrough SSL duy trì mã hóa tất cả con đường đến backend hoặc: chấm dứt SSL, đặt gánh nặng giải mã vào load balancer và gửi lưu lượng được mã hóa đến backend.
- TCP: trong một số trường hợp khi ứng dụng không sử dụng giao thức HTTP hoặc HTTPS, TCP sẽ là một giải pháp để cân bằng lưu lượng. Cụ thể, khi có một lượng truy cập vào một cụm cơ sở dữ liệu, TCP sẽ giúp lan truyền lưu lượng trên tất cả các máy chủ
- UDP: trong thời gian gần đây, Load Balancer đã bổ sung thêm hỗ trợ cho cân bằng tải giao thức internet lõi như DNS và syslogd sử dụng UDP.
Các quy tắc chuyển tiếp sẽ xác định loại giao thức và cổng vào Load Balancer để di chuyển đến các giao thức. Cổng Load Balancer lúc này được sử dụng để định tuyến lưu lượng trên backend.
Health Checks
Có thể hiểu một cách đơn giản, Health Checks là việc kiểm tra tình trạng của một Backend Server. Bằng cách kết nối đến Backend Server dùng giao thức và cổng được định nghĩa bởi các quy tắc chuyển tiếp, nó đảm bảo rằng các máy chủ vẫn đang hoạt động ổn định.
Trong trường hợp máy chủ không hoạt động, Health Checks sẽ loại chúng ra khỏi vùng chứa. Điều này đồng nghĩa với việc các request sẽ không được chuyển tiếp đến máy chủ này nữa cho đến khi chúng vượt qua “bài kiểm tra” Health Checks sau.
Qua quá trình này, Load Balancing có thể chuyển tiếp trực tiếp lưu lượng đến các Backend Server đang thật sự hoạt động nhằm giải quyết mọi tác vụ của người dùng.
Các thuật toán Load Balancing
Tùy thuộc công nghệ Load Balancing mà các thuật toán khác nhau sẽ được sử dụng để định tình trạng của máy chủ có hoạt động hay không. Có các loại thuật toán thường thấy là:
- Round Robin
- Weighted Round Robin
- Dynamic Round Robin
- Fastest
- Least Connections
Round Robin
Round Robin là thuật toán lựa chọn các máy chủ theo trình tự. Theo đó, Load Balancer sẽ bắt đầu đi từ máy chủ số 1 trong danh sách của nó ứng với yêu cầu đầu tiên. Tiếp đó, nó sẽ di chuyển dần xuống trong danh sách theo thứ tự và bắt đầu lại ở đầu trang khi đến máy chủ cuối cùng.
Nhược điểm thuật toán Round Robin là gì?
Khi có 2 yêu cầu liên tục từ phía người dùng sẽ có thể được gửi vào 2 server khác nhau. Điều này làm tốn thời gian tạo thêm kết nối với server thứ 2 trong khi đó server thứ nhất cũng có thể trả lời được thông tin mà người dùng đang cần. Để giải quyết điều này, round robin thường được cài đặt cùng với các phương pháp duy trì session như sử dụng cookie.
Weighted Round Robin
Tương tự như kỹ thuật Round Robin nhưng WRR còn có khả năng xử lý theo cấu hình của từng server đích. Mỗi máy chủ được đánh giá bằng một số nguyên (giá trị trọng số Weight – mặc định giá trị là 1). Một server có khả năng xử lý gấp đôi server khác sẽ được đánh số lớn hơn và nhận được số request gấp đôi từ bộ cân bằng tải.
Nhược điểm thuật toán Load Balancing – Weighted Round Robin là gì?
Weighted Round Robin gây mất cân bằng tải động nếu như tải của các request liên tục thay đổi trong một khoảng thời gian rộng.
Dynamic Round Robin
Thuật toán DRR hoạt động gần giống với thuật toán WRR. Điểm khác biệt là trọng số ở đây dựa trên sự kiểm tra server một cách liên tục. Do đó trọng số liên tục thay đổi.
Việc chọn server sẽ dựa trên rất nhiều khía cạnh trong việc phân tích hiệu năng của server trên thời gia thực. Ví dụ: số kết nối hiện đang có trên các server hoặc server trả lời nhanh nhất, …
Thuật toán này thường không được cài đặt trong các bộ cân bằng tài đơn giản. Nó thường được sử dụng trong các sản phẩm cân bằng tải của F5 Network.
Fastest
Đây là thuật toán dựa trên tính toán thời gian đáp ứng của mỗi server (response time). Thuật toán này sẽ chọn server nào có thời gian đáp ứng nhanh nhất. Thời gian đáp ứng được xác định bởi khoảng thời gian giữa thời điểm gửi một gói tin đến server và thời điểm nhận được gói tin trả lời.
Việc gửi và nhận này sẽ được bộ cân bằng tải đảm nhiệm. Dựa trên thời gian đáp ứng, bộ cân bằng tải sẽ biết chuyển yêu cầu tiếp theo đến server nào.
Thuật toán Fastest thường được dùng khi các server ở các vị trí địa lý khác nhau. Như vậy người dùng ở gần server nào thì thời gian đáp ứng của server đó sẽ nhanh nhất. Cuối cùng server đó sẽ được chọn để phục vụ.
Least Connections
Các request sẽ được chuyển vào server có ít kết nối nhất trong hệ thống. Thuật toán này được coi như thuật toán động, vì nó phải đếm số kết nối đang hoạt động của server.
Least Connections có khả năng hoạt động tốt. Ngay cả khi tải của các kết nối biến thiên trong một khoảng lớn. Do đó nếu sử dụng RC sẽ khắc phục được nhược điểm của Round Robin.
Load Balancer dự phòng
Trong nhiều trường hợp, chỉ có một Load Balancer là điểm truy cập duy nhất. Nếu có bất kỳ sự cố gì xảy ra với Load Balancer này thì đúng là thảm họa. Chính vì vậy, chúng ta cần có một Load Balancer thứ hai để giải quyết vấn đề này.
Load Balancer thứ hai này bình thường sẽ không hoạt động (ở chế độ passive). Khi Load Balancer chính xảy ra sự cố thì Load Balancer này sẽ được kích hoạt tự động để thay thế cho Load Balancer chính.
Sẽ ra sao khi xảy ra trường hợp Load Balancer chính bị lỗi? Balancer thứ hai sẽ nhận trách nhiệm thay thế, do DNS di chuyển người dùng đến. Tuy nhiên, việc thay đổi DNS có thể mất nhiều thời gian trên internet. Và để chuyển đổi dự phòng được tự động, các quản trị viên sẽ cho phép linh hoạt địa chỉ IP Remapping. Chẳng hạn như trường hợp này là floating IPs.
IP Remapping giúp loại bỏ các vấn đề bộ nhớ đệm vốn có trong những thay đổi DNS. IP Remapping sẽ cung cấp một địa chỉ IP tĩnh. Địa chỉ IP này có thể được dễ dàng ánh xạ lại khi cần thiết. Tên miền có thể duy trì liên kết với các địa chỉ IP. Trong khi các địa chỉ IP của chính nó được di chuyển giữa các máy chủ.
Tổng kết
Hy vọng rằng những thông tin được cung cấp trong bài viết sẽ giúp bạn có được cái nhìn tổng quan về Load Balancing. Đây một trong những thành phần quan trọng trong một hệt thống phân tán (Distributed System).
Load Balancing hỗ trợ 4 loại giao thức chính là: HTTP, HTTPS, TCP và UDP.
Load Balancing sử dụng các thuật toán sau để chia tải:
- Round Robin
- Weighted Round Robin
- Dynamic Round Robin
- Fastest
- Least Connections