Trong bài viết này mình sẽ giới thiệu với các bạn thiết lập cân bằng tải trong hệ thống máy chủ Nginx .Ở bài viết này hbsprogram.com sẽ cùng các bạn đi tìm hiểu các vấn đề sau :
- Lý do sử dụng nginx load balancing ?
- Sử dụng NGINX làm load balancer
- Các thuật toán dùng nginx load balancing
- Cơ chế tránh lỗi server khi 1 server bị down
1 Lý do sử dụng nginx load balancing
Nếu website bạn phục vụ lượng người online 1 lúc từ 30 nghìn người online trở lên thì bạn cần làm ngay 1 việc đó là tối ưu hóa sử dụng tài nguyên, băng thông, giảm độ trễ, và tăng cường khả năng chịu lỗi .Có rất nhiều phương pháp để xử lý những vấn đề trên như
- Phương pháp 1 : Tăng gói hợp đồng với nhà cung cấp vps như tăng ram ,tăng cpu ,tăng băng thông
- Phương pháp 2 : Sử dụng nginx load balancing
Phương án 1 khi sử dụng sẽ rất mất nhiều công sức và không tối ưu vì cpu bạn có thể tăng đến 20 cpu, ram có thể đến 60 GB ram băng thông max nhất là 1 Gbs với 1 cái giá cắt cổ .
Phương án 2 sẽ đáp ứng tốt hơn vì khi cần mở rộng bạn chỉ cần mua thêm vps với băng thông sẽ được san sẻ ra các vps con làm giảm truy vấn đến server chính rất nhiều ,việc mở rộng thì cực kì dễ dàng
Dưới đây là hình ảnh mô tả cơ chế làm việc của nginx load balance
2 Sử dụng NGINX làm load balancer
Lý do sử dụng nginx vì server nginx có cơ chế phục vụ tốt hơn so với apache ở nhiều điểm
Mô hình dưới đây mình sử dụng 3 server
- Master: Đóng vai trò là Load balancer
- Backend1: Webserver 1
- Backend2: Webserver 2
Cơ chế đây phục vụ sẽ tốt phần hiển thị code ở bài tiếp theo mình sẽ hướng dẫn các bạn làm đa server database
Cấu hình Upstream trên Master
Để bắt đầu sử dụng NGINX với một nhóm các máy chủ web, đầu tiên, bạn cần khai báo upstream
group. Directive này được đặt trong http
block.
http { upstream backend { server backend1_or_ip1; server backend2_or_ip2; } }
Để truyền các request từ người dùng vào một group các server, tên của group được truyền vào với directive proxy_pass (hoặc fastcgi_pass, memcached_pass, uwsgi_pass, scgi_pass tùy thuộc vào giao thức). Trong bài viết này, virtual server chạy trên NGINX sẽ truyền tất cả các request tới backend upstream server:
server { location / { proxy_pass http://backend; } }
Dưới đây là file nginx của master
upstream backend { server 103.53.198.171; server 103.200.6.24; server 104.199.133.13; } server { server_name www.lb.hbsprogram.com; rewrite ^(.*) http://lb.hbsprogram.com$1 permanent; } server { listen 80; location / { proxy_pass http://backend; } access_log off; # access_log /home/lb.hbsprogram.com/logs/access_log; error_log off; # error_log /home/lb.hbsprogram.com/logs/error.log; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; root /home/lb.hbsprogram.com/public_html; include /etc/nginx/conf/ddos2.conf; index index.php index.html index.htm; server_name lb.hbsprogram.com; #/////////////////////////////////////////////////////// # Ban chi co the chon 1 trong 4 rule AAA, BBB, CCC hoac DDD # Ban nen comment cac rule khong su dung thay vi xoa chung vi neu ban su dung wordpress blog # Cac dong nay can thiet cho cac chuc nang trong WordPress Blog Tools cua VPSSIM # Thuat ngu: # Comment - Them dau # vao truoc # Uncomment - Bo dau # o truoc cau. #/////////////////////////////////////////////////////// #Chay tat ca cac website (WordPress, Xenforo, Joomla, Phpbb .... ). neu ban su dung rule cua ban,comment dong duoi (them dau # vao truoc) (AAA) #include /etc/nginx/conf/all.conf; #Neu ban su dung rule cua minh, comment rule o tren. Sau do uncoment (bo dau # ba dong duoi) sau do them rule vao giua. (BBB) #location / { #Uncomment 3 dong nay, sau do cho rule cua ban vao day! #} # Rule cho wordpress + Plugin wp super cache. Neu ban su dung wordpress va wp super cache, uncomment dong duoi va comment dong AAA phia tren. (CCC) #include /etc/nginx/conf/supercache.conf; # Rule cho wordpress + Plugin W3 Total Cache. Neu ban su dung wordpress va W3 Total, uncomment dong duoi va comment dong AAA phia tren. (DDD) #include /etc/nginx/conf/w3totalcache.conf; # Confif Cache Static Files include /etc/nginx/conf/staticfiles.conf; #Tang bao mat security, chong sql injection ....(uncoment neu ban muon su dung). Boi vi mot so code website khong su dung duoc voi rule nay, nen mac dinh VPSSIM de tat. #Khong duoc xoa dong duoi, neu xoa VPSSIM se khong hoat dong ! #include /etc/nginx/conf/block.conf; # Error Page #error_page 403 /errorpage_html/403.html; #error_page 404 /errorpage_html/404.html; #error_page 405 /errorpage_html/405.html; #error_page 502 /errorpage_html/502.html; #error_page 503 /errorpage_html/503.html; #error_page 504 /errorpage_html/504.html; #location ^~ /errorpage_html/ { # internal; # root /home/lb.hbsprogram.com; # access_log off; #} #include /etc/nginx/conf/phpstatus.conf; include /etc/nginx/conf/drop.conf; }
3 Các thuật toán dùng nginx load balancing
Các thuật toán cân bằng tải
Thuật toán Round Robin:
Đây gọi là thuật toán luân chuyển vòng, các máy chủ sẽ được xem ngang hàng và sắp xếp theo một vòng quay. Các truy vấn dịch vụ sẽ lần lượt được gửi tới các máy chủ theo thứ tự sắp xếp.
Ví dụ:
Cấu hình một cụm Cluster bao gồm 03 máy chủ: A, B, C.
Yêu cầu dịch vụ thứ nhất sẽ được gửi đến máy chủ A.
Yêu cầu dịch vụ thứ hai sẽ được gửi đến máy chủ B.
Yêu cầu dịch vụ thứ ba sẽ được gửi đến máy chủ C.
Yêu cầu dịch vụ thứ tư sẽ lại được gửi cho máy chủ A….
Mặc định nginx sử dụng thuật toán round robin
Thuật toán Weighted Round Robin
Thuật toán này giống thuật toán round robin khác nhau ở trọng số phân chia request .Khi nào dùng thuật toán này khi mà bạn có nhiều server với các thông số khác nhau thì nên sử dụng thuật toán này
Cấu hình nginx :
upstream backend { #ip_hash; server 103.200.6.24 weight = 1; server 104.199.133.13 weight =2; }
Ở đây trọng số chúng ta phân chia các request đến 2 server với các trọng số 1:2 có nghĩa là khi có 3 request đến thì server sẽ phân tải 1 cho server 103.200.6.24 và 2 cho server 104.199.133.13
Thuật toán Weights Least Connection
Chia các request đến các server ít bận rộn hơn
Cấu hình nginx
upstream backend { least_conn; server 103.200.6.24; server 104.199.133.13; }
Thuật toán 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.
Cấu hình nginx
upstream backend { ip_hash; server 103.200.6.24; server 104.199.133.13; }
4 Cơ chế tránh lỗi nginx Health checks
Giống như việc bạn có 1 nhóm các bạn đang làm việc vào 1 ngày xấu trời có 1,2 bạn nghỉ nếu như bạn không biết những ai nghỉ mà vẫn phân công công việc đến họ sẽ làm cho những công việc đó bị ngưng trệ .Giống như vậy nếu 1 list các server của bạn có 1,2 server bị down việc cần làm sẽ là tìm xem server nào down và chuyển những công việc cho các server còn lại .Nginx đã có cơ chế giúp chúng ta xử lý vấn đề đó với việc nó sẽ thực hiện liên tục việc kiểm tra các server trên upstream được khai báo trong config của bạn để tránh việc điều hướng các request của người dùng vào các server không hoạt động. Tóm lại là việc này nhằm đảm bảo người dùng không nhìn thấy các page thông báo lỗi khi chúng ta tắt đi 1 server nào đó, hoặc server nào đó đột xuất bị lỗi không hoạt động.
Cấu hình nginx
upstream backend { #ip_hash; server 103.200.6.24 max_fails=3 fail_timeout=15s;; server 104.199.133.13 max_fails=5 fail_timeout=15s;; }
Ở đây số request lỗi được định nghĩa cho server 1 là 3 và server 2 là 5 trong khoảng thời gian fail request là 15s
Demo :http://lb.hbsprogram.com/
Bonus
Cấu hình monitor quản trị của nginx (hàng củ chuối vl)
server { listen 0.0.0.0:6644; access_log off; allow all; location / { stub_status on; } }
Restart lại nginx với lệnh
service nginx restart
Sau đó bạn vào http://ip:6644 để xem status server nginx
Tài liệu tham khảo
https://viblo.asia/p/su-dung-nginx-lam-load-balancer-cho-nhieu-backend-server-gDVK2aJ25Lj
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing