实现负载均衡有很多种方式,土豪直接F5,性能最好,价格最贵
没钱也可以使用Apache,Nginx 工作在网络的第四层,虽然性能一般,但是很灵活,比如可以将80端口映射到真实服务器的8080端口.
还有一种选择LVS ,它工作在网络的第三层,性能较好,非常稳定.但是它不能实现端口的重新映射.因为在网络的第三层,并不清楚端口的信息。
下面的实验搭建了一个LVS负载均衡测试环境,采用DR的方式。
LVS-NAT+ipvsadm实现RHEL 5.7上的服务集群
Linux虚拟服务器LVS-NAT 和 LVS-DR 模型的实现
客户端访问LVS前置机
这个请求如下
源MAC(client mac) 目标MAC(DR mac) 源IP(client IP) 目标IP(DR IP,VIP)
LVS前置机会将报文改写之后转发真实的服务器
改写如下
源MAC(client mac) 目标MAX(真实服务器MAC) 源IP(client IP) 目标IP(DR IP,VIP)
因为真实的服务器将VIP绑定到了环回地址,所以会处理这个请求,并返回响应的报文.
网络层的源目对掉
源MAC(真实服务器MAC) 目标MAC(client mac) 源IP(DR IP,VIP) 目标IP(client IP)
所以LVS DR的本质就是网络层的欺骗。
实验采用VirtualBox虚拟机,并且配置内部网络,关闭SELinux和防火墙
首先,在LVS DR前置机上安装ipvsadm命令
yum install ipvsadm -y
然后配置两台真实服务器(RealServer)的Http服务
yum install httpd -y
service httpd start
chkconfig httpd on
并分别改写/var/www/html/index.html的内容为"real server 1"和"real server 2"
然后在两台真实服务器上执行如下的脚本
vim lvs_real.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.16.199
source /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_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 $SNS_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
最后,在DR前置机上执行如下脚本
vim lvs_dr.sh
#!/bin/bash
VIP1=192.168.16.199
RIP1=192.168.16.3
RIP2=192.168.16.4
case "$1" in
start)
echo " start LVS of DirectorServer"
/sbin/ifconfig eth1:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 broadcast $VIP1 up
/sbin/route add -host $VIP1 dev eth1:0
echo "1" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP1:80 -s rr
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g -w 1
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth1:0 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
通过client访问LVS前置服务器,可以看到已经实现了负载均衡的效果。