最近做一下LVS集群方式的性能对比测试,在配置IP隧道方式时遇到一些诡异的问题:
1) 停止LVS服务后虚拟IP未被释放(似乎只有重启服务器才能释放,重启网卡、清空路由表、重启交换机等方式均无效);
2) 负载不均衡(有时会依次将压力全部压在其中一个成员身上,有时又是正常的);
之前测试“直接路由”方式时是手动配置方式,配置成功并没有发现问题。而这次使用IP隧道方式这么多问题,肯定是配置问题。
官方有介绍一个配置工具:piranha。在CentOS安装光盘也自带有,于是尝试了一下,非常方便!推荐大家使用。毕竟这东西发布了,即使有错也不会错太远,Bug就另谈。谁能确定我们手动配置就没有错也没有Bug呢?
Piranha 提供了一套解决方案,包括对服务状态的监控、业务服务器的监控和负载服务器本身热备。基本结构示意:
安装非常简单:
yum install ipvsadm modcluster piranha system-config-cluster php php-cli php-common
Piranha 是一个WEB服务(Apache+Php),安装完成后需要先设置登录密码:/usr/sbin/piranha-passwd,用户名是piranha 。
1、启动WEB服务:service piranha-gui start
2、启动LVS守护进程:service pulse start
3、可以访问了::3636。
详细配置可参考RedHat官网说明,对LVS稍有了解,搜一下很容易就上手了。
这里我想补充一下RealServer的服务配置。因为Piranha本身提供了Virtual Server本身的配置,但没有提供RealServer的配置。而在网上搜到的一些文章只介绍了RealServer配置方式,不足以批量生产使用。
首先,LVS服务器若修改了配置重启时需要执行以下脚本:
killall -9 nanny
service pulse restart
service piranha-gui restart
若客户端使用直接路由方式,服务脚本如下:
#!/bin/bash
# RealServer服务脚本,直接路由方式
WEB_VIP=192.168.10.31
start(){
ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
/sbin/route add -host $WEB_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 [lvs_dr]"
}
stop(){
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
/sbin/ifconfig lo:0 down
/sbin/route del -host $WEB_VIP
sysctl -p >/dev/null 2>&1
echo "RealServer Stoped [lvs_dr]"
}
restart(){
stop
start
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
/sbin/ifconfig
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
若客户端使用IP隧道方式,服务脚本如下:
#!/bin/bash
# 业务服务器LVS服务脚本,IP隧道方式
WEB_VIP=192.168.10.31
start(){
ifconfig tunl0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
/sbin/route add -host $WEB_VIP dev tunl0
echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/tunl0/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 [lvs_tun]"
}
stop(){
echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig tunl0 down
/sbin/route del -host $WEB_VIP
sysctl -p >/dev/null 2>&1
echo "RealServer Stoped [lvs_tun]"
}
restart(){
stop
start
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
/sbin/ifconfig
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
由于笔者未用到NAT方式,在此不介绍。欢迎广大网友补充。