HA Proxy là gì? Các thuật toán và thuật ngữ cần biết
Bạn đã bao giờ gặp phải tình trạng một website đột ngột trở nên chậm chạp hoặc thậm chí không thể truy cập được do lượng người dùng tăng vọt? Đây chính là lúc các giải pháp cân bằng tải và proxy như HAProxy phát huy vai trò của mình.
Bạn cần biết rằng HAProxy không chỉ đơn thuần là một phần mềm, hãy cùng helpdesk.inet.vn khám phá sâu hơn về HAProxy để hiểu rõ hơn về cách nó giải quyết những vấn đề này.
1. HA Proxy là gì?

HAProxy là viết tắt của High Availability Prox là một giải pháp mã nguồn mở hiệu suất cao được sử dụng rộng rãi cho mục đích cân bằng tải (Load balancing) và làm proxy ngược (reverse proxy) cho các ứng dụng dựa trên giao thức TCP và HTTP.
Về cơ bản, HAProxy hoạt động như một người điều phối thông minh, đứng giữa người dùng cuối (clients) và một cụm các máy chủ (servers). Nhiệm vụ chính của nó là phân phối các yêu cầu (requests) đến từ người dùng một cách hiệu quả qua các máy chủ này, nhằm tối ưu hóa việc sử dụng tài nguyên, tối đa hóa thông lượng (throughput), giảm thiểu thời gian phản hồi (response time) và đảm bảo tính sẵn sàng cao (high availability) cho ứng dụng.
2. Tại sao HA Proxy lại quan trọng?

