Tổng quan về HAProxy và Load Balancing

1991
12-07-2018
Tổng quan về HAProxy và Load Balancing

HAProxy (viết tắt của High Availability Proxy), là một phần mềm mã nguồn mở phổ biến TCP/ HTTP Load Balancer và giải pháp proxy có thể chạy trên Linux, Solaris và FreeBSD. HAProxy giúp cải thiện hiệu suất và độ tin cậy của môi trường máy chủ bằng cách phân phối khối lượng công việc trên nhiều server . Nó cũng được sử dụng trong những ứng dụng online lớn trên thế giới, bao gồm: GitHub, Imgur, Instagram và Twitter. Trong phạm vi bài viết hôm nay, Bizfly Cloud sẽ giúp bạn hiểu tổng quan về HAProxy và Load Balancing.

HAProxy

Có rất nhiều thuật ngữ và khái niệm quan trọng khi nhắc đến load balancing và proxying. Chúng ta sẽ lần lượt điểm qua các thuật ngữ thường được sử dụng.

Trước khi đi vào các kiểu cân bằng tải cơ bản, chúng ta sẽ nói về các ACL, các backend và các frontend.

Tổng quan về HAProxy và Load Balancing - Ảnh 1.

Cân bằng tải với HAProxy

Access Control List (ACL)

Xét về load balancing, ACL được sử dụng để kiểm tra một số điều kiện và thực hiện hành động (ví dụ: chọn server hoặc block một request) dựa trên kết quả kiểm tra. Việc sử dụng ACL cho phép linh hoạt chuyển tiếp lưu lượng mạng dựa trên nhiều yếu tố khác nhau, ví dụ như pattern-matching và số lượng kết nối với một backend.

Ví dụ về một ACL:

acl url_blog path_beg /blog

ACL này sẽ trở nên phù hợp nếu đường dẫn request của người dùng bắt đầu bằng /blog. Điều này sẽ tương ứng với request của http://yourdomain.com/blog/blog-entry-1 chẳng hạn.

Nếu bạn muốn được hướng dẫn chi tiết về cách sử dụng ACL, hãy tham khảo Hướng dẫn Cấu hình HAProxy.

Backend

Một backend là một tập các servers nhận các requests được chuyển tiếp. Các backends được định nghĩa thuộc backend section của cấu hình HAProxy. Về cơ bản, một backend có thể được định nghĩa bởi:

- Thuật toán load balance được sử dụng.

- Danh sách servers và ports.

Một backend có thể chứa một hoặc nhiều máy chủ trong đó, việc thêm nhiều servers hơn vào backend sẽ tăng khả năng tải bằng cách mở rộng tải trên nhiều servers. Đồng thời độ tin cậy cũng tăng theo, trong trường hợp một số backend servers của bạn không khả dụng.

Dưới đây là một ví dụ về cấu hình backend, web-backend và blog-backend với hai webservers cho mỗi loại trên port 80:

backend web-backend  

balance roundrobin   

server web1 web1.yourdomain.com:80 check   

server web2 web2.yourdomain.com:80 check 

backend blog-backend   

balance roundrobin   

mode http   

server blog1 blog1.yourdomain.com:80 check   

server blog1 blog1.yourdomain.com:80 check

- "balance roundrobin" xác định thuật toán load balancing.

- "mode http" xác định layer 7 proxying sẽ được sử dụng.

Tùy chọn "check" ở phần cuối các chỉ thị của server chỉ định rằng các kiểm tra sức khỏe sẽ được thực hiện trên các backend servers đó.

Frontend

Một frontend xác định cách các requests sẽ được chuyển tiếp đến các backends. Frontend được định nghĩa trong phần frontend của cấu hình HAProxy. Định nghĩa của chúng bao gồm các thành phần sau:

- Một tập hợp các địa chỉ IP và một cổng (ví dụ: 10.1.1.7:80, *: 443,...)

- Các ACL

- Các quy tắc use_backend, các quy tắc này xác định các backend nào sẽ sử dụng, tùy thuộc vào điều kiện ACL nào thích hợp, và/ hoặc một quy tắc default_backend xử lý mọi trường hợp khác.

Một frontend có thể được cấu hình cho các loại lưu lượng mạng khác nhau.

Phân loại Load Balancing

Vậy là chúng ta đã tìm hiểu xong về các thành phần cơ bản được sử dụng trong cân bằng tải, tiêp theo là các kiểu cân bằng tải cơ bản.

