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中的網絡卡配置檔案請根據實際情況進行配置。
[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/