Mục tiêu cuối cùng là đạt được "zero downtime" (thời gian chết bằng không) hoặc tối thiểu hóa thời gian ngừng hoạt động, đảm bảo rằng người dùng luôn có thể truy cập ứng dụng một cách nhanh chóng và ổn định.
Và HA Proxy có thể giúp chúng ta như sau:
- Fault Tolerance: Một trong những lợi ích cốt lõi của HAProxy là khả năng giám sát trạng thái "sức khỏe" của các máy chủ backend thông qua các cơ chế Health Check đa dạng. Nếu một máy chủ backend gặp sự cố hoặc không phản hồi, HAProxy sẽ tự động phát hiện và ngừng chuyển tiếp lưu lượng truy cập đến máy chủ đó, đồng thời phân phối lại tải cho các máy chủ khỏe mạnh còn lại. Điều này đảm bảo rằng sự cố của một thành phần riêng lẻ không làm ảnh hưởng đến toàn bộ hệ thống, trực tiếp đóng góp vào "tính sẵn sàng cao".
- Scalability: Khi lưu lượng truy cập vào ứng dụng tăng lên, HAProxy cho phép dễ dàng mở rộng hệ thống bằng cách thêm các máy chủ mới vào backend pool mà không gây gián đoạn dịch vụ. Tương tự, khi lưu lượng giảm, các máy chủ không cần thiết có thể được loại bỏ. Khả năng mở rộng linh hoạt này (horizontal scaling) là yếu tố then chốt để đáp ứng nhu cầu thay đổi và tối ưu hóa chi phí tài nguyên.
- Performance Optimization: HAProxy cung cấp nhiều thuật toán cân bằng tải thông minh để phân phối yêu cầu một cách tối ưu. Ngoài ra, các tính năng như SSL/TLS termination (chấm dứt SSL/TLS tại HAProxy thay vì tại máy chủ backend) , nén dữ liệu (Gzip compression) , và caching (lưu trữ tạm nội dung thường xuyên truy cập) giúp giảm tải đáng kể cho các máy chủ ứng dụng, cải thiện thời gian phản hồi cho người dùng cuối và tăng thông lượng tổng thể của hệ thống.
- Enhanced Security: Khi hoạt động như một reverse proxy, HAProxy che giấu kiến trúc và địa chỉ IP thực của các máy chủ backend, tạo ra một lớp bảo vệ chống lại các cuộc tấn công trực tiếp. Các tính năng như Access Control Lists (ACLs) cho phép định nghĩa các quy tắc truy cập chi tiết , rate limiting (giới hạn tốc độ yêu cầu) giúp chống lại các cuộc tấn công từ chối dịch vụ (DoS/DDoS) ở mức độ nhất định và hành vi lạm dụng. Phiên bản HAProxy Enterprise còn cung cấp các lớp bảo mật tiên tiến hơn như Web Application Firewall (WAF) và Bot Management.
3. Kiến trúc của HAProxy?
- Mô hình Event-Driven và Non-Blocking:
HAProxy sử dụng một mô hình xử lý dựa trên sự kiện (event-driven) và các thao tác I/O không chặn (non-blocking). Điều này có nghĩa là HAProxy không chờ đợi một thao tác hoàn tất mà đăng ký một sự kiện và chuyển sang xử lý các tác vụ khác. Khi sự kiện sẵn sàng, HAProxy sẽ quay lại xử lý.
Kết hợp với một bộ lập lịch (scheduler) đa luồng dựa trên ưu tiên, kiến trúc này cho phép HAProxy quản lý hiệu quả hàng ngàn kết nối đồng thời với mức tiêu thụ tài nguyên hệ thống (CPU, bộ nhớ) ở mức tối thiểu.
- Các thành phần chính: Frontend và Backend:
Frontend: Đây là nơi HAProxy lắng nghe các kết nối đến từ client (người dùng hoặc các dịch vụ khác). Cấu hình frontend bao gồm:
- Địa chỉ IP và cổng lắng nghe (ví dụ: bind *:80).
- Chế độ hoạt động (mode http hoặc mode tcp).
- Các quy tắc xử lý ban đầu như Access Control Lists (ACLs) để kiểm tra thông tin yêu cầu và quyết định hành động tiếp theo (ví dụ: chuyển đến một backend cụ thể).
Backend: Đây là một nhóm (pool) gồm một hoặc nhiều máy chủ thực sự sẽ xử lý các yêu cầu được chuyển tiếp từ frontend. Cấu hình backend bao gồm:
- Danh sách các máy chủ (ví dụ: server srv1 192.168.1.100:8080 check).
- Thuật toán cân bằng tải (ví dụ: balance roundrobin).
- Chế độ hoạt động (mode http hoặc mode tcp), phải tương thích với frontend.
- Các tùy chọn kiểm tra sức khỏe (health check) cho máy chủ.
- Luồng xử lý yêu cầu điển hình:
- Frontend chấp nhận kết nối từ client.
- Các quy tắc trong frontend (ví dụ: ACLs) được áp dụng để quyết định hành động (chặn, chuyển hướng, chọn backend).
- Yêu cầu được chuyển đến backend đã chọn.
- Các quy tắc trong backend được áp dụng.
- Thuật toán cân bằng tải chọn một máy chủ cụ thể từ backend pool.
- HAProxy chuyển tiếp yêu cầu đến máy chủ backend đã chọn.
- Máy chủ backend xử lý và gửi phản hồi lại HAProxy.
- HAProxy áp dụng các quy tắc xử lý phản hồi (nếu có).
- HAProxy gửi phản hồi về cho client.
- Giao dịch được ghi log.
- Hoạt động ở Layer 4 (TCP) và Layer 7 (HTTP):
- HAProxy có thể hoạt động ở cả tầng giao vận (Layer 4) và tầng ứng dụng (Layer 7) của mô hình OSI.
Mode TCP (Layer 4): HAProxy chỉ xem xét thông tin IP và cổng để đưa ra quyết định định tuyến. Phù hợp cho việc cân bằng tải bất kỳ lưu lượng TCP nào. - Mode HTTP (Layer 7): HAProxy hiểu và phân tích giao thức HTTP, cho phép các quyết định định tuyến phức tạp hơn dựa trên nội dung HTTP (URL, header, cookie), sửa đổi header, SSL termination, v.v.
- Vai trò Proxy Ngược và Cân Bằng Tải:
- HAProxy hoạt động như một proxy ngược (reverse proxy), nhận yêu cầu từ client và chuyển tiếp chúng đến các máy chủ backend thích hợp. Điều này giúp bảo vệ máy chủ backend bằng cách che giấu địa chỉ IP của chúng và cung cấp một điểm truy cập duy nhất.
- Chức năng chính là cân bằng tải (load balancer), phân phối lưu lượng truy cập trên nhiều máy chủ để tối ưu hóa hiệu suất, tăng tính sẵn sàng và độ tin cậy của ứng dụng.
4. Các thuật toán cân bằng tải trong HAProxy?

