前言介紹
- 由于目前現(xiàn)有網(wǎng)絡(luò)的各個核心部分隨著業(yè)務(wù)量的提高,訪問量和數(shù)據(jù)流量的快速增長,其處理能力和計算強度也相應(yīng)地增大,使得單一的服務(wù)器設(shè)備根本無法承擔(dān)。在此情況下,如果扔掉現(xiàn)有設(shè)備去做大量的硬件升級,這樣將造成現(xiàn)有資源的浪費,而且如果再面臨下一次業(yè)務(wù)量的提升時,這又將導(dǎo)致再一次硬件升級的高額成本投入,甚至性能再卓越的設(shè)備也不能滿足當(dāng)前業(yè)務(wù)量增長的需求。
- 針對此情況而衍生出來的一種廉價有效透明的方法以擴展現(xiàn)有網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性的技術(shù)就是負載均衡(Load Balance)。
負載均衡是什么?
- 什么是負載均衡?單從字面上的意思來理解就可以解釋N臺服務(wù)器平均分擔(dān)負載,不會因為某臺服務(wù)器負載高宕機而某臺服務(wù)器閑置的情況。那么負載均衡的前提就是要有多臺服務(wù)器才能實現(xiàn),也就是兩臺以上即可。負載均衡是高并發(fā)、大流量網(wǎng)站必須要實現(xiàn)的技術(shù)。
- 讓客戶端的請求均勻地分布到各個服務(wù)器上。客戶端的請求先到達負載均衡器,由負載均衡器通過一系列算法將請求轉(zhuǎn)發(fā)到某臺上游的業(yè)務(wù)服務(wù)器上。
負載均衡策略
實現(xiàn)負載均衡的方式有很多,下面將列出幾種方式,并對比優(yōu)劣:
- 通過硬件來進行解決,常見的硬件有NetScaler、F5、Radware和Array等商用的負載均衡器,但是它們是比較昂貴的。
- 通過軟件來進行解決的,常見的軟件有LVS、Nginx、apache等,它們是基于Linux系統(tǒng)并且開源的負載均衡策略。
硬件層面
通過F5實現(xiàn)負載均衡,性能優(yōu)異,F(xiàn)5的底層是在芯片層面做了優(yōu)化,這樣就使得它的性能不依賴主機操作系統(tǒng)的處理能力,但是F5價格高昂,一般小公司用不起軟件層面可以通過LVS來實現(xiàn)負載均衡,這是一款中國人開發(fā)的軟件。
軟件層面
性能受到主機運算能力的制約除了LVS之外,還可以通過Nginx實現(xiàn)負載均衡,為了實現(xiàn)高可用需要和keepalived配合使用,Nginx實現(xiàn)負載均衡也是本文講解的重點還可以在DNS層面做負載均衡,在域名解析的時候解析到不同的服務(wù)器上。
優(yōu)點是配置簡單,非常容易實現(xiàn),缺點是沒有檢測機制,不夠均衡,容錯能力比較差
硬件層面可以通過F5實現(xiàn)負載均衡,性能優(yōu)異。F5的底層是在芯片層面做了優(yōu)化,這樣就使得它的性能不依賴主機操作系統(tǒng)的處理能力,但是F5價格高昂,一般小公司用不起
軟件層面可以通過LVS來實現(xiàn)負載均衡,這是一款中國人開發(fā)的軟件。因為是軟件層面的負載均衡,性能受到主機運算能力的制約
除了LVS之外,還可以通過Nginx實現(xiàn)負載均衡,為了實現(xiàn)高可用需要和keepalived配合使用,Nginx實現(xiàn)負載均衡也是本文講解的重點
還可以在DNS層面做負載均衡,在域名解析的時候解析到不同的服務(wù)器上。優(yōu)點是配置簡單,非常容易實現(xiàn),缺點是沒有檢測機制,不夠均衡,容錯能力比較差
Nginx是什么?
Nginx(發(fā)音同 engine x)是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計師Igor Sysoev(伊戈爾·西索夫)所開發(fā),供俄國大型的入口網(wǎng)站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,中國大陸使用nginx網(wǎng)站用戶有:新浪、網(wǎng)易、 騰訊等。
優(yōu)點
- 可運行l(wèi)inux,并有 Windows移植版。
- 在高連接并發(fā)的情況下,Nginx是Apache服務(wù)器不錯的替代品Nginx在美國是做虛擬主機生意的老板們經(jīng)常選擇的軟件平臺之一。能夠支持高達50,000個并發(fā)連接數(shù)的響應(yīng)
負載均衡的功能
- 轉(zhuǎn)發(fā)
- 故障移除
- 恢復(fù)添加
- 高可用 Ha
我們想要使用Nginx那么就必須滿足上面的四個條件.
我們配置負載均衡的目的是在于當(dāng)用戶訪問我們的服務(wù)器的時候, 首先會通過 Nginx服務(wù)器來決定轉(zhuǎn)發(fā)到哪個Tomcat服務(wù)器上去給用戶提供服務(wù), 當(dāng)然這個概率是我們通過權(quán)重來配置的. 經(jīng)過Nginx指派之后, 我們就可以處理高并發(fā)的訪問了, 這里就能達到負載均衡的目的.
Nginx如何實現(xiàn)負載均衡
Nginx的負載均衡是通過upstream來實現(xiàn)的,在upstream中指定若干個 server,格式如下:

