本文共 4712 字,大约阅读时间需要 15 分钟。
什么是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-NATLVS-NAT
网络拓扑原理1、用户请求到达director之后,director将请求报文的目的地址(即VIP)改成选定的realserver地址,同时将报文的目标端口也改成选定的realserver的相应端口,最后将报文请求发送到指定的realserver。2、realserver接收到报文后,进行业务处理,在服务器端得到数据后,realserver将数据返给director,而director将报文的源地址和源端口改成VIP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。特点1、所有的realserver和director要在同一个网段内2、RIP是私有地址,仅用于集群节点之间进行通信3、director同时处理请求和应答数据包4、realserver的网关要指向DIP5、可以实现端口映射6、readlserver可以是任意操作系统7、director很可能成为系统性能瓶颈IP规划DR虚拟机RS虚拟机RS配置相当简单,只需要将网关配置为DIPDR配置脚本#!/bin/bash VIP=192.168.54.200DIP=192.168.54.201RIP1=192.168.54.202 RIP2=192.168.54.203NETWORK=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/DRVIP=192.168.54.200DIP=192.168.54.201RIP1=192.168.54.202RIP2=192.168.54.203NETWORK=enp0s3PORT=80 case "$1" instart) /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 serverVIP=192.168.54.200DIP=192.168.54.201RIP1=192.168.54.202RIP2=192.168.54.203NETWORK=enp0s3PORT=80 case "$1" instart) # 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上可以正常负载两次响应的结果不同转载地址:http://lbqko.baihongyu.com/