Thuật toán cân bằng tải là tập hợp các quy tắc và logic mà HAProxy sử dụng để quyết định máy chủ nào trong một backend pool sẽ nhận yêu cầu tiếp theo từ client. Mục tiêu chính của các thuật toán này là phân phối tải một cách thông minh và hiệu quả qua các máy chủ, nhằm giảm thiểu thời gian phản hồi, tăng thông lượng, tránh tình trạng quá tải cho bất kỳ máy chủ nào và đảm bảo ứng dụng luôn hoạt động ổn định và sẵn sàng.
Dưới đây là một số thuật toán cân bằng tải phổ biến được hỗ trợ bởi HAProxy:
- Round Robin (roundrobin): Đây thường là thuật toán mặc định trong HAProxy. Các yêu cầu được phân phối tuần tự đến từng máy chủ trong backend pool. Khi đến máy chủ cuối cùng trong danh sách, nó sẽ quay lại máy chủ đầu tiên và lặp lại chu kỳ. Phiên bản roundrobin trong HAProxy có tính đến trọng số (weight) của máy chủ, nghĩa là các máy chủ có trọng số cao hơn sẽ nhận được nhiều yêu cầu hơn một cách tương ứng trong mỗi chu kỳ. Đây là một thuật toán động, cho phép điều chỉnh trọng số máy chủ một cách linh hoạt (ví dụ, để thực hiện "slow start" cho máy chủ mới).
Ưu điểm: Đơn giản, dễ hiểu, phân phối tải đều nếu các máy chủ có năng lực tương đương và thời gian xử lý yêu cầu đồng nhất.
Nhược điểm: Có thể không tối ưu nếu thời gian xử lý yêu cầu của các máy chủ rất khác nhau hoặc nếu các phiên kết nối có thời lượng không đồng đều.
Phù hợp cho các cụm máy chủ đồng nhất, xử lý các yêu cầu có thời gian hoàn thành tương tự nhau và không yêu cầu duy trì trạng thái phiên trên một máy chủ cụ thể.
- Static Round Robin (static-rr): Tương tự như roundrobin, các máy chủ được sử dụng lần lượt theo trọng số của chúng. Tuy nhiên, đây là một thuật toán tĩnh theo mặc định. Điều này có nghĩa là việc thay đổi trọng số của một máy chủ đang hoạt động sẽ không có hiệu lực ngay lập tức đối với việc phân phối tải, trừ khi tham số hash-type của backend được sửa đổi để cho phép cập nhật động.
Ưu điểm: Đảm bảo tính nhất quán cao trong việc phân phối nếu không có sự thay đổi về trọng số.
Nhược điểm: Kém linh hoạt hơn roundrobin động khi cần điều chỉnh tải theo thời gian thực.
Trường hợp sử dụng: Các tình huống cần sự ổn định tuyệt đối trong thứ tự phân phối và ít có sự thay đổi về năng lực máy chủ.
- Least Connections (leastconn): Yêu cầu mới sẽ được chuyển đến máy chủ hiện đang có số lượng kết nối đang hoạt động (active connections) ít nhất tại thời điểm đó. Thuật toán này cũng tính đến trọng số của máy chủ; nếu các máy chủ có cùng số lượng kết nối ít nhất, máy chủ có trọng số cao hơn sẽ được ưu tiên.
Ưu điểm: Rất hiệu quả trong việc phân phối tải đồng đều khi thời gian xử lý các yêu cầu khác nhau đáng kể hoặc khi các phiên kết nối có thời lượng kéo dài (ví dụ: kết nối cơ sở dữ liệu, phiên RDP, WebSocket). Nó giúp tránh tình trạng một máy chủ bị quá tải với các kết nối dài hạn trong khi các máy chủ khác ít việc hơn.
Nhược điểm: Yêu cầu theo dõi liên tục số lượng kết nối trên mỗi máy chủ.
Trường hợp sử dụng: Lý tưởng cho các ứng dụng có thời lượng phiên không đồng đều, các giao thức duy trì kết nối lâu dài như LDAP, SQL, TSE.
- Source IP Hash (source): Địa chỉ IP nguồn của client được sử dụng làm đầu vào cho một hàm hash function, sau đó được chia cho tổng trọng số của các máy chủ đang hoạt động sẽ xác định máy chủ nào trong backend pool xử lý yêu cầu. Điều này đảm bảo rằng tất cả các yêu cầu từ cùng một địa chỉ IP client sẽ luôn được chuyển đến cùng một máy chủ backend.
Ưu điểm: Đảm bảo tính bền vững của phiên (session persistence) ở mức độ client IP mà không cần các cơ chế phức tạp hơn. Hữu ích cho các ứng dụng yêu cầu client luôn kết nối đến cùng một máy chủ.
Nhược điểm: Có thể dẫn đến phân phối tải không đồng đều nếu một số lượng lớn client đến từ cùng một dải IP (ví dụ: phía sau một NAT gateway lớn) hoặc nếu một số client tạo ra nhiều yêu cầu hơn hẳn so với các client khác.
Trường hợp sử dụng: Các ứng dụng stateful cần duy trì trạng thái phiên trên máy chủ cho một client cụ thể, hoặc khi cần gỡ lỗi bằng cách theo dõi tất cả yêu cầu từ một client đến một máy chủ duy nhất.
- URI Hash (uri), URL Parameter Hash (url_param), Header Hash (hdr):
- uri: Thuật toán URI (Uniform Resource Identifier)sử dụng kết quả để chọn máy chủ. Điều này đảm bảo rằng các yêu cầu cho cùng một URI sẽ luôn được chuyển đến cùng một máy chủ backend.
- url_param <param> [check_post]: Giá trị của một tham số URL cụ thể (ví dụ: sessionId trong user=abc&sessionId=123) để chọn máy chủ. Tùy chọn check_post cho phép HAProxy tìm kiếm tham số này cả trong phần thân của yêu cầu POST nếu không tìm thấy trong URI.
- hdr(<name>): Giá trị của một HTTP header cụ thể (ví dụ: User-Agent, Authorization) để chọn máy chủ.
Ưu điểm: Rất hữu ích cho việc tối ưu hóa hiệu quả của bộ nhớ đệm (cache) trên các máy chủ backend. Nếu các yêu cầu cho cùng một tài nguyên luôn đến cùng một máy chủ, tỷ lệ cache hit sẽ cao hơn.
Nhược điểm: Tương tự như source, có thể dẫn đến phân phối tải không đồng đều nếu một số URI, tham số hoặc header nhất định phổ biến hơn nhiều so với những cái khác.
Trường hợp sử dụng: Các hệ thống phân phối nội dung (CDN), các ứng dụng có sử dụng caching ở tầng backend, hoặc khi cần định tuyến dựa trên thông tin cụ thể trong yêu cầu HTTP.
- First (first): Yêu cầu mới sẽ được chuyển đến máy chủ đầu tiên trong danh sách cấu hình của backend mà vẫn còn "slot" trống (tức là chưa đạt đến giới hạn kết nối tối đa maxconn của nó, nếu được đặt). Các máy chủ được xem xét theo thứ tự chúng xuất hiện trong file cấu hình. Các máy chủ được đánh dấu là backup chỉ được sử dụng nếu tất cả các máy chủ không phải backup khác đều không khả dụng.
Ưu điểm: Đơn giản, có thể hữu ích khi muốn lấp đầy một máy chủ trước khi chuyển sang máy chủ tiếp theo, hoặc trong các kịch bản active/passive đơn giản.
Nhược điểm: Thường dẫn đến việc một số máy chủ hoạt động hết công suất trong khi các máy chủ khác gần như không tải, trừ khi máy chủ đầu tiên bị lỗi.
Trường hợp sử dụng: Các ứng dụng có dung lượng máy chủ đã biết (ví dụ: một số game server) , hoặc khi cần một cơ chế failover đơn giản sang các máy chủ dự phòng.
- Random (random): Một số ngẫu nhiên được sử dụng làm khóa cho hàm nhất quán để chọn máy chủ. Thuật toán này tôn trọng trọng số của máy chủ và các thay đổi trọng số động. Một biến thể quan trọng là "power of two random choices": HAProxy chọn ngẫu nhiên hai (hoặc nhiều hơn, nếu được cấu hình với tham số <draws>) máy chủ backend và sau đó chọn máy chủ có tải ít nhất trong số đó (thường dựa trên số lượng kết nối) để xử lý yêu cầu.
Ưu điểm: Biến thể "power of two random choices" cải thiện đáng kể tính công bằng và phân phối tải so với lựa chọn ngẫu nhiên thuần túy, đặc biệt hữu ích trong các môi trường có nhiều máy chủ hoặc khi các máy chủ backend thay đổi nhanh chóng.
Nhược điểm: Lựa chọn ngẫu nhiên thuần túy có thể dẫn đến mất cân bằng tải tạm thời.
Trường hợp sử dụng: Các cụm máy chủ lớn, hoặc khi cần một thuật toán đơn giản nhưng vẫn có khả năng thích ứng tốt với sự thay đổi của backend.
- Weighted Variations: Nhiều thuật toán trong HAProxy, bao gồm roundrobin, leastconn, random, và các thuật toán đều có khả năng tính đến "trọng số" (weight) được gán cho mỗi máy chủ trong cấu hình. Trọng số là một số nguyên cho phép quản trị viên chỉ định năng lực xử lý tương đối của mỗi máy chủ.
Ví dụ, một máy chủ có weight 200 sẽ nhận được gấp đôi số lượng yêu cầu so với một máy chủ có weight 100 trong cùng một khoảng thời gian, tùy thuộc vào thuật toán cụ thể. Điều này cực kỳ quan trọng khi các máy chủ trong backend pool không đồng nhất về cấu hình phần cứng (CPU, RAM, network) hoặc khả năng xử lý.
5. Một số thuật ngữ quan trọng cần biết với HAProxy?

