HAProxy雙機高可用之HAProxy+Keepalived

Haproxy 

HAProxy 提供高可用性、負載均衡以及基於 TCP 和 HTTP 應用的代理,支持虛擬主機, 

它是免費、快速並且可靠的一種解決方案。HAProxy 特別適用於那些負載特大的 web 站 

點, 這些站點通常又需要會話保持或七層處理。HAProxy 運行在當前的硬件上,完全可 

以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前 

的架構中, 同時可以保護你的 web 服務器不被暴露到網絡上。

wKiom1PmNt3xVWAfAAFdGIiIK8M855.jpg


 實驗環境: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 


wKioL1PmOBTQ8DBYAAHskXbGHHI069.jpgKeepalived+lvs 

系統負載均衡架構:

wKioL1PmOCngh8S9AAFM-NATRTs233.jpg


主機環境: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查看連接狀況

wKioL1PmOEbRlURTAAGkB-o-sWk885.jpg


測試

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的單點故障問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章