LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例

来源:互联网 发布:微电影拍摄软件 编辑:程序博客网 时间:2024/06/04 19:31

LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例

LVS-NAT(Virtual Server via NAT)原理说明与配置用例



LVS-DR模式是如何工作的?





用户请求负载均衡服务器(LinuxDirector),当数据封包(数据帧)到达负载均衡服务器后,负载均衡服务器根据调度算法选出一台真实服务器,将数据帧的MAC地址改写为真实服务器的MAC地址,然后发送出去,交换机会根据MAC地址将数据封包发送给真实服务器,真实服务器将处理完的结果直接返回给客户端。


是否感到困惑?让我们用一个实验来理解吧!

注意:在测试之前一定先关闭防火墙

注意:LVS负责均衡服务器与真实服务器必须在相同网段(因为转发是基于数据链层的),客户端随意。

真实服务器  

mac 00:0c:29:4e:80:4a     192.168.80.135:8080

mac 00:0c:29:c6:4e:63     192.168.80.136:8080

负载均衡服务器

mac 00:0c:29:16:0a:e1     192.168.80.138:8080

客户端

mac 00-50-56-C0-00-08    192.168.80.1

网络拓扑图如下:



@1 客户端访问负载均衡服务器192.168.80.138:8080,数据包是下面这样的。


原MAC目标MAC原IP原端口目标IP目标端口00-50-56-C0-00-0800:0C:29:16:0A:E1192.168.80.159345192.168.80.1388080




@2 负责均衡服务器收到数据包后,根据调度算法选择一台真实服务器(假设选了192.168.80.136 00:0c:29:c6:4e:63),接下来将数据帧的目标MAC地址修改为192.168.80.136的MAC地址00:0c:29:c6:4e:63,将原MAC修改为自己的MAC,然后把数据包发出去,数据包是下面这样的。

  原MAC目标MAC原IP原端口目标IP目标端口00:0C:29:16:0A:E100:0C:29:C6:4E:63192.168.80.159345192.168.80.1388080

注意:可以看到LVS只修改 (原MAC) 与 (目标MAC),而目标IP地址并没有被修改,那么当数据包由交换机发送给(192.168.80.136)这台服务器的时候,136这台服务器的网卡会检查目标IP地址是否属于自己本机P地址,如果不是的话就会拒绝处理这个数据包,为了解决这个问题,我们需要在每台真实服务器的环回网卡上配置(192.168.80.138)这个IP为自己的本机IP,这样就可以处理数据包了。




@3 根据数据链层的转发规则,交换机会根据数据帧的mac地址将数据包转发给192.168.80.136   00:0C:29:C6:4E:63,由它来处理用户的请求,处理完成后把数据包直接发送给客户端,数据包如下。



@4 整个的TCP请求数据包抓包,可以看到,由192.168.80.1 发往 192.168.80.138的数据包都是成对出现的,这就是因为LVS收到数据包以后修改了MAC地址再次把数据包发送跟真实服务器,所以数据包全都是成对出现的,每一对数据包只有MAC地址不同。



在CentOS上安装与配置LVS负载均衡

1、在138服务器安装ipvsamd   yum install ipvsadm   可以参考  http://blog.csdn.net/nimasike/article/details/51932674

2、关闭所有机器的防火墙,测试时先关闭,测试通过后在开启固定端口。

3、在LVS负载均衡服务器添加转发规则列表。
添加一个虚拟服务并制定调度算法     -A 添加  -t IP与端口 -s 调度算法一共8种注意:端口一定要与后端服务器端口一一致,因为转发包只修改MAC地址,目标端口不会修改。ipvsadm -A -t 192.168.80.138:8080 -s rr  

添加后端服务器, -g 为DR模式ipvsadm -a -t 192.168.80.138:8080 -r 192.168.80.135:8080 -g -w 1ipvsadm -a -t 192.168.80.138:8080 -r 192.168.80.136:8080 -g -w 1

ipvsadm -S -n 查配置



4、由于我们没有使用VIP,而是直接使用了负载均衡服务器的真实IP,所以需要在LVS负载服务器配置真实服务器的MAC地址。

arp -s 192.168.80.135 00:0c:29:4e:80:4aarp -s 192.168.80.136 00:0c:29:c6:4e:63

备注:上面的设置重启失效,如果希望重启后仍然有效则需要添加一个配置文件

vim /etc/ethers  没有就添加一个。

