前言
??負(fù)載均衡(又稱為負(fù)載分擔(dān))评雌,英文名稱為Load Balance,其意思就是將負(fù)載(工作任務(wù))進(jìn)行平衡螟加、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行徘溢,例如Web服務(wù)器吞琐、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等然爆,從而共同完成工作任務(wù)站粟。
一、什么是負(fù)載均衡集群技術(shù)
-
負(fù)載均衡
??負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上曾雕,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬奴烙、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力剖张、提高網(wǎng)絡(luò)的靈活性和可用性切诀。負(fù)載均衡(Load Balance)其意思就是分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器搔弄、FTP服務(wù)器幅虑、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。 -
集群
??集群(cluster)技術(shù)是一種較新的技術(shù)顾犹,通過集群技術(shù)倒庵,可以在付出較低成本的情況下獲得在性能、可靠性炫刷、靈活性方面的相對較高的收益擎宝,其任務(wù)調(diào)度則是集群系統(tǒng)中的核心技術(shù)。集群組成后浑玛,可以利用多個(gè)計(jì)算機(jī)和組合進(jìn)行海量請求處理(負(fù)載均衡)绍申,從而獲得很高的處理效率,也可以用多個(gè)計(jì)算機(jī)做備份(高可用),使得任何一個(gè)機(jī)器壞了整個(gè)系統(tǒng)還是能正常運(yùn)行锄奢。 -
負(fù)載均衡集群技術(shù)
??負(fù)載均衡(Load Balance):負(fù)載均衡集群為企業(yè)需求提供了可解決容量問題的有效方案失晴。負(fù)載均衡集群使負(fù)載可以在計(jì)算機(jī)集群中盡可能平均地分?jǐn)偺幚怼?br> ??負(fù)載通常包括應(yīng)用程序處理負(fù)載和網(wǎng)絡(luò)流量負(fù)載,每個(gè)節(jié)點(diǎn)都可以承擔(dān)一定的處理負(fù)載,并且可以實(shí)現(xiàn)處理負(fù)載在節(jié)點(diǎn)之間的動態(tài)分配拘央,以實(shí)現(xiàn)負(fù)載均衡涂屁。
二、負(fù)載均衡技術(shù)的實(shí)現(xiàn)
負(fù)載均衡(Load Balance)
負(fù)載均衡技術(shù)類型:基于 4 層負(fù)載均衡技術(shù)和基于 7 層負(fù)載均衡技術(shù)
負(fù)載均衡實(shí)現(xiàn)方式:硬件負(fù)載均衡設(shè)備或者軟件負(fù)載均衡
硬件負(fù)載均衡產(chǎn)品:F5 灰伟、深信服 拆又、Radware
軟件負(fù)載均衡產(chǎn)品: LVS(Linux Virtual Server)、 Haproxy栏账、Nginx帖族、Ats(apache traffic server)
- 實(shí)現(xiàn)效果圖
三、負(fù)載均衡的分類
??負(fù)載均衡根據(jù)所采用的設(shè)備對象(軟/硬件負(fù)載均衡)挡爵,應(yīng)用的OSI網(wǎng)絡(luò)層次(網(wǎng)絡(luò)層次上的負(fù)載均衡)等來分類竖般。根據(jù)應(yīng)用的 OSI 網(wǎng)絡(luò)層次來分類的兩個(gè)負(fù)載均衡類型。
負(fù)載均衡可以大概分為以下幾類:
- 二層負(fù)載均衡(mac)
一般是用虛擬mac地址方式茶鹃,外部對虛擬MAC地址請求涣雕,負(fù)載均衡接收后分配后端實(shí)際的MAC地址響應(yīng)艰亮。 - 三層負(fù)載均衡(ip)
一般采用虛擬IP地址方式,外部對虛擬的ip地址請求挣郭,負(fù)載均衡接收后分配后端實(shí)際的IP地址響應(yīng)迄埃。 - 四層負(fù)載均衡(tcp)
在三層負(fù)載均衡的基礎(chǔ)上,用ip+port接收請求兑障,再轉(zhuǎn)發(fā)到對應(yīng)的機(jī)器侄非。 - 七層負(fù)載均衡(http)
根據(jù)虛擬的url或IP,主機(jī)名接收請求流译,再轉(zhuǎn)向相應(yīng)的處理服務(wù)器逞怨。
??四層負(fù)載均衡
??實(shí)現(xiàn)四層負(fù)載均衡的產(chǎn)品有:
- F5:硬件負(fù)載均衡器,功能很好福澡,但是成本很高骇钦。
- lvs:重量級的四層負(fù)載軟件
- nginx:輕量級的四層負(fù)載軟件,帶緩存功能竞漾,正則表達(dá)式較靈活
- haproxy:模擬四層轉(zhuǎn)發(fā),較靈活
七層負(fù)載均衡
實(shí)現(xiàn)七層負(fù)載均衡的軟件有: - haproxy:天生負(fù)載均衡技能窥翩,全面支持七層代理业岁,會話保持,標(biāo)記,路徑轉(zhuǎn)移;
- nginx:只在http協(xié)議和mail協(xié)議上功能比較好搁胆,性能與haproxy差不多昭抒;
- apache:功能較差
-
Mysql proxy:功能尚可。
??由于在實(shí)際應(yīng)用中品抽,我們比較常用的是四層負(fù)載及七層負(fù)載。這里也重點(diǎn)說下這兩種負(fù)載。
??四層負(fù)載架構(gòu)設(shè)計(jì)比較簡單较锡,無需解析具體的消息內(nèi)容,在網(wǎng)絡(luò)吞吐量及處理能力上會相對比較高盗痒,而七層負(fù)載均衡的優(yōu)勢則體現(xiàn)在功能多蚂蕴,控制靈活強(qiáng)大。在具體業(yè)務(wù)架構(gòu)設(shè)計(jì)時(shí)俯邓,使用七層負(fù)載或者四層負(fù)載還得根據(jù)具體的情況綜合考慮骡楼。
二、操作步驟
-
nginx四層負(fù)載均衡及七層負(fù)載均衡
- nginx既有四層的負(fù)載均衡也有七層的負(fù)載均衡
-
代理實(shí)現(xiàn)
七層負(fù)載均衡
1.首先準(zhǔn)備三臺機(jī)器稽鞭,其中兩臺為真實(shí)服務(wù)器鸟整,一臺為proxy代理服務(wù)器并且關(guān)閉防火墻及l(fā)inux確保三臺機(jī)器之間可以被互相訪問到。
- 192.168.253.176 webserver1
- 192.168.253.178 webserver2
- 192.168.253.189 nginx-proxy
2.在webserver1和webserver2兩臺機(jī)器上分別部署一個(gè)簡單的頁面用于測試朦蕴。為了能夠更好的體現(xiàn)出負(fù)載均衡篮条,這里的兩臺服務(wù)器分別設(shè)置不同的內(nèi)容弟头。
如果有需要可以參考關(guān)于nginx的文章
- server1
[root@server1 ~]# yum -y install nginx
[root@server1 ~]# systemctl start nginx
[root@server1 ~]# systemctl enable nginx
[root@server1 ~]# echo "hello world!" >/usr/share/nginx/html/index.html
[root@server1 ~]# curl 127.0.0.1
hello world兑燥!
- server2
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl start nginx
[root@server2 ~]# systemctl enable nginx
[root@server2 ~]# echo "hi world亮瓷!" >/usr/share/nginx/html/index.html
[root@server2 ~]# curl 127.0.0.1
hi world!
3.在ngonx-proxy 代理服務(wù)器上進(jìn)行配置
upstream配置
這個(gè)配置是寫一組被代理的服務(wù)器地址降瞳,然后配置負(fù)載均衡的算法.
upstream testapp {
server 192.168.253.178:80;
server 192.168.253.176:80;
}
server {
....
location / {
proxy_pass http://testapp; #請求轉(zhuǎn)向 testapp 定義的服務(wù)器列表
}
- upstream支持的幾種算法
- A嘱支、
輪詢(默認(rèn))
:每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器; - B、
ip_hash
:每個(gè)請求按訪問IP的hash結(jié)果分配挣饥,同一個(gè)IP客戶端固定訪問一個(gè)后端服務(wù)器除师。可以保證來自同一ip的請求被打到固定的機(jī)器上扔枫,可以解決session問題汛聚。 - C、
url_hash
:按訪問url的hash結(jié)果來分配請求短荐,使每個(gè)url定向到同一個(gè)后端服務(wù)器倚舀。 - D、
fair
:這是比上面兩個(gè)更加智能的負(fù)載均衡算法忍宋。此種算法可以依據(jù)頁面大小和加載時(shí)間長短智能地進(jìn)行負(fù)載均衡痕貌,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配糠排。Nginx
本身是不支持fair
的舵稠,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair
模塊入宦。
- A嘱支、
配置實(shí)例參考
熱備:如果你有兩臺服務(wù)器哺徊,當(dāng)一臺服務(wù)器發(fā)生故障時(shí),才啟用第二臺服務(wù)器提供服務(wù)乾闰;
upstream myweb {
server 192.168.253.178:80;
server 192.168.253.176:80 backup; #熱備
}
輪詢:nginx默認(rèn)的就是輪詢其權(quán)重默認(rèn)為1落追,請求訪問時(shí) 每臺服務(wù)器訪問一次;
upstream myweb {
server 192.168.253.176:8080; #默認(rèn)80端口可以不用寫端口號
server 192.168.253.178:8080;
}
加權(quán)輪詢:根據(jù)配置的權(quán)重大小從而處理不同數(shù)量的訪問及請求
upstream myweb {
server 192.168.253.176:8080 weight=1;
server 192.168.253.178:8080 weight=2;
}
ip_hash:nginx會讓相同客戶端ip訪問同一個(gè)服務(wù)器涯肩;
upstream myweb {
ip_hash;
server 192.168.253.178:80;
server 192.168.253.176:80
}
- nginx 負(fù)載均衡配置狀態(tài)參數(shù)
- down淋硝,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
- backup宽菜,預(yù)留的備份機(jī)器谣膳。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會請求backup機(jī)器铅乡,因此這臺機(jī)器的壓力最輕继谚。
- max_fails,允許請求失敗的次數(shù)阵幸,默認(rèn)為1花履。當(dāng)超過最大次數(shù)時(shí)芽世,返回proxy_next_upstream 模塊定義的錯誤。
- fail_timeout诡壁,在經(jīng)歷了max_fails次失敗后济瓢,暫停服務(wù)的時(shí)間單位秒。max_fails可以和fail_timeout一起使用妹卿。
upstream myweb {
server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;
}
4.編輯nginx-proxy配置文件旺矾,如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
upstream testapp {
server 192.168.253.176;
server 192.168.253.178;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://testapp;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
5.接下來就可以訪問測試了
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hello world夺克!
修改配置文件箕宙,增加權(quán)重,重新加載配置文件生效
[root@nginx-proxy ~]# vim /etc/nginx/nginx.conf
upstream testapp {
server 192.168.253.176 weight=1;
server 192.168.253.178 weight=2;
}
...
[root@nginx-proxy ~]# curl 127.0.0.1
hello world铺纽!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world柬帕!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
在此也可以看到配置已經(jīng)生效狡门。
四層負(fù)載均衡
??nginx在1.9.0 的時(shí)候陷寝,增加了一個(gè) stream 模塊,用來實(shí)現(xiàn)OSI第四層協(xié)議(網(wǎng)絡(luò)層和傳輸層)的轉(zhuǎn)發(fā)其馏、代理盼铁、負(fù)載均衡等。stream模塊的用法跟http的用法類似尝偎,允許我們配置一組TCP或者UDP等協(xié)議的監(jiān)聽.
#4層tcp負(fù)載
stream {
upstream myweb {
hash $remote_addr consistent;
server 172.17.14.2:8080;
server 172.17.14.3:8080;
}
server {
listen 82;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass myweb;
}
}
*在這里要注意stream模塊不在http的服務(wù)里邊,采用的是四層的協(xié)議鹏控。
在這里就不重復(fù)操作了致扯,可以參考官方網(wǎng)站學(xué)習(xí)。
總結(jié)
??負(fù)載均衡除了nginx的使用外比較常用的還有 LVS 当辐、Haproxy等抖僵,在使用時(shí)應(yīng)根據(jù)具體的場景進(jìn)行使用,如果條件允許的話缘揪,還可以使用keepalived 高可用等相關(guān)技術(shù)耍群。
??
歡迎一起交流分享!