Phân tải hệ thống web sử dụng HAProxy (phần 1)

Về chủ đề phân tải hệ thống web, sẽ được chia làm 2 phần để giúp bạn đọc dễ theo dõi hơn.

Chúng ta bắt đầu phần 1 với mục tiêu hiểu rõ hơn về phân tải, các công cụ sử dụng, sau đó sẽ cài đặt và triển khai việc phân tải với HAProxy

I. Phân tải là gì? và tại sao cần phân tải?

Phân tải là gì?

Phân tải, hay còn được gọi là "Load Balancing", là quá trình phân chia khối lượng công việc đến các máy chủ, mạng lưới hay các quá trình khác nhau để tăng hiệu suất, tính tin cậy và độ ổn định của hệ thống. Trong các hệ thống web, phân tải thường được sử dụng để phân bổ lượng truy cập web tới nhiều máy chủ để ngăn chặn việc quá tải máy chủ duy nhất tăng thiết lập chịu tải.

Đơn giản hơn, hãy tưởng tượng phân tải như là một người điều phối tại một ngã tư giao thông đông đúc. Người này có nhiệm vụ phân chia lưu lượng giao thông một cách hiệu quả để tránh tình trạng tắc nghẽn giao thông.

Tại sao cần phân tải?

Phân tải đóng vai trò quan trọng trong việc đảm bảo sự ổn định, hiệu suất và sự sẵn sàng của hệ thống web:

  • Đảm bảo hiệu suất: Khi một hệ thống web phục vụ lượng lớn truy cập, sự phân bố đều đặn và tối ưu hóa tải có thể ngăn ngừa lỗi và gián đoạn. Ví dụ: nếu một hệ thống chỉ sử dụng một máy chủ, toàn bộ tải lưu lượng sẽ tập trung vào nó, gây nguy cơ quá tải và hỏng hóc. Phân tải được sử dụng để phân phối đều tải, giúp giảm sự phụ thuộc vào máy chủ đơn lẻ.
  • Tăng tính sẵn sàng và độ tin cậy: Khi một trong các máy chủ gặp sự cố hoặc dừng hoạt động, request sẽ tự động được chuyển tới những máy chủ hoạt động khác. Điều này giúp giảm thiểu thời gian ngừng hoạt động và đảm bảo tính sẵn có của hệ thống.
  • Phân phối lưu lượng mạng: Phân tải có thể giúp phân chia khối lượng công việc giữa các máy chủ một cách đồng đều, giảm bớt rủi ro tập trung quá nhiều tải vào một máy chủ cụ thể, từ đó nâng cao hiệu suất và ổn định của hệ thống.
  • Khả năng mở rộng linh hoạt: Phân tải cho phép thêm hay bớt các máy chủ một cách linh hoạt dựa trên tải thực tế, giúp tối ưu hóa sử dụng tài nguyên và kiểm soát chi phí.
Các chiến lược phân tải phổ biến
  • Round Robin: Round Robin là chiến lược đơn giản nhất, trong đó trình cân bằng tải sẽ lần lượt phân phối yêu cầu đến từng máy chủ trong danh sách.
  • Least Connections: Trình cân bằng tải sẽ chuyển hướng yêu cầu đến máy chủ có ít kết nối đang hoạt động nhất. Chiến lược này rất hiệu quả khi lưu lượng truy cập vào từng máy chủ khá không đồng đều.
  • IP Hash: IP Hash sử dụng địa chỉ IP của người dùng để quyết định máy chủ phục vụ. Chiến lược này giúp đảm bảo rằng một người dùng cố định sẽ luôn được phục vụ bởi cùng một máy chủ.
  • URL Hash: Trình cân bằng tải sử dụng hash của URL yêu cầu để xác định máy chủ. Điều này đảm bảo rằng một URL cụ thể sẽ luôn được phục vụ bởi cùng một máy chủ, điều này hữu ích trong các trường hợp như việc chia sẻ nội dung từ một máy chủ đến máy chủ khác.
  • Weighted Load Balancing: Trong đó, mỗi máy chủ sẽ được gán một "trọng số" dựa trên khả năng hoặc dung lượng của nó. Máy chủ có "trọng số" lớn hơn sẽ xử lý nhiều yêu cầu hơn.

II. Các dịch vụ phân tải phổ biến