00:0c:29:4e:80:4a 192.168.80.13500:0c:29:c6:4e:63 192.168.80.136
然后修改 /etc/rc.d/rc.local 这个文件,添加 arp -f 这句话, 最后给文件可执行权限 chmod +x /etc/rc.d/rc.local


可以arp -e看mac地址




5、将192.168.80.138这个IP 配置为真实服务器的换回地址,并设置ARP应答抑制。

启动 ./lvs_real.sh start

停止 ./lvs_real.sh stop

#!/bin/bash  #description : start realserverVIP=192.168.80.138/etc/rc.d/init.d/functionscase "$1" instart)echo " start LVS of REALServer"/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 upecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce;;stop)/sbin/ifconfig lo:0 downecho "close LVS Directorserver"echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announce;;*)echo "Usage: $0 {start|stop}"exit 1esac


arp_ignore  参数是定义linux主机在收到ARP请求数据包后,发送ARP响应数据包的条件级别,该参数的取值范围是0~8,各取值的意义分别是:

0(默认值)-- 只要ARP请求数据包所请求的IP地址属于任一本地地址(即任意一个本机配置的IP地址),就会回应ARP响应数据包,即使该IP地址不属于接收到ARP请求数据包的网卡。
1 -- 只有ARP请求数据包所请求的IP地址属于当前网卡的IP地址,才会回应ARP响应数据包。

2 -- 除了满足1的条件外,还要满足ARP请求数据包的发送方IP地址也属于当前网卡所属子网,这样才会回应ARP响应数据包。

4~7 -- 保留

8 -- 即使ARP请求数据所请求的IP地址属于任何一个本地地址,也不回应ARP响应数据包。

我们设置为1:因为我们把192.168.80.138这个IP设置真实服务器为lo口的环回地址,不能让他应答ARP请求,不然会导致ARP错乱。


arp_announce 默认情况下,它发出去的数据包的原IP地址是138,在发包之前它会先通过ARP请求到客户端的MAC地址,在发送ARP请求数据包的时候,里面的IP地址会用138这个地址,这样就会导致其它主机记录错误的MAC地址列表,实际应该用136这个IP去发送ARP请求。

举个例子:

假设linux主机有A、B两块网卡,其对应的IP地址分别为IP_A、IP_B,对应的MAC地址为MAC_A、MAC_B,假设一个应用程序准备与外部通信,它的socket绑定了源IP地址为IP_A,但是根据系统路由及相关设置,其通信数据包将会从B网卡发送,在发送数据包前,系统会通过网卡B发送ARP请求数据包。如果我们将arp_announce的值设定为0,那该ARP请求数据包的发送方IP地址是IP_A,而发送方MAC地址为MAC_B,这样就会在网络设备或对方主机的ARP地址表上留下IP_A与MAC_B的对应记录,但是实际正确的应该是IP_A对应MAC_A、IP_B对应MAC_B,所以这可能会引起潜在的网络问题,具体问题和表现与网络的拓扑结构及网络配置有关。而如果我们将arp_announce设置为2,那在发送ARP请求数据包时,发送方IP地址将不是IP_A,而是IP_B,这样就不会引起刚才所说的问题。至于arp_announce=1的情景,我还不是很清楚,所以无法举出具体的例子。

所以我们设置为2:这样在发送ARP请求时 虽然原IP用的是138  但实际ARP请求里写的IP是 真实服务器的IP。


6、访问http://192.168.80.138:8080/ 就可以进行负载均衡访问了,可以看到数据包被分发到真实服务器节点上了。



7、通过ipvsadm 命令添加的转发规则列表在重启后会失效,我们可以将其保存到配置文件中

ipvsadm-save -n > /etc/sysconfig/ipvsadm  将配置保存到文件中。

我们还可以做成启动服务,让系统开启自动加载配置文件。(CentOS7),其它版本原理类似。

vim  /lib/systemd/system/ipvsadm.service

[Unit]Description=Initialise the Linux Virtual ServerAfter=syslog.target network.target[Service]Type=oneshotExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"#ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"ExecStop=/sbin/ipvsadm -CRemainAfterExit=yes[Install]WantedBy=multi-user.target



技术交流群:212320390

ifconfig eno16777736:0 192.168.80.138 netmask 255.255.255.255 broadcast  192.168.80.255 up

参考文章:

LVS-DR模式官方文档: http://www.linuxvirtualserver.org/VS-DRouting.html

ARP协议: http://blog.chinaunix.net/uid-13423994-id-5146098.html


0 0
原创粉丝点击