myserver就是通過 upstream 定義的一組負載均衡模板,其中:

在配置完upstream后,還要讓客戶端過來的請求反向代理到myserver,格式如下:

完成了負載均衡的配置,但是在實際需求中除了上面的設(shè)置外,還會增加一些額外設(shè)置:
負載均衡策略設(shè)置請求上游服務(wù)器攜帶請求頭信息upstream模塊中其他參數(shù)設(shè)置
Nginx的負載均衡策略有5種方式:

除以上5種,還有一種:least-connected — 下一個請求被分配到擁有最少活動連接數(shù)的服務(wù)器。
編輯nginx配置文件(例中為/usr/local/ngnix/conf/nginx.conf),找到http結(jié)點,
配置案例
http {
upstream myapp1 {
server 192.168.1.103:8080;
server 192.168.1.104:8080;
}
server {
listen 80;
server_name localhost;
location /webautotest/ {
proxy_buffering off;
proxy_pass http://myapp1;
}
}
}
重新加載配置文件
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
默認的負載均衡配置
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
最少連接負載均衡
- 另一個負載均衡原則為least-connected。當(dāng)一些請求花費較長時間來完成時,least-connected更“公平”的控制應(yīng)用程序?qū)嵗系呢撦d。
- 配置了least-connected的負載均衡機制的情況下,nginx會盡量不讓負載繁忙的應(yīng)用服務(wù)器上負載過多的請求,相反的,會把新的請求發(fā)送到比較不繁忙的服務(wù)器。
配置示例:
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
會話持久性
注意,round-robin或least-connected負載均衡下,每個后續(xù)的客戶端可能被分發(fā)至不同服務(wù)器,不保證相同客戶端的請求總是被發(fā)送到相同的服務(wù)器。
如果有必要把客戶端綁定至特定服務(wù)器,則可使用ip-hash負載均衡機制。
ip-hash機制
ip-hash機制下,客戶端ip地址被用作hash key來判斷客戶端請求應(yīng)該發(fā)送到哪個服務(wù)器,這種方法保證了來自相同客戶端的請求總是發(fā)送到相同服務(wù)器(如果服務(wù)器可用的話)
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
負載均衡權(quán)重
可通過配置服務(wù)器權(quán)重來影響負載均衡機制。上面的例子中,都未配置服務(wù)器權(quán)重,這意味著所有服務(wù)器都擁有相同的權(quán)重。
針對round-robin負載機制,權(quán)重意味著更多或更少的請求傳送至服務(wù)器---假設(shè)有足夠的請求,且按統(tǒng)一方式處理請求,且足夠快完成請求處理。
配置示例:
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
上例配置中,每發(fā)送至服務(wù)器實例的5個新的請求中,有3個發(fā)送到srv1,1個發(fā)送到srv2,另1個發(fā)送到srv3。
注:當(dāng)前版本似乎只實現(xiàn)了round-robin機制下的權(quán)重設(shè)置
健康檢測
nginx反向代理實現(xiàn)包含服務(wù)器健康檢查。如果來自特定服務(wù)器的響應(yīng)失敗,報錯,nginx將標記該服務(wù)器為failed,一段時間內(nèi)盡量避免選擇此服務(wù)器作為隨后請求的分發(fā)服務(wù)器。
max_fails機制設(shè)置fail_timeout期間,和服務(wù)器溝通失敗的連續(xù)重試次數(shù),默認為1.當(dāng)設(shè)置為0時,不做服務(wù)器健康檢測。fail_timeout定義了服務(wù)器被標記為failed的時長。fail_timeout時間間隔過后,nginx將開始使用活動客戶端請求來探測服務(wù)器,如果探測成功則標記服務(wù)器為活動服務(wù)器。
Nginx負載均衡配置項介紹
下面我們將介紹一下proxy模塊的參數(shù):

各個參數(shù)介紹:

設(shè)置proxy_connect_timeout 為2秒,縮短超時時間,使其不至于太慢。