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,数据包是下面这样的。
@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、关闭所有机器的防火墙,测试时先关闭,测试通过后在开启固定端口。
添加一个虚拟服务并制定调度算法 -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地址
启动 ./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
参考文章:
ARP协议: http://blog.chinaunix.net/uid-13423994-id-5146098.html
- LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例
- LVS-NAT(Virtual Server via NAT)原理说明与配置用例
- LVS-TUN(Virtual Server via IP Tunneling)原理说明与配置用例
- LVS 之Direct Routing原理
- LVS:DR模式(Direct Routing)部署实验
- LVS(Linux Virtual Server)原理介绍与简单配置
- DR(Direct Routing)介绍
- VS/DR(直接路由,Direct Routing, DR)
- LVS/DR RSP配置loopback device原理
- LVS/DR RSP配置loopback device原理
- LVS-DR 原理
- 配置 LVS DR模式
- LVS/DR配置笔记
- LVS DR模式配置
- lvs-dr配置
- Linux lvs DR配置
- LVS-DR-service配置
- LVS-DR配置篇
- sicily Message Flood STL中set和map的应用
- 二分搜索
- 设计模式-适配器模式
- boost学习之asio—chat
- 数据库系统概论 第1章--绪论--第2节-数据模型
- LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例
- ServletConfig与ServletContext对象详解
- ruby:json
- Nginx配置文件详解
- java容器之Map
- windows上memcache无法设置缓存
- Java eclipse中无法查看源代码
- 双向循环链表
- CVPR 2016-12-21