Có nhiều công cụ và dịch vụ phân tải khác nhau, mỗi cái có những ưu điểm và nhược điểm riêng. Sau đây, chúng tôi sẽ liệt kê một số dịch vụ phân tải phổ biến như Nginx, HAProxy và các dịch vụ phân tải trên đám mây.

  1. Nginx
    Nginx là một dịch vụ phân tải mã nguồn mở rất thông dụng, đồng thời cũng hỗ trợ như là một máy chủ web ngược và truyền tải dữ liệu. Nginx là một sự lựa chọn tốt đối với những hệ thống có lượng truy cập lớn đồng thời cần đảm bảo hiệu suất và độ tin cậy.

  2. HAProxy
    HAProxy là công cụ phân tải dựa trên TCP/HTTP mã nguồn mở và rất phổ biến. Nó được thiết kế để cung cấp hiệu suất cao và sử dụng rất ít tài nguyên. Trong rất nhiều trường hợp, HAProxy chính là dịch vụ phân tải được lựa chọn hàng đầu.

  3. Dịch vụ phân tải đám mây
    3.1. Amazon Elastic Load Balancer (ELB)
    ELB là dịch vụ phân tải do Amazon Web Services cung cấp. ELB tự động phân tải lưu lượng mạng vào các máy chủ ảo EC2/Fargate để đảm bảo hiệu suất ổn định. ELB cung cấp các tính năng như phân tải trên nhiều khu vực địa lý và tích hợp cùng với các dịch vụ AWS khác.
    3.2. Google Cloud Load Balancer
    Google Cloud Load Balancer là dịch vụ phân tải do Google Cloud cung cấp, hỗ trợ phân tải cả nội dung HTTP/HTTPS, TCP và UDP. Nó có thể tự động mở rộng và thu nhỏ dựa vào lưu lượng mạng, giúp tối ưu hóa hiệu suất và chi phí.
    3.3 Microsoft Azure Load Balancer
    Azure Load Balancer là dịch vụ phân tải của Microsoft dùng trong môi trường Azure. Nó hỗ trợ phân tải lưu lượng mạng từ Internet đến các máy chủ ảo Azure và cung cấp những tính năng bảo mật cao cấp.

III. Bài toán cần sử dụng phân tải

Hệ thống nội bộ có rất nhiều ứng dụng web đang hoạt động, tuy nhiên nó chỉ truy cập được vào từ mạng nội bộ. Có một số ứng dụng web cần được truy cập public từ internet. Để có thể public nhiều ứng dụng web từ private sang public, sẽ có nhiều giải pháp xử lý, ở đây, chúng ta sẽ chọn giải pháp sử dụng NAT ở route và HAProxy cho phân tải tới các ứng dụng web nội bộ.

Cài đặt và triển khai HAProxy

Trong nội dung bài blog này, chúng ta sẽ cài đặt và triển khai HAProxy trên 1 server VPS nội bộ có IP private là 192.168.1.21 và đã được cài hệ điều hành ubuntu server 22.04. Để có thể cài đặt, cần ssh vào server sử dụng IP 192.168.1.21

1. Cài đặt HAProxy
Đầu tiên, cập nhật hệ thống với lệnh sau:

sudo apt-get update

Tiếp theo, hãy cài đặt Haproxy bằng lệnh sau:

sudo apt-get install haproxy

Kiểm tra phiên bản cài đặt của HAProxy như sau:

$ haproxy -v
HAProxy version 2.4.22-0ubuntu0.22.04.3 2023/12/04 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.22.html
Running on: Linux 5.15.0-119-generic #129-Ubuntu SMP Fri Aug 2 19:25:20 UTC 2024 x86_64

2. Cấu hình HAProxy
Sau khi cài đặt, file cấu hình của HAProxy nằm ở /etc/haproxy/haproxy.cfg.
Mở file cấu hình với trình soạn thảo văn bản, ví dụ:

sudo vi /etc/haproxy/haproxy.cfg

Trong file cấu hình, thay đổi cài đặt như sau:

global
        user haproxy                      # User to run haproxy
        group haproxy                     # haproxy default group
        log         127.0.0.1 local2 info # Logs level
        chroot      /var/lib/haproxy      # Chroot home for haproxy user
        pidfile     /var/run/haproxy.pid  # PID file
        maxconn  300                      # Max number of conncections per process
        daemon                            # Run the process in the backgound

