一、LVS-DR集群概述
LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。
1、LVS-DR 工作原理
LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用,节点 Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过 Director Server。为了响应对整个群集的访问,Director Server 与 Real Server 都需要配置 VIP 地址。
工作原理如下图所示:

2、LVS-DR数据包流量分析(同一局域网)
客户端向目标VIP发送请求,负载均衡器接收。
负载均衡器根据负载均衡算法选择后端真实服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为后端真实服务器的MAC地址,然后在局域网上发送
后端真实服务器收到这个帧,解封装后发现目标IP与本机匹配(事先绑定了VIP),于是处理这个报文。随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出
客户端将收到回复报文。客户端认为得到正常的服务,而不会知道是哪一台服务器处理的
如果跨网段,则报文通过路由器经由 internet 返回给用户
3、LVS-DR中的ARP问题
问题一
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址,在局域网中具有相同的IP地址。势必会造成各服务器ARP通信的紊乱
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。
问题二
问题说明:RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址,发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址,路由器收到ARP请求后,将更新ARP表项,原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址。
路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
解决方法:
对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
4、LVS-DR处理问题后的流量分析
客户端发送请求到Director server (负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
Director Server和Real server在同一个网络中,数据通过二层数据链路层来传输。
内核空间判断数据包的目标I是本机VIP,此时IPVS (IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为Director Server的MAC地址,修改目标MAC地址为Real Server的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。
到达Real server的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。
Real Server 直接将响应报文传送到客户端。
5、LVS-DR 特性
Director Server和Real Server必须在同一-个物理网络中。
Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。
Director Server作为群集的访问入口,但不作为网关使用。
所有的请求报文经由Director Server,但回复响应报文不能经过Director Server
Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server。
Real Server上的10接口配置VIP的IP地址。
实验图:针对同网段内的用户访问;(如果是真实环境,那么还有一个路由器设备;)


先为调度器101设置子接口;即VIP;

设置成vip的地址;

然后保存退出,重启网络查看;

修改该主机的内核配置文件;
再末尾添加以下语句;
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
调整内核参数,禁止转发重定向报文。
由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭Linux 内核的重定向。
然后让该语句生效;

然后安装调度器所需的工具;
补充:lvs调度器是针对第四层的;传输层;

配置负载分配策略;
ipvsadm -v
ipvsadm -C
ipvsadm -A -t 192.168.10.172:80 -s wrr
ipvsadm -a -t 192.168.10.172:80 -r 192.168.10.102 -g -w 1
ipvsadm -a -t 192.168.10.172:80 -r 192.168.10.103 -g -w 2
ipvsadm-save

配置web节点服务器;此时就可以开启会话同步了,只针对102&&103;

然后设置VIP给lo网卡的子接口;

DR模式配置中有个关键点是将真实主机上的VIP配置在环回接口上,且掩码必须配置成4个255。
解释掩码为255.255.255.255;即192.168.10.172/32;该地址充当了多重角色;网端是192.168.10.172;主机也是192.168.10.172;广播地址也是192.168.10.172;

然后重启网络;查看;

添加路由条目;因为接收是有真实IP地址192.168.10.102接受的,那么就要路由到192.168.10.172vip地址;

因为此语句是临时生效的,需要写入到文件中实现永久生效;
vim /etc/rc.local
将语句写入即可;

调整web服务器的内核参数;
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

让语句直接生效;sysctl -p

安装web服务;

然后分别写网页文件;取消会话同步功能;
102:

103:

然后将两个web服务启动起来;
用客户端进行一个简单的测试;

补充:因为lvs没有健康检查的功能所以;此时节点中的任何一个服务器宕机;那么就会显示以下情况;

那么就要手动把该节点从lvs集群中移除掉;
以下语句作为参考;
ipvsadm -d -t 192.168.10.172:80 -r 192.168.10.102
搭建nfs服务器;105

然后两个web服务器也安装nfs-utils
编辑nfs服务器的配置文件;
首先创建共享目录;

然后进入到两个web服务器进行挂载共享目录;
102同理;

再回到nfs服务器在共享目录下创建测试文件;

再用客户端进行测试;

此时可能会有疑问,就是原来的网页文件去哪里了?
因为挂载了共享目录到首页文件的站点目录下,这时的文件就被盖住了,而不是覆盖了,也不是删除了;如果取消挂载就会再次显形;
先取消挂载然后再进入到站点目录下查看,原来的文件就显形了;













