1. 程式人生 > 其它 >keepalived高可用使用案例

keepalived高可用使用案例

技術標籤:nginx

1、keepalived實現IP地址的高可用

測試環境
serverA:

eth0:192.168.10.11

eth1:192.168.170.6

serverB:

eth0:192.168.10.12

eth1:192.168.178.7

目的
實現192.168.10.11這個地址的高可用

步驟

1、安裝keepalived
在主機和備用機分別安裝keepalived

sudo apt-get install keepalived

2、建立監測和切換指令碼
分別是chk_apache.sh、ip_master.sh和ip_backup.sh三個指令碼。

ip切換指令碼ip_master.sh和ip_backup.sh中的網絡卡配置檔案請根據實際情況進行配置。

serverA:

[email protected]:/etc/keepalived# more scripts/chk_apache.sh
#!/bin/bash

PORT=`netstat -nap |grep "LISTEN" |grep "8088" |awk '{print $4}' |cut -d: -f2`

if [ $PORT == '8088' ]
then
echo "apache is running ..."
exit 0
else
echo "apache is down!"
/etc/init.
d/keepalived stop /sbin/ifdown eth0 exit 1 fi [email protected]:/etc/keepalived# more scripts/ip_master.sh #!/bin/bash cp /etc/network/interfaces.master /etc/network/interfaces /sbin/ifdown eth0 /sbin/ifup eth0 [email protected]:/etc/keepalived# more scripts/ip_backup.sh #!/bin/bash #cp /etc/network/interfaces.master /
etc/network/interfaces /sbin/ifdown eth0 #/sbin/ifup eth0

serverB:

[email protected]:/etc/keepalived# more scripts/chk_apache.sh
#!/bin/bash

PORT=`netstat -nap |grep "LISTEN" |grep "8088" |awk '{print $4}' |cut -d: -f2`

if [ $PORT == '8088' ]
then
echo "apache is running ..."
exit 0
else
echo "apache is down!"
/etc/init.d/keepalived stop
/sbin/ifdown eth0
exit 1
fi
[email protected]:/etc/keepalived# more scripts/ip_master.sh
#!/bin/bash

cp /etc/network/interfaces.master /etc/network/interfaces

/sbin/ifdown eth0
/sbin/ifup eth0
[email protected]:/etc/keepalived# more scripts/ip_backup.sh
#!/bin/bash

cp /etc/network/interfaces.backup /etc/network/interfaces

/sbin/ifdown eth0
/sbin/ifup eth0

3、配置keepalived.conf
分別在主機和備機上建立配置檔案/etc/keepalived/keepalived.conf ,具體配置類似如下:

serverA:

[email protected]:/etc/keepalived# more keepalived.conf
vrrp_script chk_apache {
script "/etc/keepalived/scripts/chk_apache.sh"
interval 2
}

vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#virtual_ipaddress {
# 192.168.0.221/24
#}

track_script {
chk_apache
}

notify_master /etc/keepalived/scripts/ip_master.sh
notify_backup /etc/keepalived/scripts/ip_backup.sh
}

serverB:

[email protected]:/etc/keepalived# more keepalived.conf
vrrp_script chk_apache {
script "/etc/keepalived/scripts/chk_apache.sh"
interval 2
}

vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#virtual_ipaddress {
# 192.168.0.221/24
#}

track_script {
chk_apache
}

notify_master /etc/keepalived/scripts/ip_master.sh
notify_backup /etc/keepalived/scripts/ip_backup.sh
}

4、測試
關閉serverA的keepalived程序或者關閉apache服務進行測試,serverB切換成主伺服器;

先後開啟serverA的apache服務和keepalived服務,serverA切換成主伺服器,serverB切換成備伺服器。

2、keepalived實現nginx高可用

環境兩臺Ubuntu 14.04 server 64bit

ip:192.168.1.235 master

ip:192.168.1.234 back

vip:192.168.1.233

兩臺機器都安裝keepalived

aptitude update

