Nginx負載均衡模塊詳解

1、關於負載均衡
php

在服務器集羣中,Nginx起到一個代理服務器的角色(即反向代理),爲了不單獨一個服務器壓力過大,未來自用戶的請求轉發給不一樣的服務器。css

Nginx不只是一個出色的web軟件,其七層代理和負載均衡也是至關出色。Nginx作前端代理,當用戶請求服務時,能夠根據url進行判斷,而後分配到不一樣的後臺webserver上。html

實現原理:前端

首先在http模塊中配置使用upstream模塊定義後臺的real server池,名爲proxy-web,在池子中咱們能夠添加多臺real server,其中狀態檢查、調度算法都是在池子中配置;而後在serverr模塊中定義虛擬主機,可是這個虛擬主機不指定本身的web目錄站點,它將使用location匹配url而後轉發到上面定義好的web池子中,最後根據調度策略再轉發到後臺real server上nginx

2、Nginx負載均衡策略web

負載均衡用於從「upstream」模塊定義的後端服務器列表中選取一臺服務器接受用戶的請求。一個最基本的upstream模塊是這樣的,模塊內的server是服務器列表:算法

http {
	upstream static {
			server 192.168.1.1:80 weight=1 max_conns=1000 max_fails=3 fail_timeout=3;
			server 127.0.0.1:80 backup;
		}
}


    • 192.168.1.1:80:指定後端真實服務器能夠是域名或ip,默認是80端口後端

    • weight:指定每一個後端主機的調度的權重,默認爲1緩存

    • max_conns:指定後端主機最大併發鏈接數服務器

    • max_fails:指定後端主機健康檢查多少次失敗後纔將主機標記爲不可用(默認1次,0爲不作健康檢測)

    • fail_timeout:指定後端主機健康檢測超時多少時間爲一次失敗(默認10秒)

    • backup:指定sorry_server,當全部後端主機健康檢測失敗時,會顯示此服務器的頁面

    • down:將當前主機標記爲不可用(維護時使用)

在upstream模塊配置完成後,要讓指定的訪問反向代理到服務器列表:

server {
        listen 80;
        server_name www.aa1.com www.test.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location ~* \.(png|jpg|jpeg|html|htm|js|css|xml|gif)$ {
                proxy_pass http://static;
        }
}

這就是最基本的負載均衡實例,但這不足以知足實際需求;目前Nginx服務器的upstream模塊支持6種調度算法:

輪循

默認方式

Weight

按權重比例調度

Ip_hash

根據源ip調度

Lease_conn

最少鏈接方式

Fair(第三方)

響應時間方式

Url_hash(第三方)

根據url分配方式

(1)rr輪詢(默認)

按照請求順序分配到每一個RS,和lvs中的rr算法同樣,若是RS宕機,會自動剔除,默認狀況下只檢測80端口,若是RS報40二、40三、50三、504錯誤,會直接返回給客戶端。

(2)weight(權重)

在rr的基礎上再加上權重(默認是rr+weight),權重輪詢和訪問成正比,值越大分配的越多,能夠根據服務器的配置設置權重,能夠解決服務器性能不均進行請求分配的問題

(3)ip_hash

解決動態網頁session共享問題 

每一個訪問請求按照IP地址的hash值進行分配,ip的hash值只要相同就會被分配到同一臺服務器上(lvs負載均衡的-p參數,keepalived配置裏的persistence_timeout 50),該調度算法能夠解決動態網頁session共享問題,但有時會致使請求分配不均

提示:因爲國內用的都是nat模式,因此hash不適合使用 

ip_hash不能和其餘的算法一塊使用,即不能使weight或backup


hash的原理:將源地址進行hash計算,並和後端服務器的權重總數相除後轉發到某服務器,使同一個客戶端訪問的請求始終派發到特定服務器,有一個缺點;當後端服務器發生宕機或新添加時權重總數發生變化,客戶端下次可能被派發至新的服務器

consistent(一致性哈希):一致性hash的採用的是除數特別大,假設有一個hash環。是個閉環。把32位二進制的整數轉換爲十進制後均勻分佈在整個環上。hash結果是除以2的32次方-1(hash是除以). 那麼結果必定是落在環上的。那麼,這個點靠近誰,就緩存在誰那裏。假設a節點壞了。那麼下一次的計算結果就是旁邊的鄰居。可是鄰居的緩存不會受到影響。只是壞掉的A節點會重新去緩存。


(4)fair(第三方)

按照後端服務器的響應時間來配置,響應時間短的優先分配,比上面的都更智能,此種算法能夠按照頁面大小和加載時間長短智能的進行負載均衡,nginx自己不支持fair,須要下載nginx的upstrea_fair模塊

(5)url_hash(第三方)

主要應用於緩存服務器上 

按照訪問的url來分配請求,讓相同的url定向到同一個服務器,後端服務器爲緩存服務器的時候效果更顯著,在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法。 

缺點:若是有一臺機器宕機了,那就苦了,consistent_hash能夠解決這個問題 

能夠提升後端緩存服務器的效率,nginx自己不支持url_hash的,須要下載hash軟件

(6)least_conn 

最少鏈接數,哪一個鏈接少就分配到哪臺設備

相關文章
相關標籤/搜索