16.負載均衡的配置場景和調度算法


Nginx負載均衡基本概述

為什么要使用負載均衡

當我們的Web服務器直接面向用戶,往往要承載大量並發請求,單台服務器難以負荷,我使用多台Web服務器組成集群,前端使用Nginx負載均衡,將請求分散的打到我們的后端服務器集群中,實現負載的分發。那么會大大提升系統的吞吐率、請求性能、高容災

image-20200525200329051.png

往往我們接觸的最多的是SLB(Server Load Balance)負載均衡,實現最多的也是SLB、那么SLB它的調度節點和服務節點通常是在一個地域里面。那么它在這個小的邏輯地域里面決定了他對部分服務的實時性、響應性是非常好的。

所以說當海量用戶請求過來以后,它同樣是請求調度節點,調度節點將用戶的請求轉發給后端對應的服務節點,服務節點處理完請求后在轉發給調度節點,調度節點最后響應給用戶節點。這樣也能實現一個均衡的作用,那么Nginx則是一個典型的SLB

負載均衡的叫法有很多:

負載均衡
負載
Load Balance
LB

公有雲中叫法

SLB 阿里雲負載均衡
QLB 青雲負載均衡
CLB 騰訊雲負載均衡
ULB ucloud負載均衡

常見的負載均衡的軟件

Nginx
Haproxy
LVS

負載均衡能實現的應用場景

# 1.所謂四層負載均衡指的是OSI七層模型中的傳輸層,那么傳輸層Nginx已經能支持TCP/IP的控制,所以只需要對客戶端的請求進行TCP/IP協議的包轉發就可以實現負載均衡,那么它的好處是性能非常快、只需要底層進行應用處理,而不需要進行一些復雜的邏輯。


# 2.七層負載均衡它是在應用層,那么它可以完成很多應用方面的協議請求,比如我們說的http應用的負載均衡,它可以實現http信息的改寫、頭信息的改寫、安全應用規則控制、URL匹配規則控制、以及轉發、rewrite等等的規則,所以在應用層的服務里面,我們可以做的內容就更多,那么Nginx則是一個典型的七層負載均衡SLB

四層負載均衡與七層負載均衡區別

# 四層負載均衡數據包在底層就進行了分發,而七層負載均衡數據包則是在最頂層進行分發、由此可以看出,七層負載均衡效率沒有四負載均衡高。

# 但七層負載均衡更貼近於服務,如:http協議就是七層協議,我們可以用Nginx可以作會話保持,URL路徑規則匹配、head頭改寫等等,這些是四層負載均衡無法實現

Nginx負載均衡配置場景

Nginx要實現負載均衡需要用到proxy_pass代理模塊配置.

Nginx負載均衡與Nginx代理不同地方在於,Nginx的一個location僅能代理一台服務器,而Nginx負載均衡則是將客戶端請求代理轉發至一組upstream虛擬服務池.

image-20200525202140048.png

Nginx upstream虛擬配置語法

yntax: upstream name { ... }
Default: -
Context: http
 
#upstream例
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080   backup;
}
server {
    location / {
        proxy_pass http://backend;
    }
}

負載均衡

七層負載均衡指的是,http

1.有多台web時,我不想再手動切換域名了

2.代理只能代理一台機器啊...

3.一台機器扛不住了,要上兩台

4.如果手動切換,我們做不到負載均衡

文件服務器(共享存儲)

NFS

HDFS

FastDFS

Ceph

GlusterFS

軟件負載均衡

nginx

LVS

HAproxy

Nginx負載均衡調度使用的proxy_params(proxy的優化)

[root@Nginx ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# nginx代理與后端服務器連 
proxy_connect_timeout 30; 
# nginx代理等待后端服務器的響應時間
proxy_send_timeout 60; 
# 后端服務器數據回傳給nginx代理超時時間
proxy_read_timeout 60;                  
 
 ## 優化緩沖區
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# 解決負載均衡常見典型故障
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

3.png

負載均衡模塊

upstream zh_lb {     # 名字可以隨便取
server 10.0.0.7;     # ip         
server 10.0.0.8; 
server 10.0.0.9; 
server 10.0.0.10; 
}
server {
listen 80; 
server_name zh.com;
location / { 
	proxy_pass http://zh_lb;     # 包括上面的所有IP
	include proxy_params;        # 包含proxy的優化
	} 
	proxy_set_header HOST $host; # 請求頭帶上的域名
}

負載均衡常見典型故障

如果后台服務連接超時,Nginx是本身是有機制的,如果出現一個節點down掉的時候,Nginx會更據你具體負載均衡的設置,將請求轉移到其他的節點上,但是,如果后台服務連接沒有down掉,但是返回錯誤異常碼了如:504、502、500,這個時候你需要加一個負載均衡的設置,如下:proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,當其中一台返回錯誤碼404,500...等錯誤時,可以分配到下一台服務器程序繼續處理,提高平台訪問成功率。

server {
    listen 80;
    server_name blog.driverzeng.com;

    location / {
        proxy_pass http://node;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    }
}

Nginx負載均衡調度算法

算法名稱 簡稱 概述
輪詢(默認) round-robin(RR) 按照時間順序逐一分配到后端不同的服務器
weight weight-round-robin(WRR) 根據權重,將請求分配到后端的服務器
ip_hash ip_hash 每個請求按訪問IP的hash結果分配,這樣來自同一IP的固定訪問一個后端服務
url_hash url_hash 按照訪問URL的hash結果來分配請求,是每個URL定向到同一個后端服務器
least_conn least_conn 最少鏈接數,那個機器鏈接數少就分發

Nginx負載均衡[rr]輪詢具體配置

upstream load_pass {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    ...
}

4.png

Nginx負載均衡[wrr]權重輪詢具體配置

upstream load_pass {
    server 10.0.0.7:80 weight=5;          # 5:1分配
    server 10.0.0.8:80;                   # 默認 1
}

5.png

Nginx負載均衡ip_hash

使用nginx的ip_hash,根據客戶端的IP,將請求分配到對應的IP上,可以保持會話

具體配置不能和weight一起使用。

#如果客戶端都走相同代理, 會導致某一台服務器連接過多
upstream load_pass {
    ip_hash;
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}

6.png

url_hash 具體配置

# 按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,要配合緩存命中來使用。同一個 資源多次請求,可能會到達不同的服務器上,導致不必要的多次下載,緩存命中率不高,以及一些資源時間的 浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一台服務器,一旦緩存住 了資源,再此收到請求,就可以從緩存中讀取。
upstream load_pass { 
	hash $request_uri;#實現每個url定向到同一個后端服務器 
	server 10.0.0.7:80; 
	server 10.0.0.8:80; 
	server 10.0.0.9:80; 
}

least_conn 最少鏈接數

# 把請求轉發給連接數較少的后端服務器。輪詢算法是把請求平均的轉發給各個后端,使它們的負載大致相 同;但是,有些請求占用的時間很長,會導致其所在的后端負載較高。這種情況下,least_conn這種方式就 可以達到更好的負載均衡效果。
upstream load_pass { 
	least_conn; 
	server 10.0.0.7:80; 
	server 10.0.0.8:80; 
	server 10.0.0.9:80; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM