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
也可以單獨添加:
stats uri /admin #統計頁面url
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
3.2 用戶端測試
elinks -dump http://192.168.4.41/a.html #結果:輪詢隻出現在web44,web45
elinks -dump http://192.168.4.41/a.php #結果:輪詢隻出現在web42,web43