• 运维特工,战胜心魔!!
  • 有些事情其实没有那么难,只是我们感觉难,走出第一步!
  • 你所浪费的今天,是昨天死去的人奢望的明天!!!
  • 欢迎访问 unixfbi.com 运维特工社区http://unixfbi.com/
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 运维特工:http://www.unixfbi.com
  • 人生没有白走的路,每一步都算数!!
  • 空杯心态,沉淀自己!

LVS-DR模式介绍与搭建

LVS unixfbi 1年前 (2018-03-30) 30727次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

LVS-DR 模式介绍与搭建

一、LVS-DR 模式介绍

1.VS/DR 介绍

VS/DR(Virtual Server via Direct Routing)

也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与 VS/NAT 和 VS/TUN 中的一样,但它的报文转发方法又有不同,DR 模式将报文直接路由给目标 Real Server。在 VS/DR 中,调度器根据各个 Real Server 的负载情况,动态地选择一台 Real Server,不修改也不封装 IP 报文,而是将请求的数据帧的 MAC 地址改为选出 Real Server 的 MAC 地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的 MAC 地址是选出的 Real Server,所以 Real Server 肯定可以收到这个数据帧,从中可以获得该 IP 报文。当 Real Server 发现报文的目标地址 VIP 是在本地的网络设备上,Real Server 处理这个报文,然后根据路由表将响应报文直接返回给客户。

VS/DR 方式是通过改写请求报文中的 MAC 地址部分来实现的。Director 和 Real Server 必需在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的 HUB 相连,中间没有隔有路由器。 Real Server 上绑定的 VIP 配置在各自 Non-ARP 的网络设备上(如 lo 或 tunl),Director 的 VIP 地址对外可见,而 Real Server 的 VIP 对外是不可见的。Real Server 的地址即可以是内部地址,也可以是真实地址。

原理可以简述为:VS/DR 是通过改写请求报文的 MAC 地址,将请求发送给真实服务器,而真实服务器将响应后的处理结果直接返回给客户端用户。同 VS/TUN 技术一样,VS/DR 技术可极大地 提高集群系统的伸缩性。而且,这种 DR 模式没有 IP 隧道的开销,对集群中的真实服务器也没有必须支持 IP 隧道协议的要求,但是要求调度器 LB 与真实服务器 RS 都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。

LVS-DR 模式原理架构图
LVS-DR 模式介绍与搭建

VS/DR 工作流程
LVS-DR 模式介绍与搭建
VS/DR 工作流程:它的连接调度和管理与 VS/NAT 和 VS/TUN 中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在 VS/DR 中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装 IP 报文,而是将数据帧的 MAC 地址改为选出服务器的 MAC 地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的 MAC 地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该 IP 报文。当服务器发现报文的目标地址 VIP 是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

在 VS/DR 中,请求报文的目标地址为 VIP,响应报文的源地址也为 VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。

VS/DR 负载调度器也只处于从客户到服务器的半连接中,按照半连接的 TCP 有限状态机进行状态迁移。

2.DR 和 RS 处理和响应请求的流程

DR 处理请求

(1)用户请求经过互联网到达路由器时,路由器做 arp 广播,VIP 机器的 MAC 地址是多少? ,然后 director 收到 arp 广播后,进行回应,此时路由器知道了 VIP 地址机器的 MAC 地址,然后把数据包发给 director 机器。
(2)请求达到 director 机器后,源 IP 和目标 IP 不变(源 IP 还是 CIP 目标 IP 还是 VIP ),director 发送广播报文,寻找绑定 VIP 的 realserver 的 MAC 地址,RealServer 响应后,director 得到 RealServer 的 MAC 地址,然后把数据包给交换机,交换机转发给 RealServer。
(3)其实是 director 重新封装报文,源 MAC 是 director 的 MAC 地址,目的 MAC 是 RealServer 的 MAC 地址,RS 收到请求数据包后进行拆包,发现源 IP 是用户的 IP,目标 IP(VIP)是本机,所以把数据包直接给用户