# Default settings used by 'listen' and 'backend' sections if not defined in their section
defaults
        mode    http        # haproxy running mode
        timeout connect 1800s # Timeout if no reply from backend servers
        timeout client  1800s # Timeout on the client side
        timeout server  1800s # Timeout on the server side
        timeout queue   30m  # Timeout for a queue
        log     global      # Use global setting for logs
        option  httplog     # get HTTP request log
        retries 3           # Allow max of three retries

# Frontend stats
frontend stats
    mode http
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:******* # Need change user/pass auth

# Frontend server settings
frontend input-traffic
        bind                *:80                              # Define port to listen on for incoming traffic
        bind                *:443 ssl crt /etc/ssl/private/wildcard-ssl.pem
        mode http
        option              forwardfor  except 127.0.0.0/8    # Send X-Forwarded-For header
        http-request redirect scheme https unless { ssl_fc }
        acl host_sub1 hdr(host) -i sub1.vietnamlab.vn
        use_backend sub1 if host_sub1
        
        acl host_sub2 hdr(host) -i sub2.vietnamlab.vn
        use_backend sub2 if host_sub2
        
        acl host_sub3 hdr(host) -i sub3.vietnamlab.vn
        use_backend sub3 if host_sub3
        
        acl host_sub4 hdr(host) -i sub4.vietnamlab.vn
        use_backend sub4 if host_sub4
        default_backend     sub1       # Define default backend servers
        
# Define backend servers
# sub1
backend sub1
        balance roundrobin
        server  webserver1  192.168.1.10:8000 check
        server  webserver2  192.168.1.11:8000 check
        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if { ssl_fc }
backend sub2
        balance roundrobin
        server  webserver1  192.168.1.50:8000 check
        server  webserver2  192.168.1.51:8000 check
        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if { ssl_fc }
backend sub3
        balance roundrobin
        server  webserver1  192.168.1.30:8000 check
        server  webserver2  192.168.1.31:8000 check
        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if { ssl_fc }

backend sub4
        balance roundrobin
        server  webserver1  192.168.1.40:8000 check
        server  webserver2  192.168.1.41:8000 check
        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if { ssl_fc }

Đảm bảo lưu và thoát khỏi trình soạn thảo.

3. Khởi động lại và kiểm tra HAProxy
Sau khi cấu hình HAProxy, chúng ta cần khởi động lại dịch vụ:

sudo service haproxy restart

Kiểm tra trạng thái của HAProxy bằng lệnh sau:

sudo service haproxy status

Nếu HAProxy đang chạy đúng, bạn sẽ nhìn thấy sự hiển thị 'active (running)'.

haproxy.service - HAProxy Load Balancer
     Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-09-09 07:56:55 UTC; 2 weeks 0 days ago
       Docs: man:haproxy(1)
             file:/usr/share/doc/haproxy/configuration.txt.gz
   Main PID: 936 (haproxy)
      Tasks: 3 (limit: 2218)
     Memory: 3.1M
        CPU: 12min 23.673s
     CGroup: /system.slice/haproxy.service
             ├─936 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
             └─939 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock

4. Truy cập dashboard quản lý HAProxy
Do trong cấu hình haproxy, đã được thêm phần stats trên port 8404 với basic auth. Truy cập url: http://192.168.1.21:8404/stats và nhập basic auth như đã config trong file haproxy.cfg. Với màn hình này, chúng ta có thể theo dõi trạng thái của các server trong hệ thống.

IV. Kết luận

Với nội dung phần này, sẽ giúp bạn hiểu rõ hơn về quá trình cân bằng tải, công cụ HAProxy và cách cài đặt cũng như cấu hình nó trên Ubuntu. Bằng cách tìm hiểu về công cụ này, chúng ta đã khám phá cách làm cho hệ thống web của chúng ta hiệu quả và ổn định hơn. Sử dụng cân bằng tải không chỉ tăng hiệu suất mà còn đảm bảo rằng không có điểm đơn lỗi nào trong hệ thống. Mọi thứ đều hoạt động như mong muốn, và chúng ta đã sẵn lòng tiến thêm một bước để tối ưu hóa hệ thống của chúng ta hơn nữa. Ở phần tiếp theo, chúng ta sẽ cùng nhau giải quyết vấn đề liên quan đến độ ổn định, tính sẵn sàng cao của hệ thống HAProxy.

V. Tài liệu tham khảo