>> Tìm hiểu thêm : Vì sao Load Balancing - Cân bằng tải có tầm quan trọng KHÔNG THỂ THIẾU trong hệ thống

Không Load Balancing

Môi trường web application đơn giản không có load balancing sẽ như sau:

Tổng quan về HAProxy và Load Balancing - Ảnh 2.

Trong ví dụ này, người dùng kết nối trực tiếp với web server, tại yourdomain.com và không có cân bằng tải. Nếu web server duy nhất này của bạn bị hỏng, người dùng sẽ không thể truy cập vào web server được nữa. Ngoài ra, nếu có một số lượng lớn người dùng đang truy cập vào web server cùng một lúc, máy chủ quá tải, người dùng có thể phải trải nghiệm một tốc độ tải chậm chạp, thậm chí không thể kết nối nổi vào website của bạn.

Layer 4 Load Balancing

Cách đơn giản nhất để cân bằng tải lưu lượng mạng tới nhiều server là sử dụng layer 4 (transport layer) load balancing. Cân bằng tải theo cách này sẽ chuyển tiếp lưu lượng truy cập của người dùng dựa trên phạm vi IP và port (ví dụ: nếu có request đến cho http://yourdomain.com/anything, traffic sẽ được chuyển tiếp đến backend xử lý tất cả các request cho yourdomain.com trên port 80).

Sau đây là sơ đồ ví dụ đơn giản về layer 4 load balancing:

Tổng quan về HAProxy và Load Balancing - Ảnh 3.

Người dùng truy cập load balancer, load balancer chuyển tiếp request của người dùng đến nhóm web-backend của các backend servers. Backend server được chọn sẽ phản hồi trực tiếp request của người dùng. Nói chung, tất cả các servers trong web-backend đều phải phân phối nội dung đồng nhất - nếu không, người dùng có thể nhận được nội dung không nhất quán. Lưu ý rằng cả web servers đều kết nối với cùng một database server.

Layer 7 Load Balancing

Một cách phức tạp hơn để cân bằng tải network traffic là sử dụng layer 7 (application layer) load balancing. Sử dụng layer 7 cho phép bộ cân bằng tải chuyển tiếp các requests đến các backend server khác nhau dựa trên nội dung request của người dùng. Chế độ cân bằng tải này cho phép bạn chạy nhiều web application servers trong cùng một domain và port.

Sau đây là sơ đồ ví dụ đơn giản về layer 7 load balancing:

Tổng quan về HAProxy và Load Balancing - Ảnh 4.

Trong ví dụ này, nếu người dùng yêu cầu yourdomain.com/blog, họ được chuyển tiếp đến blog backend, là một tập hợp các servers chạy một ứng dụng blog. Các yêu cầu khác được chuyển tiếp tới web-backend, web-backend này có thể đang chạy một ứng dụng khác. Cả hai backend đều sử dụng cùng một máy chủ cơ sở dữ liệu.

Sau đây là ví dụ cấu hình frontend:

frontend http  

bind *:80  

mode http  

acl url_blog path_beg /blog  

use_backend blog-backend if url_blog  

default_backend web-backend

Ví dụ này cấu hình một frontend có tên http, xử lý tất cả lưu lượng truy cập đến trên port 80.

acl url_blog path_beg /blog khớp với request nếu đường dẫn request của người dùng bắt đầu bằng /blog.

use_backend blog-backend if url_blog sử dụng ACL để ủy quyền lưu lượng truy cập vào blog-backend.

default_backend web-backend chỉ định rằng tất cả traffic khác sẽ được chuyển tiếp đến web-backend.

>> Tìm hiểu thêm về Load Balancing ở Layer 4 và Layer 7

Tổng quan về HAProxy và Load Balancing - Ảnh 5.

Thuật toán Load Balancing

Thuật toán cân bằng tải được sử dụng để xác định máy chủ nào trong backend sẽ được chọn khi cân bằng tải. HAProxy cung cấp một số tùy chọn cho các thuật toán. Ngoài thuật toán cân bằng tải, server có thể được chỉ định tham số weight để xác định tần suất server được chọn, so với các server khác.

Tuy HAProxy cung cấp rất nhiều thuật toán cân bằng tải nhưng chúng ta sẽ chỉ tìm hiểu một số thuật toán nhất định thường được sử dụng dưới đây:

round-robin

Thuật toán round-robin thực hiện chọn servers theo lần lượt. Đây chính là thuật toán mặc định.

leastconn

Chọn server có số lượng kết nối ít nhất - được khuyến nghị cho các phiên dài hơn. Các servers trong cùng một backend cũng được xoay vòng theo kiểu round-robin.

source

Thuật toán này sẽ chọn server nào sẽ sử dụng dựa trên hàm băm của IP nguồn tức là địa chỉ IP của người dùng. Đây là một phương pháp để đảm bảo rằng người dùng sẽ kết nối với cùng một server.

Sticky Sessions

Một số ứng dụng yêu cầu người dùng tiếp tục kết nối với cùng một backend server. Sự tiếp tục kết nối này đạt được thông qua các phiên cố định, sử dụng tham số appsession trong backend yêu cầu nó.

Health Check

HAProxy sử dụng health-check để xác định xem backend server có sẵn sàng để xử lý yêu cầu hay không. Điều này sẽ giúp bạn không phải xóa server khỏi backend một cách thủ công nếu server không khả dụng. Mặc định, health-check tức là cố gắng thiết lập kết nối TCP tới server, nghĩa là nó kiểm tra xem backend server có đang lắng nghe địa chỉ IP và port được cấu hình hay không.

Nếu server không đạt health-check, nó sẽ không thể xử lý được request, nó sẽ tự động bị vô hiệu hóa trong backend, tức là lưu lượng truy cập sẽ không được chuyển tiếp đến khi nó khỏe mạnh trở lại. Nếu tất cả các servers trong một backend đều không đạt health-check, dịch vụ sẽ không khả dụng cho đến khi có ít nhất một trong các backend servers đó khỏe mạnh trở lại.

Đối với một số backend nhất định, ví dụ như database servers trong trường hợp cụ thể, health check mặc định không đủ để xác định liệu server có hiệu quả hay không.

Các giải pháp khác

Nếu cảm thấy HAProxy có hơi phức tạp đối với nhu cầu của mình, bạn hãy tham khảo các giải pháp sau đây:

- Máy chủ ảo Linux (Linux Virtual Servers, viết tắt: LVS): Một cân bằng tải layer 4 đơn giản, nhanh chóng có trong nhiều bản phân phối Linux.

- Nginx: Một web server nhanh chóng và đáng tin cậy cũng có thể được sử dụng cho mục đích proxy và load-balancing. Nginx thường được sử dụng kết hợp với HAProxy để thực hiện kết hợp caching và nén.

High Availability

Các thiết lập cân bằng tải layer 4 và layer 7 đều sử dụng bộ cân bằng tải để hướng lưu lượng truy cập đến một trong những backend servers. Tuy nhiên, load balancer là một điểm thất bại duy nhất trong các thiết lập này; nếu bị down hoặc bị quá tải với các requests, load balancer sẽ gây ra sự chậm trễ hoặc downtime cho dịch vụ của bạn.

Thiết lập high availability (HA) là một cơ sở hạ tầng không hề có một điểm lỗi nào. Bằng cách thêm dự phòng vào mỗi lớp của kiến trúc, HA sẽ ngăn được sự cố gặp phải khi một server duy nhất bị lỗi, giúp hệ thống không bị downtime. Bộ cân bằng tải tạo điều kiện thuận lợi cho dự phòng của backend layer (web/ app servers), nhưng nếu muốn đạt được độ khả dụng cao nhất, bạn cũng cần có bộ cân bằng tải dự phòng.

Dưới đây là sơ đồ về thiết lập high availability cơ bản:

Tổng quan về HAProxy và Load Balancing - Ảnh 6.

Trong ví dụ này, bạn có nhiều bộ cân bằng tải (một bộ ở trạng thái đang kích hoạt và một hoặc nhiều bộ ở trạng thái bị động) đằng sau một địa chỉ IP tĩnh có thể được ánh xạ từ server này sang server khác. Khi người dùng truy cập vào website, request sẽ đi qua địa chỉ IP bên ngoài đến load balancer đang hoạt động. Nếu load balancer không khả dụng, cơ chế chuyển đổi dự phòng (failover) sẽ phát hiện và tự động gán lại địa chỉ IP cho một trong các server bị động.

Kết luận

Vậy là qua bài viết trên đây, Bizfly Cloud đã giúp bạn hiểu rõ hơn về các khái niệm, cơ chế liên quan tới load balancing, các cách mà HAProxy hỗ trợ cho nhu cầu cân bằng tải. Kết hợp các yếu tố nêu trên, chắc chắn bạn sẽ sở hữu một nền tảng vững chắc để bắt đầu thực hiện các phương pháp giúp cải thiện hiệu suất và độ tin cậy cho môi trường máy chủ của riêng mình.

SHARE