RS 处理和响应
RS 接受请求:数据包进到 RS 后,首先是数据从 RIP 的物理网卡接口进来, 转发给 lo 接口,然后 lo 再转发给用户的应用程序

响应请求:响应报文一定从 RS 的 RIP 接口的物理网卡出来。强行让报文响应时经过 lo 接口,报文的源 IP 就变成了 lo 接口上的 IP 即 127.0.0.1,所以在主机上设置一个路由,要求从 lo 哪个别名进来就要从哪个 lo 别名出去,所以这时源 IP 就改成了 VIP,然后报文经过 RIP 的物理网卡接口出去。
响应时,源地址是 VIP,目标地址是 CIP。源 MAC 地址是 RS 所在的物理网卡的 MAC 地址,目标 MAC 是下一个网关路由器的 MAC(看我们选择的是走哪个路由)

3.关于 VS/DR 模式我们需要明白的问题

(1) Director 和 RealServer 上都配置了 VIP,那么路由器 arp 广播时,RealServer 会不会响应 arp 广播请求?
答:RealServer 不会响应 arp 广播请求,RealServer 只能响应 director 的请求。

(2) VIP 和路由器的关系?
答:VIP 要和路由器的 IP 在同一个网络中。

(3)RealServer 上怎么配置 RIP 和 VIP?
答:在 RealServer 上 RIP 配置在物理网卡上,VIP 配置在 lo 上,这里有一个原则:从哪个网卡进来的数据包,就要从哪个网卡上出去,也就是说从 RIP 出去。封装报文时封装成 lo 的地址。源 IP 不能是 RIP,必须是 VIP。所以需要重新封装报文时把 VIP 封装成源 IP。数据包从 RIP 网卡进来,所以只能从 RIP 网卡的把数据包传出去。

(4)互联网用户请求过程中源 IP 和目标 IP 的变化过程?
互联网上用户请求,如果中间不经过 nat 的话,源 IP 和目标 IP 是不会变的,只是变了 MAC 地址;

(5)VIP,DIP,RIP 是否可以在一个网段中吗?
答:VIP 必须是公网 IP;
DIP 可以是公网 IP 也可以是私网 IP;
建议 DIP 和 RIP 在同一个网络中,但是只是要求在同一个网络中,不要求在同一个网段中,也可以不在同一个交换机中,只要 Director 和 RealServer 之间没有路由器隔开就行,否则 RealServer 没法收到 director 的广播报文了。

路由器的 IP 要和 VIP 在同一个网段中,否则路由器和 VIP 没法路由通信了。

(6)RIP 是私网 IP 地址,是怎么响应请求的?
如果 RIP 是私网 IP,那么路由器上应会有另外一个端口作为 RealServer 的网关,因为路由器的一个端口已经和 VIP 在一个网段了。

(7)RealServer 是否可以使用自己配置的 VIP 与外网主机通信?
答:RealServer 上的 VIP 是不能和外网通信的。因为 RealServer 必须把自己的 VIP 隐藏起来,所以 RealServer 上的 VIP 是不能和外网通信的,否则 RealServer 也会收到路由器的 arp 广播。

4.关于抑制 arp 的问题

主要是两个参数:arp_ignorearp_announce
arp_ignore:定义是否响应 arp 广播请求。
因为 DR 模式下,每个真实服务器节点都要在环回网卡上绑定虚拟服务 IP。这时候,如果客户端对于虚拟服务 IP 的 arp 请求广播到了各个真实服务器节点,如果 arp_ignore 参数配置为 0,则各个真实服务器节点都会响应该 arp 请求,此时客户端就无法正确获取 LVS 节点上正确的虚拟服务 IP 所在网卡的 MAC 地址。假如某个真实服务器节点 A 的网卡 eth1 响应了该 arp 请求,客户端把 A 节点的 eth1 网卡的 MAC 地址误认为是 LVS 节点的虚拟服务 IP 所在网卡的 MAC,从而将业务请求消息直接发到了 A 节点的 eth1 网卡。这时候虽然因为 A 节点在环回网卡上也绑定了虚拟服务 IP,所以 A 节点也能正常处理请求,业务暂时不会受到影响。但时此时由于客户端请求没有发到 LVS 的虚拟服务 IP 上,所以 LVS 的负载均衡能力没有生效。造成的后果就是,A 节点一直在单节点运行,业务量过大时可能会出现性能瓶颈。

