008 软负载均衡器LVS+DR模式(常用)

DR(直接路由)

架构图

工作方式
       上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了。
工作流程:
1. 首先用户用CIP请求VIP
2. 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让RealServer 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer;
3. 当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台RealServer上去,假如说此时根据调度算法的结果,会将请求负载到RealServer 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去;
4. 当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户。

部署实践:
1. Director Server 配置:

# 配置LVS虚拟IP
ifconfig eth0:0 192.168.13.203/24 up
# 添加主机路由
route add -host 192.168.13.203 dev eth0
route -n
# 设置 utp和tcp的超时 tcp tcpfin udp
ipvsadm --set 30 5 60
#定义一个集群服务
ipvsadm -A -t 192.168.13.203:80 -s rr

【注意:DR模型是通过修改MAC地址来实现请求的转发,就无法实现基于IP和端口的转发,无法改变目标地址的端口,所以此处设置端口,无论配置什么,最后都为80】
#添加RealServer并指派调度算法为NAT
ipvsadm -a -t 192.168.13.203:80 -r 192.168.13.48:80 -g
#添加RealServer并指派调度算法为NAT
ipvsadm -a -t 192.168.13.203:80 -r 192.168.13.49:80 -g
#查看ipvs定义的规则列表
ipvsadm -L -n

发起请求:无法访问

查看请求是否到达LVS:已到达

2. 在Real Server1 和Real Server2上做以下配置

# 抑制ARP
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
#以上命令需填加到/etc/rc.local文件中让其开机自动生效
# ifdown lo:0
# ifup lo:0
ifconfig lo:0 192.168.13.203/32 up
route add -host 192.168.13.203 dev lo:0
# echo "route add -host 192.168.13.203 dev lo:0" >> /etc/rc.local

3. Director操作脚本

#!/bin/bash
#
# LVS script for VS/DR
# . /etc/rc.d/init.d/functions #
VIP=192.168.13.203
RIP1=192.168.13.48
RIP2=192.168.13.49
PORT=80
#
case "$1" in
start)
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.0 up
/sbin/route add -host $VIP dev eth0:0
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.13.203 port 80
# In this recipe, we will use the round-robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s wlc
# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
/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 eth2: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

 

4. RealServer脚本

#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
# . /etc/rc.d/init.d/functions
VIP=192.168.13.203
host=`/bin/hostname`
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.0 up
/sbin/route add -host $VIP dev lo:0
;;
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
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ ! "$islothere" -o ! "isrothere" ];then
# Either the route or the lo:0 device
# not found. echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;; esac

 

4.3 TUN(隧道)
       TUN的工作机制跟DR一样,只不过在转发的时候,它需要重新包装IP报文。这里的real server离得都比较远。用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但director和real server并不在同一个网络上,这时候就用到隧道了,Director进行转发的时候,一定要记得CIP和VIP不能动。
我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。这种方式需要所有的服务器支持"IP Tunneling"(IP Encapsulation)协议。

NGINXHAPROXYLVS适用场景:

网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。

网站并发达到一定程度之后(并发万级,pv千万),为了提高稳定性和转发效率,可以使用LVS、毕竟LVSNginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对维护人员的要求也会更高,投入成本也更大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值