Thiết lập Nginx Load Balancing

(Ngày: 08/01/2020)
Cách thiết lập Nginx Load Balancing để tối ưu hóa việc sử dụng tài nguyên, tăng tính ổn định cho server. Cùng theo dõi chi tiết trong bài viết sau.  

Load Balancing là gì?

Load balancing (cân bằng tải) được xem là một kỹ thuật được sử dụng để tối ưu hóa việc sử dụng tài nguyên, tối ưu băng thông, giảm tải hoặc đảm bảo khả năng chịu lỗi và tăng tính ổn định cho server.

Tại sao load balancing lại làm được điều này. Đơn giản là vì khi có một request từ client tới sẽ chỉ có 1 server chịu trách nhiệm xử lý. Nhưng với load balancing, chúng ta có thể phân phối lưu lượng một cách hợp lý để gửi request tới các server khác nhau.

Cơ chế load balancing

Với Nginx, chúng ta có thể sử dụng 3 cơ chế load balancing:

  • round-robin: đây là phương pháp đơn giản nhất. Các request được gửi tới sẽ được phân phối theo vòng tròn, gửi request đến từng server theo một vòng.
  • Least-connected: phân phối các request tiếp theo tới server có lượng kết nối thấp nhất.
  • Ip-hash: sử dụng một hàm băm để xác định máy chủ nào sẽ xử lý yêu cầu nào dựa vào IP của client.

Cài đặt

Bạn cần có quyền root trên VPS để cài đặt Nginx:

sudo apt-get install nginx

Thiết lập nginx upstream

Để thiết lập round-robin, chúng ta sẽ sử dụng module nginx upstream. Đầu tiên tạo file config mặc định.

sudo nano /etc /nginx/sites-available /default

 

http {

  upstream backend {

    server backend1.example.com;

    server backend2.example.com;

    server backend3.example.com;

  }

 

  server {

    listen 80;

    location / {

      proxy_pass http://backend;

    }

  }

}

Khởi động lại Nginx

sudo service nginx restart

Một số cách điều hướng khác trong nginx upstream

Sử dụng round-robin tức là chúng ta đang mặc định phân phối tải một cách bình đẳng tới các máy chủ. Tuy nhiên điều này có thể không phải cách hiệu quả nhất. Chúng ta có thể sử dụng thêm một số điều hướng nhất định để giúp việc truy cập website hiệu quả hơn.

  1. Weight

Thêm trọng số Weight Nginx cho phép chúng ta gán trọng số tùy theo tỉ lệ lưu lượng được dẫn tới mỗi máy chủ, giống như sau:

upstream backend {

  server backend1.example.com weight = 1;

  server backend2.example.com weight = 2;

  server backend3.example.com weight = 4;

 }

Weight mặc định là 1, với weight là 2 thì backend2.example.com sẽ được gửi lưu lượng gấp đôi so với backend1. Tương tự vậy, backend3 sẽ phải xử lý request nhiều gấp đôi backend2.

  1. IP Hash

IP Hash cho phép máy chủ đáp ứng cho client theo địa chỉ IP của client. Nghĩa là nếu client 1 gửi request tới và được server A xử lý thì lần sau request sẽ vẫn là server A xử lý, trừ khi server A bị down.

Để đánh dấu một server down, chỉ cần thêm config down là xong. Khi đó tất cả IP đã gửi tới server A trước đó sẽ được chuyển hướng tới một server khác.

Config:

upstream backend {

  ip_hash;

  server   backend1.example.com;

  server   backend2.example.com;

  server   backend3.example.com  down;

}

  1. Max Fails

Theo các thiết lập mặc định round-robin, Nginx sẽ tiếp tục gửi dữ liệu với các VPS, ngay cả khi VPS không đáp ứng được.

Max Fails có thể tự động ngăn chặn điều này bằng cách làm cho VPS không đáp ứng, không hoạt động trong một khoảng thời gian.

Có 2 setting cho việc này: max_fails và fall_timeout -max_fails. Max_fails là số lượng tối đa kết nối tới một VPS trước đó khi nó được coi là không hoạt động.

-fall_timeout: xác định độ dài của VPS mà được coi là không hoạt động, khi hết thời gian thì request tới VPS sẽ được tiếp tục. Thời gian chờ mặc định là 10 giây.

Config:

upstream backend  {

  server backend1.example.com max_fails=3  fail_timeout=15s;

  server backend2.example.com weight=2;

  server backend3.example.com weight=4;

}

Chúc bạn thành công!

viblo.asia