haproxy+keepalived實現負載均衡及高可用
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負載均衡高可用架構
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 [email protected]
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會漂移到從服務器上,而且網站照常可以訪問
關閉主服務器後IP漂移:
測試haproxy:
訪問:http://172.17.111.10:1080/haproxyadmin 查看統計報告,都正常
實驗二、通過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之後就不能訪問了
實驗三、根據用戶訪問內容實現動靜分離
在frontend中加入
acl url_static path_beg -i /data /images /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的日誌就會看到訪問該服務器的真實的客戶端IP
實驗五、實現會話保持
在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會被清理。如果該服務器宕機了,那麽會被重新標記到別的服務器。
感謝瀏覽,如有疑問,歡迎留言。
haproxy+keepalived實現負載均衡及高可用