Mục lục
- 1 Nginx Load Balancer là gì?
- 2 Các thuật toán sử dụng trong Nginx Load Balancer
- 3
- 4 Cấu hình Nginx Load Balancer
- 4.1 Mô hình Lab
- 4.2
- 4.3 Cài đặt Apache
- 4.4 Cài đặt Nginx Load Balancer
- 4.5
- 4.6 Cấu hình Load Balancing theo thuật toán Round Robin
- 4.7
- 4.8 Cấu hình Load Balancing theo thuật toán Round Robin kết hợp Weighted
- 4.9 Cấu hình Load Balancing theo thuật toán Least connection
- 4.10 Cấu hình Load Balancing theo thuật toán Least connection kết hợp Health Check
- 4.11
- 4.12 Cấu hình Load Balancing theo thuật toán ip hash kết hợp Health Check
- 5 Một số chỉ thị về load balance trong file config của nginx
Nginx Load Balancer là gì?
Cân bằng tải (Load balancing) là một kỹ thuật thường dùng để tối ưu hóa việc sử dụng tài nguyên, tối đa hóa thông lượng, giảm độ trễ về đảm bảo tính chịu lỗi.
Trong bài trước, Zhost đã hướng dẫn các bạn cấu hình Nginx sử dụng như là một Web Server hay một Reverse Rroxy đứng trước bảo về và tăng khả năng chịu tải cho Apache.
Tuy nhiên, Chúng ta cũng có thể sử dụng nginx như là một bộ cân bằng tải (Load balancer) để phân phối lưu lượng truy cập đến các máy chủ web nhằm mục đích cải thiện hiệu năng, khả năng mở rộng và độ tin cậy của các ứng dụng web.
Có rất nhiều thuật toán được xây dựng cho việc cân bằng tải, mỗi thuật toán đều có những ưu nhược điểm khác nhau, trong mỗi trường hợp sẽ có được tác dụng riêng, chúng ta cũng có thể kết hợp các thuật toán với nhau để giúp cho hệ thống hoạt động được tốt hơn. Tùy vào cơ sở hạ tầng và mục đích sử dụng mà sẽ lựa chọn thuật toán phù hợp với hệ thống.
Các thuật toán sử dụng trong Nginx Load Balancer
Weighted load balancing
- Đây là một thuật toán quan trọng trong load balancing, khi sử dụng thuật toán này sẽ giúp chúng ta giải quyết đươc bài toán phân chia các server xử lý. Với mặc định của nginx sử dụng thuật toán round-robin thì các request sẽ được chuyển luân phiên đến các server để xử lý, tuy nhiên đối với Weighted load balancing thì chúng ta sẽ phân ra được khối lượng xử lý giữa các server.
- Ví dụ chúng ta có 2 server dùng để load balancing muốn cứ 5 request đến thì 4 dành cho server 1, 1 dành cho server 2 hay các trường hợp tương tự thì weighted load balancing là sự lựa chọn hợp lý.
Round Robin.
- Round Robin là thuật toán mặc định của nginx.
- Đặc điểm của thuật toán này là các request sẽ được luân chuyển liên tục giữa các server 1:1 , điều này sẽ làm giải tải cho các hệ thống có lượng request lớn và mức chịu tải của các Server là như nhau.
Least connection.
- Đây là thuật toán nâng cấp của round robin và weighted load balancing, thuật toán này sẽ giúp tối ưu hóa cân bằng tải cho hệ thống.
- Đặc điểm của thuật toán này là sẽ chuyển request đến cho server đang xử lý ít hơn làm việc, thích hợp đối với các hệ thống mà có các session duy trì trong thời gian dài, tránh được trường hợp các session duy trì quá lâu mà các request được chuyển luân phiên theo quy tắc định sẵn, dễ bị down 1 server nào đó do xử lý qúa khả năng của nó.
IP-hash (chỉ dùng cho HTTP)
Thuật toán hash sẽ dựa trên 3 octer đầu tiên trên IP của client để quyết định xem client này sẽ được map cố định với server nào. Thích hợp với những ứng dụng cần giữ lại session của người dùng. Khi ta thêm hoặc bớt một server trong pool thì các giá trị hash này sẽ được phân bố lại (mất session). Ta có thể dùng thêm một tham số bổ trợ là consistent để giảm thiểu ảnh hưởng của khi phân phối lại các giá trị hash.
Cấu hình Nginx Load Balancer
Mô hình Lab
Trong bài viết này, Zhost sẽ sử dụng 03 server cài đặt CentOS 7, bao gồm:
- Nginx Load Balancer: 10.10.10.11 – kết nối với End User bên ngoài và 172.16.0.11 – Kết nối tới các Apache Web Server bên trong để điều phối Request.
- Apache Web Server 01: 172.16.0.21
- Apache Web Server 02: 172.16.0.22
Vô hiệu hoá SELinux trên cả 03 Server theo bài viết: Cách vô hiệu hóa SELinux trên CentOS
Cài đặt Apache
Thực hiện trên Apache Web Server 01 và 02.
yum -y update && yum -y install httpd
Sau khi cài đặt xong các bạn chạy lệnh sau để khởi động Apache Service:
systemctl start httpd.service && systemctl enable httpd.service
Tiếp theo cấu hình firewall mở port http/https, mặc định trong centos 7 sử dụng FirewallD.
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
Tạo file html đơn giản trên cả hai Web Server:
Web Server 01:
touch /var/www/html/index.html echo "<center><h1>This is website on Web Server 01</h1></center>" > /var/www/html/index.html
Web Server 02:
touch /var/www/html/index.html echo "<center><h1>This is website on Web Server 02</h1></center>" > /var/www/html/index.html
Cài đặt Nginx Load Balancer
Thực hiện trên Server Nginx Load Balancer – 10.10.10.11/172.16.0.11
Cài đặt các Repo cần thiết:
yum install epel-release -y rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
Chạy lệnh sau để cài đặt Nginx:
yum install -y nginx
Khởi động Service nginx:
systemctl start nginx.service && systemctl enable nginx.service
Tiếp theo cấu hình firewall mở port http/https, mặc định trong centos 7 sử dụng FirewallD.
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
Cấu hình Load Balancing theo thuật toán Round Robin
Mở file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:
upstream backends { server 172.16.0.21:80; server 172.16.0.22:80; }
Lưu lại và thoát.
Cấu hình trên sẽ Forward đều số lượng Request nhận được vào 2 Web server (trọng số 1:1).
Mở file Virtual host của nginx (trong bài viết này sử dụng Virtual host default):
nano /etc/nginx/conf.d/default.conf
Tại block server {} thêm các cấu hình thành như sau :
proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;
Tại block location / {} sửa thành như sau để Forward request vào Web Server bên trong:
location / { proxy_pass http://backends; }
Lưu lại và thoát.
Khởi động lại Nginx:
systemctl restart nginx.service
Từ trình duyệt web của User, truy cập vào địa chỉ của Nginx Load Balancer (10.10.10.11) sẽ thấy hiển thị ra website nằm trên Web server 1.
Bấm F5 lại sẽ thấy Nginx trả về nội dung của Website nằm trên Web server 2.
Như vậy là Request đã được Forward đều vào 2 web server.
Tương tự như vậy, để cấu hình Load balancing theo các thuật toán khác nhau, ta chỉ cần chỉnh sửa lại block upstream
trong file: /etc/nginx/nginx.conf.
Cấu hình Load Balancing theo thuật toán Round Robin kết hợp Weighted
Mở file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tại block http {} thêm đoạn cấu hình Load Balancing như sau:
upstream backends { server 172.16.0.21:80 weight=3; server 172.16.0.22:80 weight=2; }
Lưu lại và thoát.
Cấu hình trên có nghĩa là cứ 5 request gửi tới server sẽ có 3 request vào web server 1 và 2 request vào web server 2.
Khởi động lại Nginx:
systemctl restart nginx.service
Cấu hình Load Balancing theo thuật toán Least connection
Mở file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:
upstream backends { least_conn; server 172.16.0.21:80; server 172.16.0.22:80; }
Lưu lại và thoát.
Cấu hình trên sẽ chuyển request đến cho server đang xử lý ít hơn làm việc.
Khởi động lại Nginx:
systemctl restart nginx.service
Cấu hình Load Balancing theo thuật toán Least connection kết hợp Health Check
Để mang lại hiệu quả cân bằng tải tốt nhất ta có thể cấu hình thêm nhiều Option cho từng Server.
Mở file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:
upstream backends { least_conn; server 172.16.0.21:80 max_fails=1 fail_timeout=10s; server 172.16.0.22:80 max_fails=1 fail_timeout=10s; }
Lưu lại và thoát.
Cấu hình trên sẽ chuyển request đến cho server đang xử lý ít hơn làm việc. Trong đó:
- max_fails=1 Số lần tối đã thử kết nối đến Server Backend.
- fail_timeout=10s khoảng thời gian mà load balancer sẽ chờ Server Backend trả lời. Sau khoảng thời gian này, Server sẽ bị coi là Down và request sẽ được chuyển đến server tiếp theo.
Khởi động lại Nginx:
systemctl restart nginx.service
Khi này, nếu 2 web server vẫn hoạt động bình thường thì Nginx vẫn Forward vào server có ít request hơn.
Nhưng khi một trong 2 server bị Shutdown, Stop Service Apache hoặc mất kết nối thì Nginx sẽ nhận ra và chuyển toàn bộ request vào server còn lại.
Cấu hình Load Balancing theo thuật toán ip hash kết hợp Health Check
Để mang lại hiệu quả cân bằng tải tốt nhất ta có thể cấu hình thêm nhiều Option cho từng Server.
Mở file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:
upstream backends { ip_hash; server 172.16.0.21:80 max_fails=1 fail_timeout=10s; server 172.16.0.22:80 max_fails=1 fail_timeout=10s; }
Lưu lại và thoát.
Cấu hình trên sẽ yêu cầu Nginx sử dụng thuật toán ip_hash. Forward request đến các các Backend server cụ thể bằng cách hash 3 octet đầu tiên của IP User. Và User sẽ được giữ Session trên server.
Cấu hình trên cũng có thêm Option health check để kiểm tra tính sẵn sàng của Backend Server.
Khởi động lại Nginx:
systemctl restart nginx.service
Một số chỉ thị về load balance trong file config của nginx
Module | Công dụng |
ip_hash | Chỉ thị này khai báo với Nginx sử dụng thuật toán ip_hash. Forward request đến các các upstream (backend) server bằng cách hash 3 octet đầu tiên của IP client. |
least_conn | Chỉ thị này khai báo với Nginx sử dụng thuật toán Least connection. Ưu tiên Forward request đến upstream (backend) server nào có ít kết nối đang hoạt động nhất. |
server | Mỗi chỉ thị server tương ứng với 1 upstream server/socket. Một số Option có thể cấu hình đi kèm gồm:
|
Zhost chúc các bạn thành công!