HAProxy là gì: Cân bằng tải và reverse proxy cho hệ thống

HAProxy là gì: Cân bằng tải và reverse proxy cho hệ thống

HAProxy là phần mềm cân bằng tải và reverse proxy mã nguồn mở chạy ở tầng TCP và HTTP. Nó đứng trước nhiều máy chủ ứng dụng để chia tải, kiểm tra sức khỏe, kết thúc TLS và ghi log chi tiết, giúp hệ thống chịu tải lớn mà không cần sửa mã ứng dụng.

HAProxy hoạt động ở đâu trong kiến trúc

Trong kiến trúc nhiều server, client không kết nối thẳng vào ứng dụng mà đi qua một địa chỉ duy nhất. HAProxy nhận kết nối, quyết định server phù hợp theo thuật toán đã cấu hình, rồi chuyển tiếp. Nhờ đó bạn có thể thêm hoặc gỡ server mà không đổi cấu hình phía client.

Sơ đồ nguyên lý reverse proxy giữa client và nhiều server phía sau

Các thuật toán cân bằng tải phổ biến

Thuật toán Cách chọn server Khi nào dùng
roundrobin Luân phiên theo thứ tự Các server có năng lực giống nhau
leastconn Server ít kết nối nhất Phiên dài, request thời gian không đồng đều
source Băm địa chỉ IP client Cần dán dữ liệu theo phiên
hdr Băm theo header, ví dụ cookie Sticky session mềm cho ứng dụng web
random Ngẫu nhiên theo trọng số Hạ tầng đồng nhất, tránh thiên lệch lịch

Biểu thức băm nâng cao chỉ cần một chỉnh sửa: balance hdr(X-API-Key) giúp định tuyến theo khoá API mà không cần cấu hình thêm phía ứng dụng.

Kiểm tra sức khỏe: cổng HTTP và bản ghi log

HAProxy loại server hỏng khỏi vòng xoay bằng cách kiểm tra định kỳ. Bạn có thể dùng kiểm tra kiểu TCP đơn giản hoặc kiểm tra HTTP kiểu httpchk GET /healthz để chắc chắn ứng dụng thực sự sẵn sàng nhận việc, không chỉ còn mở cổng.

Ngoài check cơ bản, có thể dùng check expect status 200 để bắt đúng mã HTTP mong muốn, và rise / fall để điều chỉnh số lần thành công hoặc thất bại liên tiếp trước khi đánh dấu server. Mặc định rise 2 và fall 3, tức phải có 2 lần thành công liên tiếp để đưa server trở lại, và 3 lần thất bại để loại ra.

Ví dụ cấu hình tối thiểu

global
    daemon
    maxconn 20000
    stats socket /var/run/haproxy.sock mode 660 level admin

defaults
    log global
    mode http
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend public_http
    bind *:80
    bind *:443 ssl crt /etc/letsencrypt/live/domain.pem alpn h2,http/1.1
    default_backend app_servers

backend app_servers
    balance leastconn
    option httpchk GET /healthz
    http-check expect status 200
    server node1 10.0.1.11:8080 check rise 2 fall 3
    server node2 10.0.1.12:8080 check
    server node3 10.0.1.13:8080 check backup

Kiểm tra cấu hình trước khi nạp lại bằng haproxy -c -f /etc/haproxy/haproxy.cfg. Nếu có lỗi cú pháp, lệnh sẽ in ra dòng lỗi mà không đụng tới dịch vụ đang chạy.

Giám sát với trang thống kê tích hợp

Bật stats enable và stats uri /stats để có giao diện web xem tức thời số kết nối, tỷ lệ lỗi 5xx, dung lượng hàng đợi và trạng thái của từng server. Nên giới hạn truy cập trang này bằng ACL theo IP nội bộ.

So sánh kết quả kiểm tra chứng thư số TLS của các kết nối đi qua HAProxy

Để lấy số liệu theo thời gian, chỉ cần gọi socket quản trị bằng echo "show stat" | socat stdio /var/run/haproxy.sock rồi đưa vào Prometheus hay file CSV để vẽ đồ thị. Dữ liệu gồm số phiên hiện tại, tổng số phiên, byte nhận và gửi, thời gian chờ trong hàng đợi, tỷ lệ lỗi trên từng backend.

