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
最少鏈接數,哪一個鏈接少就分配到哪臺設備