? ? HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高性能性、負載均衡,以及基于TCP和HTTP的應用程序代理。相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支持更多的選項,更精細的控制,更多的健康狀態檢測機制和負載均衡算法。

? ? HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

???包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在內眾多知名網站,及亞馬遜網絡服務系統都使用了HAProxy。

?

Haproxy的特性:

1、可靠性與穩定性都非常出色,可與硬件級設備媲美。

2、支持連接拒絕,可以用于防止DDoS***

3、支持長連接、短連接和日志功能,可根據需要靈活配置

4、路由HTTP請求到后端服務器,基于cookie作會話綁定;同時支持通過獲取指定的url來檢測后端服務器的狀態

5、HAProxy還擁有功能強大的ACL支持,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便

6、可支持四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能

7、擁有功能強大的后端服務器的狀態監控web頁面,可以實時了解設備的運行狀態,還可實現設備上下線等簡單操作。

8、支持多種負載均衡調度算法,并且也支持session保持。

有關keepalived請參看博客:http://13150617.blog.51cto.com/13140617/1979652?


實驗:實現基于Haproxy+Keepalived負載均衡高可用架構

14d0d6fdafaa47e8990c96be35944f56.jpg

1、準備四臺機器:兩臺用于haproxy主從架構,兩臺作為后端server

? ? ? ? ? ?haproxy-master:兩塊網卡,橋接模式和僅主機模式都有

? ? ? ? ? ? ? ? ? ? ?VIP:172.17.111.10

? ? ? ? ? ?haproxy-backup:兩塊網卡,橋接模式和僅主機模式都有

? ? ? ? ? ? ? ? ? ? ?VIP:172.17.111.10

? ? ? ? ? ?后端server1:僅主機網卡:RIP:192.168.199.146

? ? ? ? ? ?后端server2:僅主機網卡:RIP:192.168.199.143

2、在haproxy-master上操作

①安裝keepalived,配置keepalived。

具體參數含義請參看博客:http://13150617.blog.51cto.com/13140617/1979652

vim /etc/keepalived/keepalived.conf????

! Configuration File for keepalived

?global_defs {? ?

???notification_email {?

?????root@localhost??

???}

???notification_email_from Alexandre.Cassen@firewall.loc

???smtp_server 127.0.0.1???

???smtp_connect_timeout 2?

???router_id LVS_DEVEL2????

}

vrrp_instance VI_1 {

????state MASTER

????interface eth0

????virtual_router_id 33

# ???nopreempt

????priority 100

????advert_int 1

?authentication {

????????auth_type PASS

????????auth_pass 111111

????}

????virtual_ipaddress {

????????172.17.111.10

????}

}

systemctl start keepalived ?啟動服務

?

②配置日志服務

vim /etc/rsyslog.conf

? ? ? $ModLoad imudp ????開啟UDP的日志服務,也可以開啟TCP

???? $UDPServerRun 514 ?

? ? ? local2.* /var/log/haproxy.log ?定義日志標準

systemctl restart rsyslog??重啟日志服務

③配置haproxy

vim /etc/haproxy/haproxy.cfg

??global? ? ? ? ? ? ? ? ? ? ? 全局配置 ???

????log ? ? ? ?127.0.0.1 local2 ? 日志類型

????chroot ? ? ?/var/lib/haproxy??修改haproxy的工作目錄

????pidfile ? ? /var/run/haproxy.pid 進程id

????maxconn ? ? ?4000????? ??最大連接數

????user ? ? ? ?haproxy? ? ? ? 運行用戶

????group ? ? ? haproxy? ? ? ??所屬組

????daemon? ? ? ? ? ? ? ? ? ?讓haproxy以守護進程的方式工作

????stats socket /var/lib/haproxy/stats可開啟一個unix socket管理接口

??

defaults

????mode ? ? ? ? ? ? ?http??實現http的7層規則

????log ? ? ? ? ? ? ? global?日志定義,沿用global的日志定義

????option ? ? ? ? ? ? httplog?啟用日志記錄HTTP請求

????option ? ? ? ? ? ? dontlognull?日志中將不會記錄空連接

????option http-server-close? ? ??強制短連接

????option forwardfor ? ? except 127.0.0.0/8?添加xforward日志標記

????option ? ? ? ? ? ?redispatch? ? ??出錯時重新分配

????retries ? ? ? ? ? ?3? ? ? ? ? ? 重試次數

????timeout http-request ? 10s? ? ? ? ? ?請求超時時間

????timeout queue ? ? ? ?1m? ? ? ? ? ?隊列超時

