lvs-keepalived_Heartbeat_centos
...
http://sheriy.com/2011/11/14/lvs-keepalived-and-haproxy-heartbeat-difference/
lvs的是通过vrrp协议进行数据包转发的,提供的是4层的负载均衡。特点是效率高,只要你机器网卡抗的住就不是问题。
haproxy可以提供4层或7层的数据转发服务,能做到7层的好处是可以根据服务所处的状态等进行负载。以上两者只是实现了负载均衡,但是他们本身是明显的单点故障,因此需要使用双机软件做热备,来保证高可用性。keepalived可以通过检测vrrp数据包来切换,因此更适合与lvs搭配。而heartbeat更适于和haproxy搭配。这样就出现了这两个应用比较多也比较经典的负载均衡的高可用性方案了。
部署:
LVS-MASTER : 192.168.1.2
LVS-BACKUP : 192.168.1.3
LVS-VIP : 192.168.1.4
Realserver-1 : 192.168.1.5
Realserver-2 : 192.168.1.61. 系统采用最小化安装
2. 安装ipvsadm
# yum install ipvsadm3. 安装keepalived前提
# yum install -y wget
# yum install -y gcc gcc-c++ make
# yum install -y openssl-devel kernel-devel4. 安装keepalived
# wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz
# ln -s /usr/src/kernels/2.6.18-194.26.1.el5-i686 /usr/src/linux
# tar zxvf keepalived-1.2.1.tar.gz
# cd keepalived-1.2.1
# ./configure
(注意这个步骤要看到以下字样才是正常的)
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
# make && make install5. 配置
# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/sbin/keepalived /usr/sbin/
# chkconfig --add keepalived
# chkconfig --level 2345 keepalived on# vi /etc/keepalived/keepalived.conf
01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061! Configuration File for keepalived
global_defs {
notification_email {
fjcyz@qq.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l=document.getElementById("__cf_email__");a=l.className;if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>
}
notification_email_from fjcyz@qq.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l=document.getElementById("__cf_email__");a=l.className;if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>
smtp_server 127.0.0.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 备份LB将MASTER改为BACKUP
interface eth0
virtual_router_id 51
priority 100 # 优先级,备份LB值改为比这个值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.4 # 多个VIP换行写
}
}
virtual_server 192.168.1.4 80 {
delay_loop 6 #每隔6秒查询realserver状态
lb_algo wrr # LVS 算法
lb_kind DR # LVS模式 DR是直接路由
persistence_timeout 60 #同一IP连接60秒内分配到同一台realserver
protocol TCP #TCP协议检测realserver状态
real_server 192.168.1.5 80 {
weight 3 #权重
TCP_CHECK {
connect_timeout 10 #10秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.6 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
6. Realserver主机上执行以下脚本
0102030405060708091011121314151617181920212223242526272829303132#!/bin/bash
VIP=192.168.1.4
.
/etc/rc
.d
/init
.d
/functions
case
"$1"
in
start)
ifconfig
lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route
add -host $VIP dev lo:0
echo
"1"
>
/proc/sys/net/ipv4/conf/lo/arp_ignore
echo
"2"
>
/proc/sys/net/ipv4/conf/lo/arp_announce
echo
"1"
>
/proc/sys/net/ipv4/conf/all/arp_ignore
echo
"2"
>
/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >
/dev/null
2>&1
echo
"RealServer Start OK"
;;
stop)
ifconfig
lo:0 down
route del $VIP >
/dev/null
2>&1
echo
"0"
>
/proc/sys/net/ipv4/conf/lo/arp_ignore
echo
"0"
>
/proc/sys/net/ipv4/conf/lo/arp_announce
echo
"0"
>
/proc/sys/net/ipv4/conf/all/arp_ignore
echo
"0"
>
/proc/sys/net/ipv4/conf/all/arp_announce
echo
"RealServer Stoped"
;;
*)
echo
"Usage: $0 {start|stop}"
exit
1
esac
exit
0
7. 检查测试
主备LB上执行
# service keepalived start
# ipvsadm -ln
检查ipvsadm是否服务正常再把主LB执行
# service keepalived stop
查看备LB是否会自动接管VIP另外就是做Realserver停止服务的测试,具体就不详说了.
=======================================================================
http://blog.onovps.com/archives/centos-lvs-keepalived.html
LVS IP信息:
1 2 3 4 5 主LVS:192.168.1.2 备LVS:192.168.1.3 虚拟IP:192.168.1.6 应用服务器1:192.168.1.12 应用服务器2:192.168.1.13
查看内核是否支持LVS模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 modprobe -l |grep ipvs /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko /lib/modules/2.6.18-274.17.1.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
根据内核版本下载安装相应的ipvsadm:
1 2 3 4 5 6 ln -s /usr/src/kernels/2.6.18-274.17.1.el5-x86_64/ /usr/src/linux wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz tar zxvf ipvsadm-1.24.tar.gz cd ipvsadm-1.24 make make install
也可使用yum直接安装:
1yum install ipvsadm
安装Keepalived:
1 2 3 4 5 6 7 wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz tar zxvf keepalived-1.1.19.tar.gz cd keepalived-1.1.19 ./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.18-274.17.1.el5-x86_64/ make make install ln -s /usr/local/sbin/keepalived /sbin/keepalived
主LVS配置keepalived:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ! Configuration File for keepalived global_defs { notification_email { admin@onovps.com } notification_email_from Alexandre.Cassen@firewall.loc 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.1.6 } } virtual_server 192.168.1.6 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.1.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.13 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
启动keepalived,同时会在主LVS绑定VIP:
1 2 3 4 5 6 /etc/init.d/keepalived start ip add show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:e7:cc:3b brd ff:ff:ff:ff:ff:ff inet 192.168.1.3/24 brd 192.168.1.255 scope global eth0 inet 192.168.1.6/32 scope global eth0
查看当前LVS参数:
1 2 3 4 5 6 7 ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.6:http rr -> 192.168.1.12:http Route 1 0 0 -> 192.168.1.13:http Route 1 0 0
复制主keepalived到备LVS,修改以下参数:
1 2 state BACKUP priority 90
应用服务器增加虚拟VIP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/bin/bash VIP=192.168.1.6 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $SNS echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
测试LVS故障切换,停止主LVS上keepalived服务:
1 /etc/init.d/keepalived stop
查看备LVS已经接管为主LVS:
1 2 3 4 5 tail -n 10 /var/log/message Jul 14 20:30:28 centos5 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE Jul 14 20:30:29 centos5 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE Jul 14 20:30:29 centos5 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs. Jul 14 20:30:29 centos5 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.6
应用服务器故障测试,停止其中之一httpd服务:
1 /etc/init.d/httpd stop
查看keepalved日志已将出错服务器移除并邮件报警:
1 2 3 4 tail -n 10 /var/log/message Jul 14 21:36:18 centos5 Keepalived_healthcheckers: TCP connection to [192.168.1.12:80] failed !!! Jul 14 21:36:18 centos5 Keepalived_healthcheckers: Removing service [192.168.1.12:80] from VS [192.168.1.6:80] Jul 14 21:36:18 centos5 Keepalived_healthcheckers: Remote SMTP server [127.0.0.1:25] connected.
1 2 3 4 5 6 ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.6:http rr -> 192.168.1.13:http Route 1 0 0
http://www.wenzizone.cn/?p=287
keepalived程序因为他的配置简单,维护容易而广为各位linuxer使用,蚊子自然也不会放过这么好的一款软件了,关于keepalived的做lvs高可用的文章已经满google都是了,蚊子自然就不在这里赘述了。蚊子这篇文章讲述的是如何只使用两台机器使用keepalived搭建web服务的高可用和负载均衡。
之前在蚊子的《lvs+HA+squid搭建稳定上网服务》一篇文章中,介绍了使用heartbeat,lvs和squid来搭建双机高可用负载均衡的上网服务器,有兴趣的朋友可以对比一下现在这篇和上篇。
一、试验环境
vmware6.0
linux01 192.168.211.128 CentOS release 5.3 (Final)
linux02 192.168.211.129 CentOS release 5.3 (Final)
web:httpd-2.2.3-31.el5.centos
keepalived版本:keepalived-1.1.19.tar.gz
二、安装程序
1、keepalived的安装
首先到http://www.keepalived.org/download.html下载最新的keepalived程序
# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.18-128.el5-i686
# make
# make install# cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
2、web的安装
因为蚊子只是为了实现功能,所以只使用了centos自己的apache,如果默认系统没有按照httpd,使用
# yum –y install httpd
3、ipvsadm的安装
ipvsadm的安装也很简单,如果系统默认没有,则使用
# yum –y install ipvsadm
以上两个步骤在两台机器上是一样的。
三、 配置部分
1、linux01上的配置
1.1、keepalived的配置
编辑/etc/keepalived/keepalived.conf
# vi /etc/keepalived/keepalived.conf ,添加如下内容
! Configuration File for keepalived
global_defs {
notification_email {
admin@example.com
}
notification_email_from admin@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id linux01
}vrrp_instance VI_1 { #定义一个实例
state BACKUP #设置为backup,然后通过priority控制哪台提升为主
interface eth0
virtual_router_id 51
priority 100
nopreempt #在priority高的这台设置这个参数,方便当主恢复后
advert_int 1 #可以自动接管
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.211.110 dev eth0 label eth0:0 #这里使用label标签启用eth0:0
}
}virtual_server 192.168.211.110 80 { #这里往下是定义LVS
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
protocol TCPreal_server 127.0.0.1 80 { #其中一台是本地web服务
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.211.129 80 { #另一台的web服务
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
1.2、web配置
web使用apache默认的配置,唯一修改的就是添加了自己的index.html文件,为了方便之后的测试
# echo “linux01”>/var/www/html/index.html
1.3、关于本机启动回环地址
众所周知,要是用lvs的dr模式,必须在realserver上启动回环地址,所以,搭建两台机器的负载均衡,当然就得在本机也启动相应的回环地址,才能实现所要的功能,脚本如下
# vi /usr/local/bin/startlo
#!/bin/sh
VIP=192.168.211.110
case "$1" in
stop)
# close lo:0 interfaceecho $"Close lo:0 interface"
/sbin/route del -host $VIP dev lo:0
/sbin/ifconfig lo:0 down
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
;;
start)
# start lo:0 interfaceecho $"Start lo:0 interface"
/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up
/sbin/route add -host $VIP dev lo:0
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
;;
*)
echo $"Usage: $0 (start|stop)"
exit 1
;;
esac
但由于keepalived不像heartbeat里有ldirectord来控制回环地址的启动和停止,所以我们需要人为的判断应该在哪台机器上启动回环地址,所以蚊子就写了下面的一个脚本,
# vi /usr/local/bin/check_interface
#!/bin/bash
#
#作者:蚊子
#
#脚本说明:
#本脚本用于判断当前server是否是master
#如果当前server不是master,则启动回环地址
#否则停止回环地址
#
#VIP_interface请根据自己的情况自行设定,这个是VIP接口
#lo_interface请根据自己的情况自行设定,是回环地址接口VIP_interface="eth0:0"
lo_interface="lo:0"i=10
while [ $i != 0 ]
do
/sbin/ifconfig |grep $VIP_interface &>/dev/null
retval=$?
if [ ! $retval -eq 0 ];then
/sbin/ifconfig |grep $lo_interface &>/dev/null
retval=$?
if [ ! $retval -eq 0 ];then
/usr/local/bin/startlo start
fi
else
/sbin/ifconfig |grep $lo_interface &>/dev/null
retval=$?
if [ $retval -eq 0 ];then
/usr/local/bin/startlo stop
fi
fi
i=10
sleep 10
done
2、linux02上的配置
2.1、keepalived的配置
具体的配置这里就不给出了,请参考linux01上的配置,唯一的区别
A、priority的值小于linux01上值,蚊子设置为50
B、在vrrp_instance VI_1的配置中不用设置nopreempt
C、修改realserver部分的ip为本机和另外一台server的ip地址
2.2、web的配置
apache的配置和linux01一样使用默认配置,同意是编辑默认的index.html文件
# echo “linux02”>/var/www/html/index.html
2.3、本地回环地址的设置
这部分内容和linux01上的一样,相关脚本可以拷贝过来直接使用
四、启动测试
到此,一切准备就绪就可以测试了
首先将所有需要的脚本设置可执行权限。依次启动相应的服务
A、# /etc/init.d/httpd start
B、# /usr/local/bin/check_interface &
C、# /etc/init.d/keepalived start
如果没有任何报错,说明服务已经启动,keepalived的日志存放在/var/log/messages中,如果有错误,请自行查看
测试1:当前状态下测试负载均衡情况
方法:打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换
测试2:停止linux01的keepalive,测试负载均衡情况
方法:
A、/etc/init.d/keepalived stop
然后等待几秒可以看到linux01上的lo:0地址已经启动,而linux02上的lo:0已经停止B、打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换
测试3:开启linux01上的keepalived,观察linux01是否切换回master
方法:启动keepalived程序,使用ifconfig观察linux01上已经启动了eth0:0接口,同时lo:0接口停止,linux02上eth0;0接口停止,同时lo:0接口启动
http://yezi.iteye.com/blog/78450
研究了两天的时间终于磕磕绊绊的把lvs配置完成了,下面把过程记录下来备忘。系统环境如下
- server1:192.168.10.165 vip server linux rhel rs3 kernal 2.4.21-37
- server2:192.168.10.162 apache+resin linux rhel rs4 kernal 2.6.9-22
- server3:192.168.10.131 apache+resin linux rhel rs4 kernal 2.6.9-22
- vip:192.168.10.100
- port:7001
下面的安装是在vip server上进行的
1、查看自己的操作系统的内核 #uname -a
2、as3一般用的是2.4.21-37.EL的内核,这个内核已经包括了ipvs的补丁,进行如下的操作就可以3、下面建立一个指向,为了保证ipvsadm安装
4、重新编译和安装ipvsadm
接下来配置VIP服务器
5、配置VIP脚本
接下来重新启动一下 reboot / init 6,启动后运行刚才的脚本,会出现下面的显示,说明配置成功了!
- IP Virtual Server version 1.0.8 (size=65536)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 192.168.8.100:7001 rr
- -> 192.168.36.108:7001 Route 1 0 0
- -> 192.168.8.162:7001 Route 1 0 0
接下来配置realserver
6、配置realserver脚本
分别在两台realserver上运行该脚本,然后重新启动resin和apache,至此配置已经完成了,下面来看看测试的过程
首先在vip server上打开控制台,你会看见lvs的列表:
从这里我们可以看到有两台realserver在后台提供转发后的访问,打开浏览器,输入http://192.168.8.100:7001/xxx,浏览器会返回你访问的web的结果,在打开另外一个浏览器输入同样的地址,返回同样的结果,然后回到控制台看看情况:
- IP Virtual Server version 1.0.8 (size=65536)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 192.168.8.100:7001 rr
- -> 192.168.8.131:7001 Route 1 0 1
- -> 192.168.8.162:7001 Route 1 0 1
发现InActConn变成了1,表示两个服务器都接收到了转发,同时还可以打开apache的log,会发现刚才的web访问已经发送到两台realserver了,表明配置成功了!
ipvsadm命令
下面看看lvs控制台的基本命令