一種高效、可靠、免費的高可用及負載均衡軟體,非常適合於高負載站點的七層數據請求。客戶端通過Haproxy代理伺服器獲得站點頁面,而代理伺服器收到客戶請求後根據負載均衡的規則將請求數據轉發給後端真實伺服器,實現了一種事件驅動、單一進程模型,能支持非常大的並發連接數。
同一客戶端訪問伺服器,Haproxy保持會話的三種方案:
1) Haproxy將客戶端ip進行Hash計算並保存,由此確保相同IP訪問時被轉發到同一真實伺服器上。
2) Haproxy依靠真實伺服器發送給客戶端的cookie信息進行回話保持。
3) Haproxy保存真實伺服器的session及伺服器標識,實現會話保持功能。
二、Haproxy代理模式四層Tcp代理:Haproxy僅在客戶端和伺服器之間雙向轉發流量,可用於郵件服務內部協議通信伺服器、Mysql服務等;
七層應用代理:Haproxy會分析應用層協議,並且能通過運行、拒絕、交換、增加、修改或者刪除請求(request)或者回應(reponse)裡指定內容來控制協議。可用於HTTP代理或https代理。
無負載均衡
簡單的無負載均衡Web應用環境, 用戶會直接接入Web伺服器,即kevin.com且其中不存在負載均衡機制。如果單一Web伺服器發生故障,用戶將無法接入該伺服器。另,若多位用戶同時訪問該伺服器,且其無法處理該負載,則會出現響應緩慢或者無法接入的情況
四層負載均衡
最為簡單的負載均衡方式,將網絡流量引導至多臺伺服器以使用四層(即傳輸層)負載均衡。這種方式會根據IP範圍與埠進行用戶流量轉發(例如:有請求指向http://kevin.com/anything,則該流量將被轉發至backend,即將用戶請求轉發至後端伺服器的web-backend組。被選定的後端伺服器將直接響應用戶請求),web-backend中的全部伺服器都應當擁有同樣的內容, 否則用戶可能會遭遇內容不一致問題。
七層負載均衡
網絡流量使用7層負載均衡意味著均衡器能夠根據用戶的請求內容將請求轉發至不同後端伺服器。這種方式允許在同一域名及埠上運行多套Web應用伺服器。例如:用戶向kevin.com/blog發送請求,則會被轉發至blog後端,其包含一組運行有同一blog應用的伺服器。其它請求則會被轉發至web-backend,其負責運行其它應用。總的來說,它可以根據「IP+埠」的方式進行負載分流,還可以根據網站的URL、訪問域名、瀏覽器類別、語言等決定負載均衡的策略。
三、負載均衡LVS、Haproxy、Nginx對比總結:
大型網站架構:對性能有嚴格要求的時候可以使用lvs或者硬體F5,單從負載均衡的角度來說,lvs也許會成為主流,更適合現在大型的網際網路公司。
中型網站架構:對於頁面分離請求有明確規定,並且性能有嚴格要求時,可以使用haproxy。
中小型網站架構:比如日訪問量小於1000萬,需要進行高並發的網站或者對網絡不太嚴格的時候,可以使用nginx。
四、 Haproxy負載均衡算法HaProxy的負載均衡算法現在具體有如下8種:
roundrobin:輪詢
static-rr:權重輪詢
leastconn:最少連接者優先
source:根據請求源IP,這個跟Nginx的ip_hash機制類似
ri:根據請求的URI
rl_param:表示根據請求的URI參數『balance url_param’requires an URL parameter name;
hdr(name):根據HTTP請求頭來鎖定每一次HTTP請求
rdp-cookie(name):根據cookie來鎖定並哈希每一次TCP請求
五.Haproxy的配置Haproxy的配置過程分為3個主要部分:
Haproxy配置中分五大部分:
global:全局參數配置,進程級的,用來控制Haproxy啟動前的一些進程及系統設置。
defaults:配置一些默認的參數,可以被frontend,backend,listen段集成使用。
frontend:用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理。
backend:定義後端伺服器集群,以及對後端伺服器集群的一些權重、隊列、連接數等選項的設置,類似於nginx中的upstream模塊。
listen:可以理解為frontend和backend的組合體。
Haproxy配置文件的配置方法主要有兩種,一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端都可以有多個。第二種方法是只有一個listen配置塊來同時實現前端和後端。最常用也是推薦的方法為第一種,即frontend和backend的模式。
global # 全局參數global模塊的設置
log 127.0.0.1 local2 # log語法:log <address_1>[max_level_1] # 全局的日誌配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日誌設備,記錄日誌等級為info的日誌
chroot /var/lib/haproxy #工作目錄
pidfile /var/run/haproxy.pid #進程pid文件
maxconn 4000 #最大連接數
user haproxy #所屬用戶
group haproxy #所屬用戶組
daemon #以守護進程方式運行haproxy
stats socket /var/lib/haproxy/stats #定義socket套接字,針對在線維護很有幫助
defaults # defaults模塊的設置
mode http #默認的模式{ tcp|http|health},health只會返回OK
log global #應用全局的日誌配置
option httplog #啟用日誌記錄HTTP請求,默認不記錄HTTP請求日誌
option dontlognull # 啟用該項,日誌中將不會記錄空連接。所謂空連接就是在上遊的負載均衡器者監控系統為了探測該 服務是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描埠是否在監聽或開放等動作被稱為空連接;官方文檔中標註,如果該服務上遊沒有其他的負載均衡器的話,建議不要使用該參數,因為網際網路上的惡意掃描或其他動作就不會被記錄下來
option http-server-close #每次請求完畢後主動關閉http通道
option forwardfor except 127.0.0.0/8 #如果伺服器上的應用程式想記錄發起請求的客戶端的IP位址,需要在HAProxy上配置此選項, 這樣 HAProxy會把客戶端的IP信息發送給伺服器,在HTTP 請求中添加"X-Forwarded-For"欄位。啟用 X-Forwarded-For,在requests 頭部插入客戶端IP發送給後端的server,使後端server獲取到客戶端的真實IP。
option redispatch # 當使用了cookie時,haproxy將會將其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果後端的伺服器宕掉 了, 但是客戶端的cookie是不會刷新的,如果設置此參數,將會將客戶的請 求強制定向到另外一個後端server上,以保證服務的正常。
retries 3 # 定義連接後端伺服器的失敗重連次數,連接失敗次數超過此值後將會將對應後端伺服器標記為不可用
timeout http-request 10s #http請求超時時間
timeout queue 1m #一個請求在隊列裡的超時時間
timeout connect 10s #連接超時
timeout client 1m #客戶端超時
timeout server 1m #伺服器端超時
timeout http-keep-alive 10s #設置http-keep-alive的超時時間
timeout check 10s #檢測超時
maxconn 3000 #每個進程可用的最大連接數
listen stats #定義一個listen模塊,用於狀態檢測
mode http #模式採用http
bind 0.0.0.0:8888 #綁定本機的地址及埠
stats enable #啟用狀態檢測功能
stats uri /haproxy-status #狀態檢測的URI
stats auth haproxy:123456 #訪問檢測界面的用戶名和密碼
frontend main *:80 #frontend模塊的設置,定義了一個前端
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js #這裡定義了一個acl規則
use_backend static if url_static #如果匹配到了acl,則訪問後端的static模塊
default_backend my_webserver #如果沒有匹配到acl,則將請求丟給默認的模塊
backend static #定義第一個後端模塊,static
balance roundrobin #負載均衡算法為輪詢
server static 127.0.0.1:80 check #後端伺服器地址
backend my_webserver #定第二個後端,my_wenserver
balance roundrobin #負載均衡算法
server web01 172.31.2.33:80 check inter 2000 fall 3 weight 30 #定義的多個後端
server web02 172.31.2.34:80 check inter 2000 fall 3 weight 30 #定義的多個後端
server web03 172.31.2.35:80 check inter 2000 fall 3 weight 30 #定義的多個後端2.健康檢查 Haproxy作為Loadblance,支持對backend的健康檢查,以保證在後端backend不能服務時,把從frontend進來的request分配至其他可以服務的backend,從而保證整體服務的可用性。
相關配置:
httpchk <method><uri><version>
option httpchk HEAD / HTTP/1.0
check:啟動健康檢測
inter:健康檢測時間間隔
rise:檢測服務可用的連接次數
fall:檢測服務不可用的連接次數
error-limit:往server寫數據連續失敗次數的上限,執行on-error的設定
observe<mode>:把正常服務過程作為健康檢測請求,即實時檢測
on-error<mode>:滿足error-limit後執行的操作(fastinter、fail-check、sudden-death、mark-down)。其中fastinter表示立即按照fastinter的檢測延時進行。fail-check表示改次error作為一次檢測;sudden-death表示模仿一次fatal,如果緊接著一次fail則server為down;mark-down表示直接把server設置為down狀態。
server web-node2 192.168.56.22:8080 check inter 2000 rise 30 fall 153.檢測方式1、通過監聽埠進行健康檢測
這種檢測方式,haproxy只會去檢查server的埠,並不能保證服務真正可用。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2
2、通過URI進行健康檢測
這種檢測方式,是用去GET後端server的web頁面,基本可以代表後端服務的可用性。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk GET /index.html
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 23、通過request獲取的頭部信息進行匹配進行健康檢測
這種檢測方式,是基於一些高級、精細的監測需求,通過對後端頭部訪問的頭部信息進行匹配檢測。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk HEAD /index.jsp HTTP/1.1\r\n\Host:\www.xxx.com
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2Keepalived詳細介紹篇:
企業實戰(14)基於LVS-DR模式負載均衡+Keepalived高可用集群實戰詳解
六、Haproxy負載均衡集群實戰 準備4臺Linux伺服器,兩臺做Web伺服器,1臺安裝HAProxy,1臺做客戶端,實現如下功能:
客戶端訪問Haproxy,Haproxy分發請求到後端Real Server;
開啟Haproxy監控頁面,及時查看調度器狀態;
設置Haproxy為開機啟動;
使用4臺虛擬機:
1臺作為Haproxy調度器 2臺作為Real Server 1臺作為客戶端
環境介紹: Haproxy調度伺服器:192.168.2.130/24
真實伺服器1:192.168.2.128/24
真實伺服器2:192.168.2.129/24
客戶端:192.168.2.132/24
注意:
如果在這之前有配置過其他負載均衡軟體,如:LVS、Nginx,則必須將網絡環境清理乾淨(清空LVS規則、關閉keepalived、刪除VIP位址)。
一、後端真實伺服器配置1.兩臺後端伺服器128/129分別安裝Nginx
[root@localhost ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
[root@localhost ~]# yum -y install gcc pcre-devel openssl-devel
[root@localhost ~]# useradd -s /sbin/nologin nginx //創建禁止登陸解釋器的用戶(為了安全)
[root@localhost ~]# id nginx
uid=1001(nginx) gid=1001(nginx) 組=1001(nginx)
[root@localhost ~]# tar -xf nginx-1.16.1.tar.gz
[root@localhost ~]# cd nginx-1.16.1
[root@localhost nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
--prefix=/usr/local/nginx //指定安裝路徑
--user=nginx //指定用戶
--group=nginx //指定組
--with-http_ssl_module //安裝ssl模塊,開啟其中的SSL加密功能(需要什麼模塊就安裝什麼模塊)
.
.
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[root@localhost nginx-1.16.1]# make && make install //編譯並且安裝
.
'/usr/local/nginx/conf/scgi_params.default'
test -f '/usr/local/nginx/conf/nginx.conf' \
|| cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf'
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: 離開目錄「/root/nginx-1.16.1」
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@test2 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module2.創建測試頁面
[root@localhost ~]# echo "I am 192.168.2.128" > /usr/local/nginx/html/index.html
[root@test2 ~]# echo "I am 192.168.2.129" > /usr/local/nginx/html/index.html3.啟動Nginx
[root@localhost nginx-1.16.1]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost nginx-1.16.1]# netstat -antulp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6079/nginx: master
或者[root@localhost nginx-1.16.1]# netstat -antulp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6079/nginx: master3.關閉防火牆與selinux
兩臺後端伺服器都需要操作。
[root@test2 ~]# systmctl stop firewalld
[root@test2 ~]# setenforce 0
[root@test2 ~]# getenforce
Disabled
[root@test2 ~]# vim /etc/sysconfig/selinux //永久關閉selinux
SELINUX=disabled二、調度器部署Haproxy服務1.安裝Haproxy軟體
[root@test3 ~]# yum -y install haproxy2.修改配置文件
[root@test3 ~]# vim /etc/haproxy/haproxy.cfg
global ----> 以下為:全局設置
log 127.0.0.1 local2 ###[err warning info debug]
chroot /usr/local/haproxy //改變當前工作目錄
pidfile /var/run/haproxy.pid //haproxy的pid存放路徑
maxconn 4000 //最大連接數,默認4000
user haproxy //用戶haproxy運行啟動服務
group haproxy //用戶組為haproxy
daemon //創建1個進程進入deamon模式運行(放到後臺)
.
defaults -> 以下為:默認設置
mode http //默認的模式mode { tcp|http|health } tcp是4層,http是7層,health只會返回OK。
log global //採用全局定義的日誌
option dontlognull //不記錄健康檢查的日誌信息
option httpclose //每次請求完畢後主動關閉http通道
option httplog //日誌類別http日誌格式
option forwardfor //後端伺服器可以從Http Header中獲得客戶端ip
option redispatch //serverid伺服器掛掉後強制定向到其他健康伺服器
timeout connect 10000 //如果backend沒有指定,默認為10s
timeout client 300000 //客戶端連接超時
timeout server 300000 //伺服器連接超時
maxconn 60000 //最大連接數
retries 3 //3次連接失敗就認為服務不可用,也可以通過後面設置
.
-> 以下為:集群配置(手寫進去)
listen stats 0.0.0.0:1080 //監聽埠
stats refresh 30s //統計頁面自動刷新時間
stats uri /stats //統計頁面url
stats realm Haproxy Manager //進入管理頁面查看狀態信息
stats auth admin:admin //統計頁面用戶名和密碼設置
#stats hide-version //隱藏統計頁面上HAProxy的版本信息
listen websrv-rewrite 0.0.0.0:80
balance roundrobin //使用輪詢算法(rr)
server web1 192.168.2.100:80 check inter 2000 rise 2 fall 5
//每隔2000毫秒做一次健康檢查,允許失敗5次,連續失敗5次後從集群剔除,重新訪問2次後算成功,再添加入集群.
server web2 192.168.2.200:80 check inter 2000 rise 2 fall 53.啟動服務並設置開機自啟
[root@test3 ~]# systemctl start haproxy
[root@test3 ~]# systemctl enable haproxy三、客戶端驗證 客戶端配置與HAProxy相同網絡段的IP位址,並使用谷歌瀏覽器訪問http://192.168.2.130(或者客戶端curl http://192.168.2.130)測試調度器是否正常工作,客戶端訪問http://192.168.2.130:1080/stats測試狀態監控頁面是否正常。
備註: Queue隊列數據的信息(當前隊列數量,最大值,隊列限制數量);
Session rate每秒會話率(當前值,最大值,限制數量);
Sessions總會話量(當前值,最大值,總量,Lbtot: total number of times a server was selected選中一臺伺服器所用的總時間);
Bytes(入站、出站流量);
Denied(拒絕請求、拒絕回應);
Errors(錯誤請求、錯誤連接、錯誤回應);
Warnings(重新嘗試警告retry、重新連接redispatches);
Server(狀態、最後檢查的時間(多久前執行的最後一次檢查)、權重、備份伺服器數量、down機伺服器數量、down機時長)。
如果你覺得這篇文章還不錯,就請動動你的發財手為本文留個言,點個在看,或者轉發一下吧,因為這將是我持續輸出更多優質文章的最強動力!