1 關於HAProxy
1.1 介紹:
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
1.2 衡量負責均衡器性能的因素:
Session rate 會話率:每秒鐘產生的會話數
Session concurrency 併發會話數:服務器處理會話的時間越長,併發會話數越多
Data rate 數據速率:高會話數,高數據速率要求更多的內存
1.3 HAProxy工作模式:
mode http:客戶端請求被深度分析後再發往服務器
mode tcp: 客戶端與服務器之間建立會話,不檢查第七層信息
mode health: 僅做健康狀態檢查,已經不建議使用
1.4 配置文件說明:
global部分:全局設置進程級別參數
default:爲後續的其它部分設置缺省參數 缺省參數可以被後續部分重置
frontend:描述接收客戶端偵聽套字節集
backend:描述轉發鏈接的服務器集
listen:把frontend和backend結合到一起的完整聲明
vim /etc/haproxy/haproxy.cfg
###########全局配置#########
global
log 127.0.0.1 local2 #日誌輸出配置,所有日誌都記錄在本機,通過local2輸出
chroot /var/lib/haproxy #chroot運行路徑
pidfile /var/run/haproxy.pid #pid存放的路徑
maxconn 4000 #最大的連接數
user haproxy
group haproxy
daemon #以守護進程運行
###########默認配置#########
defaults
mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只返回OK
log global
option httplog #日誌類別,採用httplog
option dontlognull #不記錄健康檢查日誌信息
option http-server-close #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式實現
option forwardfor except 127.0.0.0/8
option redispatch
retries 3 #3次連接失敗就認爲服務器不可用
timeout http-request 10s #默認http請求超時時間
timeout queue 1m #默認隊列超時時間
timeout connect 10s #連接超時
timeout client 1m #客戶端超時
timeout server 1m #服務器超時
timeout http-keep-alive 10s #默認持久連接超時時間
timeout check 10s #心跳監測超時
maxconn 3000 #最大連接數
###########統計頁面配置#########
listen stats
bind 0.0.0.0:1080 #監聽端口
stats refresh 30s #統計頁面自動刷新時間
stats uri /stats #統計頁面url
stats realm Haproxy Manager #統計頁面密碼框上提示文本
stats auth admin:admin #統計頁面用戶名和密碼設置,可以設置多個
stats hide-version #隱藏統計頁面上HAProxy的版本信息
###########frontend前端配置#########
#原配置文件說明
frontend main *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets #acl後面是規則名稱,-i爲忽略大小寫,後面跟的是要訪問的域名,如果訪問這個域名就觸發images等規則
acl url_static path_end -i .jpg .gif .png .css .js
#path_beg 匹配路徑的開頭,path_end 匹配路徑的結尾
use_backend static if url_static
default_backend app
#自定義配置文件
frontend web 192.168.4.100:80 #定義前端的名稱
acl url_html path_end -i .html #匹配url的結尾
acl url_php path_end -i .php #匹配.php的結尾
use_backend html-group if url_html #定義後端服務組(以html結尾)
use_backend php-group if url_php #定義後端服務組(以php結尾)
default_backend html-group #默認後端服務組(僅IP)
backend html-group #後端服務組的具體的信息
balance roundrobin #輪詢調度算法
server app101 192.168.4.101:80 check
server app102 192.168.4.102:80 check
backend php-group
balance roundrobin
server app103 192.168.4.103:80 check
server app104 192.168.4.104:80 check
###########backend後端配置#########
backend static #backend起的名稱,static作用域
balance roundrobin #調度算法
server static 127.0.0.1:4331 check
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
listen webserver 0.0.0.0:80 #webserver:名稱,允許所有通過80端口訪問
cookie SERVERID rewrite #記錄客戶端訪問網站服務器的cookie信息
balance roundrobin #調度算法
server server44 192.168.4.44:80 cookie app44 check inter 2000 rise 2 fall 5
server server45 192.168.4.45:80 cookie app45 check inter 2000 rise 2 fall 5
#後端服務器命名server44 cookie 爲cookie命名app44
2 案例1普通LB集羣
HAProxy服務器:RHEL7.2 IP:192.168.4.41
web:192.168.4.44 192.168.40.45
2.1 配置
[root@ser100 ~]# yum -y install haproxy
[root@ser100 ~]# vim /etc/haproxy/haproxy.cfg
#刪除default以下的其它配置,添加如下配置
listen webserver 0.0.0.0:80 #webserver:名稱 允許所有通過80端口訪問
cookie SERVERID rewrite #記錄客戶端訪問網站服務器的cookie信息
balance roundrobin #調度算法
server web101 192.168.4.44:80 cookie app101 check inter 2000 rise 2 fall 5
server web102 192.168.4.45:80 cookie app102 check inter 2000 rise 2 fall 5
#後端服務器 cookie app101 爲cookie命名
在defaults 最後一行添加 stats uri /admin
http://192.168.4.41/admin 是URL
去掉http://192.168.4.41 剩下的就是uri
也可以單獨添加:
listen stats
bind 0.0.0.0:1080 #監聽端口
stats refresh 30s #統計頁面自動刷新時間
stats uri /admin #統計頁面url
stats realm Haproxy Manager #統計頁面密碼框上提示文本
stats auth admin:admin #統計頁面用戶名和密碼設置
stats hide-version #隱藏統計頁面上HAProxy的版本信息
2.2 啓動服務
[root@ser41 ~]# systemctl start haproxy
[root@ser41 ~]# systemctl enable haproxy
2.3 訪問
http://192.168.4.41/admin (根據配置文件)
3 案例2區分業務的LB集羣
做普通LB集羣對配置文件做了備份,現在對配置文件重新配置
區分不同的業務:在應用層區分
準備4臺web服務器,4臺web服務器的/var/www/html路徑下都存放 .html和.php結尾的文件
3.1 配置
在web服務器上:
yum -y install php #解釋php代碼
systemctl restart httpd #重新加載php模塊
vim /var/www/html/a.php
<?php
echo “web42”;
?>
vim /var/www/html/a.html
i am web42
[root@ser41 ~]# vim /etc/haproxy/haproxy.cfg
frontend webgroup 192.168.4.41:80 #定義前端的名稱webgroup,允許只能通過某個ip的某個端口訪問
# acl url_static path_beg -i /static
acl url_html path_end -i .html #匹配url以html的結尾
acl url_php path_end -i .php #匹配url以php的結尾
use_backend html-group if url_html #定義後端服務組(以html結尾)
use_backend php-group if url_php #定義後端服務組(以php結尾)
default_backend html-group #默認後端服務組(僅IP)
backend html-group #後端服務組的具體的信息
balance roundrobin #輪詢調度算法
server web44 192.168.4.44:80 check #後端真正的服務器,check:做健康性檢查
server web45 192.168.4.45:80 check
backend php-group
balance roundrobin
server web42 192.168.4.42:80 check
server web43 192.168.4.43:80 check
[root@ser41 ~]# systemctl start haproxy
3.2 客戶端測試
elinks -dump http://192.168.4.41/a.html #結果:輪詢只出現在web44,web45
elinks -dump http://192.168.4.41/a.php #結果:輪詢只出現在web42,web43
elinks -dump http://192.168.4.41 #結果都出現
網頁監控信息查看:firefox http://192.168.4.41/admin