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

        DR模式是互联网使用比较多的一种模式。

DR模式原理图:

LVS DR 配置详解_第1张图片

DR模式原理过程简述:

     VS/DR模式的工作流程图如上图所示,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

DR模式小结:

     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相同的端口提供服务。

官方三种负载均衡技术比较总结表: 

工作模式

VS/NAT

VS/TUN

VS/DR

Real server(节点服务器)

Config dr gw

Tunneling

Non-arp device/tie vip

Server Network

Private

LAN/WAN

LAN

Servernumber(节点数量)

Low 10-20

High 100

High 100

Real server gateway

Load balance

Own router

Own router

优点

地址和端口转换

Wan环境加密数据

性能最高

缺点

效率低

需要隧道支持

不能跨域LAN

 实验环境图:

LVS DR 配置详解_第2张图片

 

 

LVS配置:

# ifconfig eth0:0 10.6.2.195 netmask 255.255.255.255

# route add -host 10.6.2.195 dev eth0:0

# route -n

# yum install -y ipvsadm

# modprobe ip_vs

# ipvsadm -C

# ipvsadm -At 10.6.2.195:80 -s rr

# ipvsadm -at 10.6.2.195 -r 10.6.2.192 -g

# ipvsadm -at 10.6.2.195:80 -r 10.6.2.192 -g

# ipvsadm -at 10.6.2.195:80 -r 10.6.2.191 -g

# ipvsadm -Ln

# watch ipvsadm -Ln

 

Real Server 配置:

# ifconfig lo:0 10.6.2.195 netmask 255.255.255.255

# route add -host 10.6.2.195 dev lo:0

# 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