aptitude  install -y keepalived
aptitude  install -y  nginx

master上面進行建立

該指令碼檢測ngnix的執行狀態,並在nginx程序不存在時嘗試重新啟動ngnix,如果啟動失敗則停止keepalived,準備讓其它機器接管。

cat  /etc/keepalived/check_nginx.sh

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

    /etc/init.d/nginx start

    sleep 2

    counter=$(ps -C nginx --no-heading|wc -l)

    if [ "${counter}" = "0" ]; then

        /etc/init.d/keepalived stop

    fi

fi
cat  /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    notification_email {
        [email protected].com
        [email protected].com
    }
    notification_email_from [email protected].com
    smtp_server mail.cyyun.com
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
#    script "killall -0 nginx"
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -5
    fall 3  
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 192.168.1.235
    virtual_router_id 49
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.233
    }
    track_script {
       chk_nginx
    }
}

back 伺服器上面配置

該指令碼檢測ngnix的執行狀態,並在nginx程序不存在時嘗試重新啟動ngnix,如果啟動失敗則停止keepalived,準備讓其它機器接管。

cat /etc/keepalived/check_nginx.sh

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

    /etc/init.d/nginx start

    sleep 2

    counter=$(ps -C nginx --no-heading|wc -l)

    if [ "${counter}" = "0" ]; then

        /etc/init.d/keepalived stop

    fi

fi

cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    notification_email {
        [email protected].com
        [email protected].com
    }
    notification_email_from [email protected].com
    smtp_server mail.cyyun.com
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
#    script "killall -0 nginx"
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -5
    fall 3  
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 192.168.1.234
    virtual_router_id 49
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.233
    }
    track_script {
       chk_nginx
    }
}

啟動Nginx

/etc/init.d/Nginx start

啟動keepalived

/etc/init.d/keepalived start

在master上面檢視

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:77:41:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.235/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.11.233/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe77:4172/64 scope link
       valid_lft forever preferred_lft forever

在back上面檢視

#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:b4:01:59 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.234/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feb4:159/64 scope link
       valid_lft forever preferred_lft forever

http://192.168.11.233即可。

3、使用apache的mod_proxy模組做tomcat熱備

第一步:安裝apache
注意編譯的時候需要加入mod_proxy模組。

第二步:配置tomcat
分別找到需要加入負載均衡或熱備的tomcat的配置檔案server.xml,修改engine行,新增jvmroute。例如

如果不需要session複製,其他預設儲存即可。

第三步:配置ajp_proxy
不建議使用apache的http_proxy。

找到apache虛擬機器主機配置檔案/usr/local/apache/conf/extra/httpd-vhost.conf,新增如下內容。這個是負載均衡配置。

ProxyRequests off

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://cyyun.com>
BalancerMember ajp://192.168.122.102:8009 route=node1 loadfactor=1
BalancerMember ajp://192.168.122.105:8009 route=node2 loadfactor=1
#ProxySet stickysession=JSESSIONID
ProxySet stickysession=ROUTEID
#byrequests(default),bytraffic,bybusyness
ProxySet lbmethod=bytraffic
ProxySet nofailover=On
</Proxy>

ProxyPass /upload !
ProxyPass /balancer !
ProxyPass / balancer://cyyun.com/
ProxyPassReverse / balancer://cyyun.com/

<Location /balancer>
SetHandler balancer-manager
Proxypass !
Order allow,deny
Allow from all
</Location>

<Proxy *>
Order allow,deny
Allow from all
</Proxy>

<Location />
Order allow,deny
Allow from all
</Location>

新增tomcat主要就是BalancerMember這行,loadfactor值越高,在負載均衡中權重就越大。負載均衡是需要考慮session的問題。

如果不需要負載均衡,使用僅僅需要熱備,修改BalancerMember ajp://192.168.122.105:8009 route=node2 loadfactor=1成BalancerMember ajp://192.168.122.105:8009 route=node2 status=+H 。

參考網址:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/