Bảo mật và vận hành

  • Kết thúc TLS ngay tại HAProxy bằng chứng thư Let’s Encrypt rồi chuyển tiếp HTTP nội bộ, tránh mã hóa hai lần không cần thiết.
  • Bật http-server-close hoặc tcp-mode để không giữ kết nối đến server đã chết.
  • Giới hạn tốc độ bằng limit_req trong frontend để chặn flood và tấn công brute force.
  • Theo dõi chỉ số be_sess_during_backend_dn và check_fails để phát hiện server chết mà không ai hay biết.

Khi nào chọn HAProxy và khi nào không

HAProxy hợp với hệ thống cần cân bằng tải ở tầng TCP hoặc HTTP thuần, nhiều backend không đồng nhất, và yêu cầu giám sát chi tiết. Nó không phải lựa chọn tốt nếu ứng dụng của bạn cần định tuyến theo nội dung request, chẩn đoán phân tán phức tạp hay cấu hình dựa trên YAML sinh tự động. Trong những trường hợp đó, Nginx hoặc Envoy thường hợp lý hơn.

Tiêu chí HAProxy Nginx
Hiệu năng tối đa trên tầng L4 Rất tốt Khá tốt
Phục vụ file tĩnh Không chuyên Rất tốt
Thống kê chi tiết theo phiên Rất tốt Ổn
Protocol mới như HTTP/3, gRPC Hỗ trợ ở mức cơ bản Hỗ trợ tốt
Độ khó cấu hình Trung bình Dễ hơn

Kết quả kiểm tra cấu hình Nginx bằng lệnh nginx -t trên terminal

Trên thực tế nhiều hệ thống dùng cả hai cùng lúc: HAProxy ở tầng TCP để phân tán kết nối, Nginx phía trên để phục vụ tài nguyên tĩnh và xử lý định tuyến theo tên miền.

Mẹo vận hành hằng ngày

  • Luôn dùng chế độ daemon và socket quản trị để nạp lại cấu hình không cần khởi động lại toàn bộ tiến trình.
  • Đặt timeout client và timeout server ngắn hơn giá trị của frontend CDN để HAProxy kịp đóng kết nối treo.
  • Ghi log ở mức notice cho backend down và warning cho lỗi, tránh ghi log mức debug trong production vì nghẽn I/O rất nhanh.
  • Ghi lại chỉ số vào hệ thống giám sát theo chu kỳ 10-15 giây để bắt được sự cố trước khi người dùng báo lỗi.

HAProxy nhẹ, ổn định và xử lý được hàng chục nghìn kết nối đồng thời trên một máy nhỏ. Nhiều đội vận hành dùng nó làm lớp cân bằng tải, lớp kết thúc TLS và lớp quan sát cùng lúc. Tài liệu chính thức nằm tại cấu hình HAProxy, phần hướng dẫn chính thức của dự án là HAProxy documentation. Với HAProxy kết hợp Nginx, hãy xem lại quy tắc chuyển tiếp và header ở bài hướng dẫn module proxy của Nginx để tránh cấu hình trùng vai trò.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Man hinh tmux voi nhieu khung chia va cua so

tmux là gì: Quản lý phiên terminal cho lập trình viên

tmux là gì? tmux là trình quản lý phiên terminal mã nguồn mở, cho phép bạn tạo nhiều cửa sổ và khung chia nhỏ trong cùng một terminal, đồng thời…

Xem thêm

Neovim là gì: Trình soạn thảo mở nâng cấp từ Vim

Neovim là một trình soạn thảo mã nguồn mở, nhánh riêng của Vim được thiết kế để cải thiện khả năng mở rộng và hiệu suất nhờ viết lại phần…

Xem thêm

Passkey là gì: Đăng nhập không mật khẩu với FIDO2

Passkey là gì? Passkey (khóa truy cập) là phương thức đăng nhập không dùng mật khẩu, dựa trên tiêu chuẩn FIDO2 và WebAuthn. Thay vì gửi một chuỗi ký tự…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất