1. 程式人生 > >haproxy+keepalived實現負載均衡及高可用

haproxy+keepalived實現負載均衡及高可用

keepalived+haproxy

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實現負載均衡及高可用