- Frontend: Nơi HAProxy lắng nghe các kết nối đến từ client (người dùng). Nó xác định địa chỉ IP, cổng và các quy tắc xử lý ban đầu cho lưu lượng truy cập.
- Backend: Một nhóm (pool) các máy chủ thực sự sẽ xử lý yêu cầu được chuyển tiếp từ frontend. Backend định nghĩa thuật toán cân bằng tải và các cài đặt cho máy chủ.
- ACL (Access Control List): Một tập hợp các điều kiện dùng để kiểm tra thông tin từ yêu cầu (ví dụ: URL, IP nguồn, header) và thực hiện hành động tương ứng (ví dụ: chọn backend, chặn yêu cầu).
- Health Check (Kiểm tra sức khỏe): Cơ chế HAProxy sử dụng để giám sát trạng thái của các máy chủ backend, đảm bảo chỉ chuyển tiếp lưu lượng đến các máy chủ đang hoạt động tốt.
- Session Persistence (Tính bền vững của phiên) / Sticky Sessions: Kỹ thuật đảm bảo các yêu cầu từ cùng một client được chuyển đến cùng một máy chủ backend trong suốt phiên làm việc. Rất quan trọng cho các ứng dụng stateful.
- Stick Table (Bảng theo dõi trạng thái): Một cơ chế lưu trữ dữ liệu động trong bộ nhớ của HAProxy (ví dụ: IP client, số yêu cầu, máy chủ đã chọn) để hỗ trợ session persistence, rate limiting, và các tính năng nâng cao khác.
- SSL/TLS Termination (Chấm dứt SSL/TLS): Quá trình HAProxy giải mã lưu lượng HTTPS từ client, sau đó có thể giao tiếp với backend bằng HTTP (hoặc HTTPS mới), giúp giảm tải cho máy chủ backend và quản lý chứng chỉ tập trung.
- Mode (Chế độ hoạt động: TCP, HTTP): HAProxy có thể hoạt động ở Layer 4 (TCP - xử lý lưu lượng TCP chung) hoặc Layer 7 (HTTP - hiểu và xử lý giao thức HTTP, cho phép các quyết định định tuyến phức tạp hơn).
- Rate Limiting (Giới hạn tốc độ truy cập): Kỹ thuật kiểm soát số lượng yêu cầu mà một client có thể gửi trong một khoảng thời gian nhất định, giúp bảo vệ dịch vụ khỏi lạm dụng và tấn công DoS/DDoS.
- Content Switching: Khả năng định tuyến yêu cầu đến các backend khác nhau dựa trên nội dung của yêu cầu (ví dụ: URL, Host header).
- PROXY Protocol: Một giao thức cho phép HAProxy chuyển tiếp thông tin kết nối gốc của client (như địa chỉ IP thực) đến máy chủ backend, ngay cả khi qua nhiều lớp proxy.
- Server: Chỉ thị trong cấu hình backend để định nghĩa một máy chủ cụ thể sẽ xử lý yêu cầu, bao gồm địa chỉ, cổng và các tùy chọn như check (kiểm tra sức khỏe) hoặc weight (trọng số).
- Bind: Chỉ thị trong frontend (hoặc listen) xác định địa chỉ IP và cổng mà HAProxy sẽ lắng nghe các kết nối đến.
Listen: Một khối cấu hình tiện lợi kết hợp cả chức năng của frontend và backend vào một chỗ, thường dùng cho các thiết lập đơn giản.
- Weight (Trọng số): Một giá trị số gán cho máy chủ backend để chỉ định năng lực xử lý tương đối của nó, ảnh hưởng đến việc phân phối tải trong các thuật toán như roundrobin hay leastconn.
6. Cuối cùng:
Việc nắm vững các thuật toán cân bằng tải khác nhau của HAProxy như Round Robin, Least Connection, Source, cùng với các thuật ngữ quan trọng như Frontend, Backend, ACLs, và Health Check là điều kiện tiên quyết để cấu hình và quản lý HAProxy một cách hiệu quả. Hiểu rõ cách mỗi thuật toán hoạt động và cách áp dụng các thuật ngữ này vào thực tế sẽ giúp tối ưu hóa việc phân phối tải, đảm bảo tính sẵn sàng cao và cải thiện trải nghiệm người dùng.