軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵件服務器、內部協議通信服務器等),和7層(HTTP)。在4層模式 下,HAProxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,並且能通過允許、拒絕、交換、增加、修改或者刪除請求 (request)或者回應(response)裏指定內容來控制協議,這種操作要基於特定規則。
HAProxy介紹
反向代理服務器,支持雙機熱備支持虛擬主機,但其配置簡單,擁有非常不錯的服務器健康檢查功能,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加回。新的1.3引入了frontend,backend;frontend根據任意 HTTP請求頭內容做規則匹配,然後把請求定向到相關的backend。
實驗環境:
系統:rhel6.5
server1.example.com:172.25.0.1 和 server2.example.com:172.25.0.2爲服務主機
server3.example.com:172.25.0.3和server4.example.com:172.25.0.4爲後端服務器
安裝
在server1和server2上
#yum install -y haproxy
#vim /etc/haproxy/haproxy.cfg
保留最後的listen模塊,上面註釋相應模塊
listen westos *:80 //haproxy使用80端口
balance roundrobin //負載均衡爲rr
server web1 172.25.0.3:80 check //服務機爲ip爲172.25.0.3的,名爲web1
server web2 172.25.0.4:80 check //服務機爲ip爲172.25.0.4,名爲web2
#/etc/init.d/haproxy start
在server3和server4上,添加主頁並且內容爲各自的hostname。啓動httpd。
在web上顯示haproxy信息
在server2上
#vim /etc/haproxy/haproxy.cfg
在maxconn下面添加
stats uri /status
#vim /etc/haproxy/haproxy.cfg
frontend westos *:80
default_backend web
backend web
balance roundrobin
server web1 172.25.0.3:80 check
server web2 172,25.0.4:80 check
//將listen模塊分爲frontend 和backend。frontend根據任意 HTTP請求頭內容做規則匹配,然後把請求定向到相關的backend。
在server web1/2行後面加weight 1/2給web1/2加權重。
在server行下面加
server backup 127.0.0.1:8080 backup //備用機爲本機,當server3或4都壞掉後通過8080端口啓用本機
#vim /etc/httpd/conf/httpd.conf
添加Listen 8080 //增加apache監聽8080端口
啓動httpd,並添加內容爲”please try later”的主頁。
當server3與server4的httpd同時down掉後,
在rsyslog中給haproxy添加日誌文件
#vim /etc/rsyslog.conf
添加
local2.* /var/log/haproxy.log
重啓rsyslog服務。
#tail -f /va/log/haproxy.log
#vim /etc/haproxy/haproxy.cfg
在stats uri /status下面添加
stats auth admin:westos //給本機添加認證
在frontend模塊中添加
acl bad src 172.25.0.251 //阻止源ip爲172.25.0.251的主機訪問
真機ip爲172.25.0.251,因此出現下圖
在acl下繼續添加
block if bad
errorloc 403 http://172.25.0.2:8080
redirect location http://172.25.0.2:8080 if bad //當172.25.0.2:80出現403錯誤時跳轉172.25.0.2:8080
註釋剛添加的三行
添加
acl denyfile path /admin/
http-request deny if denyfile bad //拒絕訪問172.25.0.2/admin(訪問目標爲web1或2的amdin)
動靜分離:
註釋剛添加的兩行
修改爲
frontend westos *:80
acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend p_w_picpaths if url_static //當網址以p_w_picpaths javascripts結尾時調用p_w_picpaths模塊
default_backend upload
backend p_w_picpaths
balance roundrobin
server web1 172.25.0.3:80 check
server backup 127.0.0.1:8080 backup
backend upload
server web2 172.25.0.4:80 check
在server3中的/var/www/html/p_w_picpaths文件夾中添加圖片
server2:
#/etc/init.d/harpoxy reload
讀寫分離:
添加
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
use_backend p_w_picpaths if read //爲讀時調用p_w_picpaths模塊
use_backend upload if write //爲寫時調用upload模塊
在server3/4中添加upload文件夾(包含相應的php文件),在upload中添加upload文件夾。
#chmod 777 -R /var/www/html/upload
通過日誌可以看到,server3通過調用p_w_picpaths模塊讀取上傳信息,然後server4通過upload模塊將文件存到server4的/var/www/html/upload/upload/中。上傳後,可以在server4中的upload中找到上傳的文件
通過pacemaker調用haproxy
在server1/2上
#/etc/init.d/corosync start
#crm configure
#primitive vip ocf:heartbeat:IPaddr2 params ip=172.25.0.100 cidr_netmask=32 op minitor interval=30s
#primitive haproxy lsb:haproxy op monitor interval=30s
#commit
#group hagroup vip haproxy