这个参数有 8 个值,但我们只使用了 2 个
0:默认值,不管哪块网卡接收到了 ARP 请求,只要发现本机有这个 MAC 都给与响应。
1:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了 ARP 请求,发现所请求的 MAC 是本机另一块网卡的,这个时候接收到 ARP 请求的这块网卡就一定不响应,只有发现请求的 MAC 是自己的才给与响应。

arp_announce:是否接收别人的通告,并记录别人的通告。以及我们是否通告给别人。

每个机器或者交换机中都有一张 arp 表,该表用于存储对端通信节点 IP 地址和 MAC 地址的对应关系。当收到一个未知 IP 地址的 arp 请求,就会再本机的 arp 表中新增对端的 IP 和 MAC 记录;当收到一个已知 IP 地址(arp 表中已有记录的地址)的 arp 请求,则会根据 arp 请求中的源 MAC 刷新自己的 arp 表。
  如果 arp_announce 参数配置为 0,则网卡在发送 arp 请求时,可能选择的源 IP 地址并不是该网卡自身的 IP 地址,这时候收到该 arp 请求的其他节点或者交换机上的 arp 表中记录的该网卡 IP 和 MAC 的对应关系就不正确,可能会引发一些未知的网络问题,存在安全隐患。
  所以 DR 模式下要求 arp_announce 参数要求配置为 2。
有三个值:
0:默认值,不管哪块网卡接收到了 ARP 请求,只要发现本机有这个 MAC 都给与响应。
1:尽量避免响应 ARP 请求中 MAC 不是本网卡的,一个主机有多块网卡,其中一块网卡接收到了 ARP 请求,发现所请求的 MAC 是本机另一块网卡的,这个时候接收到 ARP 请求的这块网卡就尽量避免响应。
2:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了 ARP 请求,发现所请求的 MAC 是本机另一块网卡的,这个时候接收到 ARP 请求的这块网卡就一定不响应,只有发现请求的 MAC 是自己的才给与响应。

我是这样设置的:

# echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore      
# echo 1  > /proc/sys/net/ipv4/conf/eth0/arp_ignore        
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

二、LVS-DR 模式搭建

1.环境信息介绍

LVS-DR 模式介绍与搭建

搭建架构图
LVS-DR 模式介绍与搭建

软件版本:

名称 版本
系统 CentOS Linux release 7.2.1511 (Core)
IPVS v1.2.1
ipvsadm v1.27

2.RS1 配置

配置抑制 arp:

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore    
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore    
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 

配置 VIP:

# ifconfig lo:0 192.168.199.149/32 broadcast 192.168.199.149 up
# route add -host 192.168.199.149 dev lo:0
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.199.1   0.0.0.0         UG    100    0        0 eth0
192.168.199.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.199.149 0.0.0.0         255.255.255.255 UH    0      0        0 lo

安装 web 软件 nginx:

# yum install nginx 
# echo "RS-node1" > /usr/share/nginx/html/index.html 
# curl 192.168.199.151/
RS-node1

3.RS2 配置

配置抑制 arp:

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore    
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore    
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 

配置 VIP:

# ifconfig lo:0 192.168.199.149/32 broadcast 192.168.199.149 up
# route add -host 192.168.199.149 dev lo:0
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.199.1   0.0.0.0         UG    100    0        0 eth0
192.168.199.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.199.149 0.0.0.0         255.255.255.255 UH    0      0        0 lo

安装 web 软件 nginx:

