什么是LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。是LB(load balance)负载均衡的解决方案。
常见的LB有F5、LVS、nginx等,其中F5为硬件解决方案,LVS与nginx都是软件负载均衡解决方案。
LVS工作在四层,nginx工作在七层
LVS的工作模式
LVS的工作模式大致分为4种:NAT(地址转换)、IP TUN(IP隧道)、DR(直接路由)、FULL-NAT
LVS-NAT
网络拓扑
原理
1、用户请求到达director之后,director将请求报文的目的地址(即VIP)改成选定的realserver地址,同时将报文的目标端口也改成选定的realserver的相应端口,最后将报文请求发送到指定的realserver。
2、realserver接收到报文后,进行业务处理,在服务器端得到数据后,realserver将数据返给director,而director将报文的源地址和源端口改成VIP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
特点
1、所有的realserver和director要在同一个网段内
2、RIP是私有地址,仅用于集群节点之间进行通信
3、director同时处理请求和应答数据包
4、realserver的网关要指向DIP
5、可以实现端口映射
6、readlserver可以是任意操作系统
7、director很可能成为系统性能瓶颈
IP规划
DR虚拟机
RS虚拟机
RS配置相当简单,只需要将网关配置为DIP
DR配置脚本
#!/bin/bash
VIP=192.168.54.200
DIP=192.168.54.201
RIP1=192.168.54.202
RIP2=192.168.54.203
NETWORK=enp0s3
case "$1" in
start)
echo "start LVS of DirectorServer NAT"
echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发
/sbin/ifconfig $NETWORK:0 $VIP netmask 255.255.255.0 up #配置VIP
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
/bin/touch /var/lock/subsys/ipvsadm.lock
/sbin/ipvsadm
;;
stop)
echo "stop LVS of DirectorServer NAT"
echo 0 >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig $NETWORK:0 down
rm -rf /var/lock/subsys/ipvsadm.lock
;;
status)
[ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..."
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
注:测试使用的nginx作为http服务器进行测试
当前DR模式按照上面的配置,一直存在一个问题,在DR主机上可以正常负载,但是在宿主机上也就是192.168.54.240这台机器上却无法正常负载。
LVS-DR模式
网络拓扑
原理
1、DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。
2、真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。
特点:
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
IP规划
DR配置脚本
#!/bin/bash
#
# LVS script for VS/DR
VIP=192.168.54.200
DIP=192.168.54.201
RIP1=192.168.54.202
RIP2=192.168.54.203
NETWORK=enp0s3
PORT=80
case "$1" in
start)
/sbin/ifconfig $NETWORK:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev $NETWORK:0
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP:80 -s wrr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
/sbin/ipvsadm -Ln
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop) # Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
/sbin/ifconfig $NETWORK:0 down
/sbin/route del $VIP
/bin/rm -f /var/lock/subsys/ipvsadm
echo "ipvs is stopped..."
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ]; then
echo "ipvsadm is stopped ..."
else
echo "ipvs is running ..."
ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
;; esac
RS配置脚本
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
VIP=192.168.54.200
DIP=192.168.54.201
RIP1=192.168.54.202
RIP2=192.168.54.203
NETWORK=enp0s3
PORT=80
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
systemctl start nginx
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/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
systemctl stop nginx
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;; esac
结果:
在cip上可以正常负载
两次响应的结果不同