lvs配置脚本 (参数:2:start/stop)
#/etc/rc.d/init.d/functions
case "$2" in
start)
ifconfig lo:0 "$1" netmask 255.255.255.255 broadcast "$1"
/sbin/route add -host "$1" 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 "$1" >/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
lvs+keepalived主备机同时做工作机,备用节点负载不到数据的问题
原因:当客户端发送数据包给 VIP .比如我们的 Director1 (Master 主)这个接口正在工作,这时 LVS 能接收到这个包,然后根据 keepalived 的配置进行 load balance .这时 Director1 会使用 LVS-DR 的功能给包路由给自己或者 Director2 (Backup).这时有个问题.在这个例子中因为我们使用了keepalived .这时 Director2 这台是一台 VIP 的备份服务器.会立即启动使用 ipvsadm 的规则来配置这台服务器做备份的处理.来使得更快的故障转移.所以这些规则 Director2 主机都会存在.这就有问题了.当从 Director1 (Master 主),比如使用 rr .会转发大约 50% 的包从 Director1 到 Director2 (Backup)的 514 的端口.这时因为 Director2 因为这些 LVS-DR 的配置规则会接着给这些包做一次 load balance .又发回去给 Director1.这时会产生一个死的循环.
解决方案:给进入 eth0 的包打包 mark 的标记,当数据包是发给 VIP:514 并且 MAC 不其它 LVS 服务器的话. 才做个 mark ,这样才会对指定的 fwmark 进行 loadbalance 放入到 LVS 中处理.只要数据包是从任意其它的 MAC 地址(非 LVS 的转发)会被发往 VIP:port, 会不在进行 loadbalanced 而是直接转给后面监听的 demon 程序进行应用的处理.实际就是我们使用 iptables 来对进入的流量设置 MARK.然后配置 keepalived 只处理有 MARK 过的流量.不在使用以前绑定 VIP 和端口
步骤:
在LVS 1上执行
iptables -t mangle -I PREROUTING -d VPORT -m mac ! --mac -source VIP 为VIP地址
MAC_Director2 是备机的MAC (keepalived 之间互相监听的那块网卡)
在LVS2上执行
iptables -t mangle -I PREROUTING -d VPORT -m mac ! --mac -source $MAC_Director1 -j MARK --set -mark 0x4
VPORT 为服务端口
$MAC_Director1 是主 的MAC (keepalived 之间互相监听的那块网卡)
若以上步骤执行报错iptables v1.4.7: Bad mac address "--source",将--mac -source 之间的空格去掉就可以
然后改下LVS1 的keepalived配置文件 #主
vrrp_instance VIP_1 {
interface eth0
state MASTER
virtual_router_id 55
priority 100
virtual_ipaddress {
192.168.20.160
}
}
virtual_server fwmark 3 8080 { ####fwmark 3 为刚才用iptables打的标签
delay_loop 3
lb_algo rr
lb_kind DR
protocol UDP
sorry_server 127.0.0.1 8080
real_server 192.168.20.135 8080 {
UDP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.20.136 8080 {
UDP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
然后改下LVS2 的keepalived配置文件 #备
vrrp_instance VIP_1 {
interface eth0
state BACKUP
virtual_router_id 55
priority 80
virtual_ipaddress {
192.168.20.160
}
}
virtual_server fwmark 4 80 { ###fwmark 4 为刚才用iptables打的标签
delay_loop 3
lb_algo rr
lb_kind DR
protocol UDP
sorry_server 127.0.0.1 8080
real_server 192.168.20.135 8080 {
UDP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.20.136 8080 {
UDP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
网友评论