# yum install nginx 
# echo "RS-node2" > /usr/share/nginx/html/index.html  
# curl 192.168.199.152/
RS-node2

4.DR 配置

配置 VIP:

# ifconfig eth0:0 192.168.199.149/32 broadcast 192.168.199.149 up
# route add -host 192.168.199.149 dev eth0:0
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.199.1   0.0.0.0         UG    100    0        0 eth0
192.168.199.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.199.149 0.0.0.0         255.255.255.255 UH    0      0        0 eth0

配置 LVS:

# ipvsadm -A -t 192.168.199.149:80 -s rr 

添加两台 RS:

# ipvsadm -a -t 192.168.199.149:80 -r 192.168.199.151 -g 
# ipvsadm -a -t 192.168.199.149:80 -r 192.168.199.152 -g 
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.199.149:80 rr
  -> 192.168.199.151:80           Route   1      0          0         
  -> 192.168.199.152:80           Route   1      0          0  

测试:

 for i in `seq 1 10`; do curl http://192.168.199.149/ ;done
RS-node1
RS-node2
RS-node1
RS-node2
RS-node1
RS-node2
RS-node1
RS-node2
RS-node1
RS-node2

5.编写一键配置脚本

LVS-DR 一键配置脚本:

# cat lvs-dr.sh 
#!/bin/bash 
vip=192.168.199.149
dev=eth0:0
port=80
rs1=192.168.199.151
rs2=192.168.199.152

scheduler=rr
type='-g'

case $1 in
        start)
                /usr/sbin/ifconfig $dev $vip/32 broadcast $vip up
                ipvsadm -A -t $vip:$port -s $scheduler 
                ipvsadm -a -t $vip:$port -r $rs1 $type 
                ipvsadm -a -t $vip:$port -r $rs2 $type
                ipvsadm -L -n
                echo "The LVS DR is Ready!"
                ;;
        stop)
                ipvsadm -C
                /usr/sbin/ifconfig $dev down
                ipvsadm -L -n
                echo "The LVS DR is Canceled!"
                ;;
        *)
                echo "Usage:$(basename $0) start|stop"
                exit 1
                ;;

esac

RS 一键配置脚本:

# cat lvs-rs.sh 
#!/bin/bash
vip=192.168.199.149
dev=lo:0

case $1 in 
        start)
                echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore    
                echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore    
                echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
                echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
                /usr/sbin/ifconfig $dev $vip/32 broadcast $vip up
                /usr/sbin/route add -host $vip dev $dev
                /usr/sbin/route -n
                echo "The Real Server is Ready!"
                ;;
        stop)
                /usr/sbin/ifconfig $dev down
                echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore    
                echo 0 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
                echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce 
                echo 0 > /proc/sys/net/ipv4/conf/eth0/arp_announce
                echo "The Real Server is Canceled!"
                ;;
        *)
                echo "Usage:$(basename $0) start|stop"
                exit 1
                ;;
esac

参考文档:
http://www.linuxvirtualserver.org/Documents.html
http://zh.linuxvirtualserver.org/node/28
http://zh.linuxvirtualserver.org/node/29
http://www.linuxvirtualserver.org/zh/lvs3.html
http://blog.51cto.com/ghbsunny/1975813
https://blog.csdn.net/liupeifeng3514/article/details/79038451
https://blog.csdn.net/liupeifeng3514/article/details/79038577
https://blog.csdn.net/brad_chen/article/details/47807281
https://www.cnblogs.com/lipengxiang2009/p/7451050.html
http://blog.51cto.com/wuhf2015/1654648

本文出自 “运维特工” 博客,转载请务必保留原文链接 和 http://www.unixfbi.com


UnixFBI 运维特工 , 版权所有丨如未注明 , 均为原创丨 转载请务必注明原文链接http://www.unixfbi.com/418.html
喜欢 (8)
[支付宝]
分享 (0)
unixfbi
关于作者:
运维工程师一枚,做有价值的事情!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址