Load Balancing bằng nginx

Load balancing trên các máy chủ là một kỹ thuật thường được sử dụng để tối ưu hóa việc sử dụng tài nguyên, tối đa hóa lưu lượng, giảm độ trễ.

Chúng ta có thể sử dụng nginx như một máy chủ cân bằng tải HTTP để phân phối lưu lượng truy cập với một số máy chủ ứng dụng. Nó giúp cải thiện hiệu suất, khả năng mở rộng và độ tin cậy của các ứng dụng web với nginx.

Phương pháp load balancing

nginx có các phương pháp cân bằng tải sau:

  • round-robin - request gửi tới máy chủ ứng dụng được phân phối bởi round-robin
  • least-connected - các request tiếp theo được gán cho server dựa trên số lược connection.
  • ip-hash - một hàm hash (hash-function) được sử dụng để xác định máy chủ nào có thể được chọn cho request kế tiếp (dựa trên IP của máy khách)

Cấu hình load balancing mặc định

Dưới đây là 1 cấu hình đơn giản cho nginx:

http {
    upstream loadblancing-test {
        server server1.demo.com;
        server server2.demo.com;
        server server2.demo.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://loadblancing-test;
        }
    }
}

Trong ví dụ trên, chúng ta có 3 máy chủ ứng dụng server1-server3. Khi phương pháp cân bằng tải được cấu hình một cách cụ thể, nó sẽ mặc định chọn round-robin. Tất cả các request sẽ được ủy nhiệm cho nhóm loadblancing-test, và nginx sẽ có nhiệm vụ phân phối các request.

Reverse proxy được kế thừa trong nginx bao gồm load balancing cho cả HTTP, HTTPS, FastCGI, uwsgi, SCGI, và memcached.

Để cấu hình cân bằng tải cho HTTPS thay vì HTTP, chúng ta chỉ cần chỉ cần sử dụng "https" trong giao thức protocol.

Cân bằng tải least-connected

Một phương pháp cân bằng tải có quy tắc khác đó là least-connected. least-connected cho phép quản lý số lượng máy chủ một cách có kiểm soát khi request mất quá nhiều thời gian để hoàn thành.

Với least-connected, nginx sẽ cố gắng không để quá tải máy chủ với quá nhiều request, nó sẽ phân phối request tới máy chủ đang ít bận rộn hơn.

least-connected trong nginx sẽ được kích hoạt khi least_con được sử dụng trong nhóm config:

upstream loadblancing-test {
    least_conn;
    server server1.demo.com;
    server server2.demo.com;
    server server2.demo.com;
}

Duy trì phiên làm việc (session)

Xin lưu ý rằng với phương pháp round-robin hay least-connected, mỗi request của từng client có thể được phân phối vào các máy chủ khác nhau. Không có ràng buộc đảm bảo nào rằng cùng một client sẽ luôn luôn được hướng tới cùng một máy chủ.

Nếu có yêu cầu để buộc một client luôn đến một máy chủ - nói cách khác, luôn làm cho phiên làm việc của client luôn dính đến một máy chủ được lựa chọn - thì ip-hash sẽ cần được sử dụng.

Với ip-hash, địa chỉ IP của client được sử dụng như một chìa khóa để xác định những máy chủ trong một nhóm máy chủ nên được lựa chọn. Phương pháp này đảm bảo rằng các yêu cầu từ client sẽ luôn được hướng đến cùng một máy chủ trừ khi máy chủ này là không còn tồn tại.

Để cấu hình cân bằng tải ip-hash, chỉ cần thêm các chỉ thị ip_hash:

upstream loadblancing-test {
    ip_hash;
    server server1.demo.com;
    server server2.demo.com;
    server server2.demo.com;
}

Cân bằng tải trọng

Ở đây chúng ta có thuật toán cân bằng tải dựa trên tải trọng của server.

Trong ví dụ trên, tải trọng máy chủ không được cấu hình có nghĩa là tất cả các máy chủ được đối xử như nhau.

Với round-robin việc phân phối request qua các server sẽ không được đều, sẽ có những lúc request được xử lý không thống nhất và cũng không đủ nhanh.

Khi tham số weight được quy định cho một máy chủ, tải trọng được tính như là một phần của các quyết định cân bằng tải.

upstream loadblancing-test {
    server server1.demo.com weight=3;
    server server2.demo.com;
    server server2.demo.com;
}

Với cấu hình này, mỗi 5 request mới sẽ được phân phối trên các máy chủ như sau: 3 yêu cầu sẽ được hướng tới server1, một trong những yêu cầu sẽ đi đến server2, và một cái khác sẽ đến server3.

Nó có thể sử dụng tải trọng tương tự với least-connectedip-hash trong các phiên bản gần đây của nginx.