Haproxy
HAProxy 提供高可用性、負載均衡以及基於 TCP 和 HTTP 應用的代理,支持虛擬主機,
它是免費、快速並且可靠的一種解決方案。HAProxy 特別適用於那些負載特大的 web 站
點, 這些站點通常又需要會話保持或七層處理。HAProxy 運行在當前的硬件上,完全可
以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前
的架構中, 同時可以保護你的 web 服務器不被暴露到網絡上。
實驗環境:rhel6.5 selinux and iptables disabled
實驗主機: 192.168.2.36 haproxy
192.168.2.38 web1
192.168.2.39 web2
軟件下載:http://haproxy.1wt.eu/
rpm 包方式:
rpmbuild -tb haproxy-1.4.24.tar.gz
rpm -ivh /root/rpmbuild/RPMS/x86_64/haproxy-1.4.24x86_64.rpm
源碼方式:
tar zxf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26 ARCH=x86_64 USE_PCRE=1 PREFIX=/usr/local/haproxy install
在安裝過程中可能需要一些依賴包
yum install pcre-devel make gcc -y
#mkdir -p /usr/share/haproxy
配置:
vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 #指定日誌設備
log 127.0.0.1 local1 notice
#log loghost local0 info #指定日誌類型,還有 err warning debug
maxconn 65535 #併發最大連接數量
chroot /usr/share/haproxy #jail 目錄
uid 99 #用戶
gid 99 #組
daemon #後臺運行
#debug
#quiet
defaults
log
global
mode http #默認使用 http 的 7 層模式 tcp: 4 層
option httplog #http 日誌格式
option dontlognull #禁用空鏈接日誌
retries 3 #重試 3 次失敗認爲服務器不可用
option redispatch #當 client 連接到掛掉的機器時,重新分配到健康的主機
maxconn 65535
contimeout 5000
#連接超時
clitimeout 50000 #客戶端超時
srvtimeout 50000 #服務器端超時
stats uri /status #haproxy 監控頁面
listen www.example.com *:80 #監聽的實例名稱,地址和端口
balance roundrobin #負載均衡算法
server web1 192.168.2.38:80 cookie app1inst1 check inter 2000 rise 2 fall 5
server web2 192.168.2.39:80 cookie app1inst2 check inter 2000 rise 2 fall 5
#cookie app1inst1:表示 serverid 爲 app1inst1
#check inter 2000:檢測心跳頻率
#rise 2:表示 2 次正確認爲服務器可用
#fall 5:表示 5 次失敗認爲服務器不可用
# /etc/init.d/haproxy start
訪問 http://www.example.com 測試負載 網頁在兩個web上切換表示成功
訪問 haproxy 監控頁面:http://192.168.2.136/status
系統負載均衡架構:
主機環境:RHEL6 系列 selinux and iptables disabled
實驗主機:
LVS‐ACTIVE: 192.168.2.136
LVS‐BACKUP:192.168.2.146
LVS‐VIP:192.168.2.111
Realsever:192.168.2.38 192.168.2.39
主備機上的軟件包安裝與配置
yum install ipvsadm kernel-devel openssl-devel popt-devel libnl-devel gcc make -y
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar zxf keepalived-1.2.5.tar.gz
cd keepalived-1.2.5
./configure --prefix=/usr/local/keepalived
...
Keepalived configuration
------------------------
Keepalived version: 1.2.5
Compiler: gcc
Compiler flags: -g -O2
Extra Lib: -lpopt -lssl -lcrypto -lnl
Use IPVS Framework: Yes
IPVS sync daemon support : Yes
IPVS use libnl: Yes
Use VRRP Framework: Yes
Use VRRP VMAC: Yes
SNMP support: No
Use Debug flags: No
#make
#make install
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #接收警報的 email 地址,可以添加多個
}
notification_email_from [email protected] #設置郵件的發送地址
smtp_server 127.0.0.1 #設置 smtp server 地址
smtp_connect_timeout 30 #設置連接 smtp 服務器超時時間
router_id LVS_DEVEL #load balancer 的標識 ID,用於 email 警報
}
vrrp_instance VI_1 {
state MASTER #備機改爲 BACKUP,此狀態是由 priority 的值來決定的,當前
priority 的值小於備機的值,那麼將會失去 MASTER 狀態
interface eth0 #HA 監測網絡接口
virtual_router_id 51 #主、備機的 virtual_router_id 必須相同,取值 0-255
priority 100 #主機的優先級,備份機改爲 50,主機優先級一定要大於備機
advert_int 1 #主備之間的通告間隔秒數
authentication { #主備切換時的驗證
auth_type PASS #設置驗證類型,主要有 PASS 和 AH 兩種
auth_pass 1111 #設置驗證密碼,在一個 vrrp_instance 下,MASTER 與 BACKUP 必
須使用相同的密碼才能正常通信
}
virtual_ipaddress {
192.168.2.111 #設置虛擬 IP 地址,可以設置多個虛擬 IP 地址,每行一個
}
}
virtual_server 192.168.2.111 80 { #定義虛擬服務器
delay_loop 6 #每隔 6 秒查詢 realserver 狀態
lb_algo rr #lvs 調度算法,這裏使用輪叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50 #會話保持時間,單位是秒,這個選項對於動態網頁是非常有
用的,爲集羣系統中 session 共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的
請求會被一直分發到某個服務節點,直到超過這個會話保持時間。需要注意的是,這個會話保
持時間,是最大無響應超時時間,也就是說用戶在操作動態頁面時,如果在 50 秒內沒有執行任
何操作,那麼接下來的操作會被分發到另外節點,但是如果一直在操作動態頁面,則不受 50 秒
的時間限制。
protocol TCP #指定轉發協議類型,有 tcp 和 udp 兩種
real_server 192.168.2.38 80 { #配置服務節點
weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權
值越高,設置權值的大小可以爲不同性能的服務器分配不同的負載,可以對性能高的服務器設
置較高的權值,而對性能較低的服務器設置相對較低的權值,這樣就合理的利用和分配了系統
資源
TCP_CHECK { #realserve 的狀態檢測設置部分,單位是秒
connect_timeout 10 #10 秒無響應超時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
}
}
real_server 192.168.2.39 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 192.168.2.111 21{
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.2.38 21 {
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.2.39 21 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注:備機的 keepalived 配置文件只改動紅色字體部分!
分別在 realserver 上執行以下命令
#ifconfig eth0:1 192.168.0.163 netmask 255.255.255.255 up
#vim /etc/sysconfig/arptables
# Generated by arptables-save v0.0.8 on Fri Aug 8 06:12:56 2014
*filter
:IN ACCEPT [497:13916]
:OUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
[0:0] -A IN -d 192.168.2.111 -j DROP
[0:0] -A OUT -s 192.168.2.111 -j mangle --mangle-ip-s 192.168.2.38
COMMIT
# Completed on Fri Aug 8 06:12:56 2014
#/etc/init.d/arptables_jf restart
#/etc/init.d/httpd stop
#/etc/init.d/httpd start
然後啓動keepalived
#/etc/init.d/keepalived start
用ipvsadm -l查看連接狀況
測試:
1. 高可用測試:停止 master 上的 keepalived 服務,看 backup 是否接管。
2. 負載均衡測試:訪問 http://192.168.2.111,看到頁面在兩個 realserver 上切換表示成功!
你也可以通過 ipvsadm -l 查看詳細連接情況!
3. 故障切換測試:任意關閉 realserver 上的 httpd 服務,Keepalived 監控模塊是否能及時發現,
然後屏蔽故障節點,同時將服務轉移到正常節點來執行。
haproxy+keepalived (解決haproxy的單點故障)
MASTER:
# vim keepalived.conf
! Configuration File for keepalived
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy"
}
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
track_script {
check_haproxy
}
}
BACKUP:
# vim 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 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
track_script {
check_haproxy
}
}
檢測腳本:
# vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
/etc/init.d/haproxy status &> /dev/null || /etc/init.d/haproxy restart &> /dev/null
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop &> /dev/null
fi
假如說haproxy掛掉了,那keepalived就會停掉,而把haproxy轉接到備機上,這樣就解決了haproxy的單點故障問題。