????timeout connect ? ? ?10s? ? ? ? ? ?連接超時

????timeout client ? ? ? 1m? ? ? ? ? ? 客戶端超時

????timeout server ? ? ? 1m? ? ? ? ? ? 服務器端超時

????timeout http-keep-alive 10s? ? ? ? ? ?持久連接

????timeout check ? ? ? 10s? ? ? ? ? ? 檢查超時

????maxconn ? ? ? ? ? 3000? ? ? ? ? ?最大連接

?

listen stats???定義一個統計報告服務

????????mode http #基于http協議

????????bind 0.0.0.0:1080 #監聽1080端口

????????stats enable #開啟統計報告服務

????????stats hide-version #隱藏統計報告版本信息

????????stats uri /haproxyadmin #統計報告訪問url

????????stats realm Haproxy\ Statistics #頁面登陸信息

????????stats auth admin:admin #驗證賬號信息

????????stats admin if TRUE #驗證模式

?

frontend ?http-in???定義一系列監聽的套接字

????bind *:80

????default_backend ? ? ?app

?

backend app????定義一系列“后端”服務器

????balance ?roundrobin

????option ?httpchk /index.php???檢查頁面

????server ?app1 192.168.199.146:80 check inter 3000 rise 3 fall 3

????server ?app2 192.168.199.143:80 check inter 3000 rise 3 fall 3

?

systemctl start haproxy???啟動haproxy服務

?

④開啟轉發

???echo 1 > /proc/sys/net/ipv4/ip_forward

?

3、在haproxy-backup上操作

?①安裝keepalived,配置keepalived

? ?vim /etc/keepalived/keepalived.conf

? ?配置基本同上,只需要修改state的狀態為BACKUP

??systemctl start keepalived 啟動服務

?②配置日志服務

???完全同上

?③配置haproxy

???完全同上

?④開啟轉發

???echo 1 > /proc/sys/net/ipv4/ip_forward

?

4、測試keepalived高可用:當主服務器正常工作時,VIP在主服務器上,當關閉主服務器的keepalived服務,VIP會漂移到從服務器上,而且網站照常可以訪問

324273a72741b16e719fde74ad59f39f.jpg3e7babaab0d53e70a5e3966d8a4540f4.jpg

關閉主服務器后IP漂移:

e55caa003bc7b2296ed11160077b65d9.jpg?

測試haproxy

訪問:http://172.17.111.10:1080/haproxyadmin 查看統計報告,都正常

759c445373620c33b3761ed7786358aa.jpg?


實驗二、通過ACL指定可訪問的用戶

在frontend中加入

? ? acl myhost src 172.16.100.1 ?指定可訪問的ip

? ? acl myport dst_port 80 ? ? 指定目標端口

? ? block if ! myhost myport ? 拒絕其他主機訪問

重啟haproxy服務:systemctl restart haproxy

測試:在添加此acl之前,其他主機可以訪問

?????添加此acl之后就不能訪問了

d8c6fc3b3fb037995e5dd13b4fc05f65.jpg

實驗三、根據用戶訪問內容實現動靜分離

在frontend中加入

? ? ?acl url_static ?path_beg ?-i /data /p_w_picpaths /javascript /stylesheets /themes?匹配開頭

????acl url_static ?path_end ?-i .jpg .gif .png .css .js .jpeg?匹配后綴

????use_backend static ? if url_static? 如果符合條件就匹配到static中所定義的服務器?


backend static ?定義“后端”服務器

? ? ?balance ????roundrobin ? 輪詢

? ? ?server ?static1 192.168.199.146:80 check ? ?

? ? ?server ?static2 192.168.199.143:80 check

重啟haproxy服務:systemctl restart haproxy

效果:所有的圖片等靜態頁面就會被分配到這兩個server里


實驗四、實現真實日志記錄

defaults里添加

? ? ?option forwardfor except 127.0.0.0/8

那么查看nginx的日志就會看到訪問該服務器的真實的客戶端IPc8c5f286c5707aa919f0e5ca32472c9f.jpg?

?

實驗五、實現會話保持

在backend中的server中插入cookie,比如

?server ?app1 192.168.199.146:80 cookie haha check inter 3000 rise 3 fall 3

?server ?app2 192.168.199.143:80 cookie hehe check inter 3000 rise 3 fall 3?

????那么訪問過app1服務器的主機就會被標記為haha(在cookie中插入此標記),下次訪問時直接被調度到同一臺機器,但是在到達服務器之前cookie會被清理。如果該服務器宕機了,那么會被重新標記到別的服務器。


感謝瀏覽,如有疑問,歡迎留言。

j_0080.gif