12/08/2018, 15:07

Thiết lập Nginx Load Balancing

Load Balancing ? Load Balancing hay cân bằng tải có thể gọi 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 ư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. Vì sao Load balancing lại làm được điều này. Đơn giản thôi, thông ...

Load Balancing ?

Load Balancing hay cân bằng tải có thể gọi 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 ư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.

Vì sao Load balancing lại làm được điều này. Đơn giản thôi, thông thường khi có 1 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ác 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, hiểu nôm na là 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ương pháp này sẽ 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: phương pháp này 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.

Trong bài viết này tôi sẽ hướng dẫn cách thiết lập Nginx với cơ chế round-robin

Cài đặt

Để cài đặt Nginx các bạn cần có quyền root trên VPS

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, ta 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 trang web hiệu quả hơn.

  1. 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 các máy chủ đáp ứng cho client theo địa chị IP của client, tức 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: 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;
}

Tham khảo

https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing http://nginx.org/en/docs/http/load_balancing.html

0