部署LVS-DR群集

773 阅读11分钟

1. LVS-DR工作原理

LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一种工作模式

LVS-DR模式,Director Server 作为群集的访问入口,不作为网关使用。 节点Director Server 与Real Server 需要在同一个网络中,返回给客户端的数据不需要经过Director Server。 为了对整个群集的访问,Dreector Server和Real Server都需要配置VIP地址

1.1 LVS-DR数据包流向分析

为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4

image.png 1、客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。

2、Director Server 和 Real Server 在同一网络中,数据通过二层数据链路层来传输。

3、内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)对比数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为 Director Server 的MAC地址,修改目标MAC地址为 Real Server 的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。

4、到达 Real Server 的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。

5、Real Server 直接将响应报文传送到客户端。

1.2 DR模式的特点

  1、Director Server 和Real Server 必须在同一个物理网络中。

  2、Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。

  3、Director Server 作为群集的访问入口,但不作为网关使用。

  4、所有的请求报文经由 Director Server ,但回复响应报文不能经过 Director Server。

  5、Real Server 的网关不允许指向 Director Server IP,即 Real Server 发送的数据包不允许经过 Director Server。

  6、Real Server 上的 lo 接口配置 VIP的IP地址。

1.3 LVS-DR数据包流向分析

  1. Clinent向目标VIP发出请求,Director(负载均衡器)接收
  • 源ip:客户端ip,目标ip:虚拟ip,源MAC:客户端MAC地址,目标MAC:负载均衡器的MAC地址
  1. Director根据负载均衡算法选择RealServer_1(真实服务器),不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送。
  • 源ip:虚拟ip,目标ip:真实虚拟ip,源MAC:负载均衡器MAC,目标MAC:真实服务器MAC
  1. RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealSERVERS事先绑定了VIP),于是处理这个报文,随后重新封装报文,发送到局域网。
  • 源ip:虚拟ip,目标ip:客户机ip,源MAC:真实ens33网卡MAC,目标MAC:客户端MAC
  • 注意:如果跨网段,则报文通过路由器经由internet返回给用户
  1. Client将收到回复报文,Client认为得到正常的服务,而不会知道是那一台服务器处理的。

1.4 LVS-DR中的ARP问题
  1. 在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
  • 当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播

  • 只有前端的负载均衡器进行相应,其他的节点服务器不应该响应ARP广播

  1. 对节点服务器进行处理,使其不响应针对VIP的ARP请求
  • 使用虚接口 lo:0承载VIP地址

  • 设置内核参数arp_ignore=1;系统只响应目的IP为本机IP的ARP请求

  • 内核参数目录文件 /etc/sysctl.conf

  1. Real Server 返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
  • 发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包的源IP地址,而不使用发送接口的IP地址

  • 源IP:VIP、源MAC:Real Server的MAC、目的IP:路由器的IP、目的MAC:?

  1. 路由表收到ARP请求后,将更新ARP表项
  • 原有的VIP对应Director的MAC地址会被更新为VIP对应Real Server 的MAC地址
  1. 路由表根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
  • 解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
  1. 解决ARP的两个问题的设置方法

修改/etc/sysctl.conf文件

net.ipv4.conf.lo.arp_ignore = 1  
//防止网关路由器发送ARP广播时调度器和节点服务器都进行响应导致ARP缓存表紊乱,不对非本地物理网卡IP的ARP请求进行响应因为VIP是承载在lo:0
net.ipv4.conf.lo.arp_announce = 2 
//系统不使用响应数据包的源IP地址(VIP)来作为本机进行ARP请求报文的源IP地址而使用发送报文的物理网卡IP地址作为ARP请求报文的源IP地址,这样可以防止网关路由器接收到源IP地址为VIP的ARP请求报文后又更新ARP缓存表导致外网再发送请求时,数据包到达不了调度器
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
 vim etc/sysctl.conf
#使Linux系统只响应目的地址为本地物理网卡IP的ARP请求
net.ipv4.ip_forward = 1  
net.ipv4.conf.lo.arp_ignore = 1   
net.ipv4.conf.all.arp_ignore = 1  
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2 

详细流程分析

客户端通过路由器将访问请求发送到内网当中,需要通过APR将源地址解析为MAC地址进行访问,但是由于内网中DS(负载调度器)和RS(真实服务器)都配置了VIP,他们都可收到APR请求,并返回自己的MAC,这时候客户端的数据不知道往哪个上面发送,那就需要通过在真实服务器上配置  “路由紧固” + “只响应目标为本机ens33网卡信息的请求参数” ,因为DR上配置的是虚拟子接口,可以接收到信息,而RS,配置的是环回地址,无法收到ARP请求,那么这样就只有DS收到请求。收到请求后,客户端通过封装DS的MAC地址,进行二层转发。

DS收到请求后,通过调度算法选择需要转发的RS站点,因为都在局域网内此时转发只是二层的转发,那怎么发给RS站点呢?二层转发是局域MAC地址转发的,通过ARP获得RS的MAC地址,将获得的MAC地址封装为目标MAC地址,进行数据转发。

RS收到请求后,它可以直接请请求返回给客户端,不需要再经过DS,因为,它获取到数据包后,把数据包交个自己的ens33网卡,由ens33网卡将数据包转发出去,ens33进行APR广播,这里为了不修改ARP表的内容,在进行ARP广播,使用的源ip为RS的ens33接口ip。广播得到了客户机的MAC地址,再进行将数据转发,转发时,使用的源ip为:环回ip,源MAC为:ens33MAC,目标地址为:客户机地址,目标MAC为客户机MAC。

客户机收到数据包后,发现数据包的源地址为VIP,并不知道是哪一台服务器处理的,下次再发出请求时,直接根据ARP中的表项将数据再次转发到DS。

节点服务器 发送 响应报文给客户端

响应报文

  1. 源IP --> VIP
  2. 目的IP --> CIP

发送响应报文需要经过网关路由器的转发,就需要先对网关IP进行ARP请求获取网关接口的MAC地址(因为主机在发送报文给目标主机首先需要查询本地的ARP的缓存表中有没有目标IP和目标MAC的对应关系,如果有则直接单播发送,如果有没有则要先进行ARP广播探测请求 解析到目标IP所对应的MAC地址)

ARP请求报文

源IP--->VIP 源MAC-->节点服务器MAC地址

目的IP--->网关IP 目的MAC---> FF-FF-FF-FF-FF 广播地址

导致的问题:

网关的ARP缓存表 VIP---> 调度器MAC地址 被更新成 节点服务器MAC地址 (此时会造成网关的ARP缓存表的紊乱)

节点服务器物理网卡的IP -> 节点服务器MAC地址

2. DR模式 LVS负载均衡群集部署

1. 配置负载调度器

yum -y install ipvsadm    #下载ipvsadm管理工具

modprobe ip_vs    #加载ip_vs模块
cat /proc/net/ip_vs    #查看ip_vs模块

ipvsadm-save > /etc/sysconfig/ipvsadm    #保存策略
systemctl start ipvsadm     #启动ipvsadm工具

(1)配置虚拟 IP 地址

cd /etc/sysconfig/network-scripts/     #进入网卡配置目录
cp -p ifcfg-ens33 ifcfg-ens33:0        #复制虚拟子接口的配置文件
vim ifcfg-ens33:0       #编辑虚拟字接口内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.85.71
NETMASK=255.255.255.255

ifup ens33:0       #开启虚拟字节
ifconfig ens33:0   #查看配置是否成功

QQ截图20221019201025.png

QQ截图20221019202320.png

(2)调整 proc 响应参数

由于LVS负载均衡器和各个节点需要共用vip地址,应该关闭Linux内核的重定向响应参数,不充当路由器,这样当DS收到客户端发来的数据包时,就不会立马转发给后台RS服务器,而是转发给自己的虚拟子接口。

vim /etc/sysctl.conf     #编辑内核proc参数
net.ipv4.ip_forward = 0      #关闭ip转发
net.ipv4.conf.all.send_redirects = 0      #关闭所有send重定向
net.ipv4.conf.default.send_redirects = 0    #关闭默认重定向
net.ipv4.conf.ens33.send_redirects = 0    #关闭网卡重定向

sysctl -p   #查看内核参数

QQ截图20221019202759.png

(3)配置负载分配策略

ipvsadm -C    #清除规则
ipvsadm -A -t 192.168.85.71:80 -s rr   #创建虚拟主机,指定ip地址,并指定分流模式为轮询
ipvsadm -a -t 192.168.85.71:80 -r 192.168.85.90:80 -g  
#添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i,-m为nat模式
ipvsadm -a -t 192.168.85.71:80 -r 192.168.85.60:80 -g  
#添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i

ipvsadm   #启动策略
ipvsadm -ln    #查看节点状态信息
ipvsadm -Lnc   #监控连接数

QQ截图20221019210741.png

2. 配置NFS共享服务器

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

(1)安装nfs服务和rpcbind服务

yum  -y install nfs-utils rpcbind    #安装nfs服务和依赖包
 
systemctl start rpcbind    #启动依赖服务
systemctl start nfs        #启动nfs服务
systemctl enable rpcbind
systemctl enable nfs

(2)创建共享目录

mkdir /opt/wa /opt/benet  #创建共享目录
chmod 777 /opt/wa /opt/benet

(3)设置共享,发布共享

vim /etc/exports
/usr/share *(ro,sync)
/opt/wa 192.168.80.0/24(rw,sync)
/opt/benet 192.168.80.0/24(rw,sync)

exportfs -rv #发布共享 
showmount -e localhost #查看共享

QQ截图20221019210252.png

4. 配置节点服务器

systemctl stop firewalld.service
setenforce 0

(1)配置环回ip地址

此地址仅用作发送web响应数据包的原地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚拟接口lo:0 来承载VIP,并为本机添加一条路由记录,并将访问的VIP的数据限制在本地,以免通信紊乱。

cd /etc/sysconfig/network-scripts/    #进入网卡配置目录
cp -p ifcfg-lo ifcfg-o:0    #复制环回网卡
vim ifcfg-lo:0   #修改内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.85.71
NETMASK=255.255.255.255

ifup ifcfg-lo:0    #启动环回网卡
ifconfig lo:0    #查看环回网卡

QQ截图20221019211250.png

(2)添加vip本地访问路由

route add -host 192.168.85.71 dev lo:0

或者下面方式,都可实现路由禁锢,下面的为永久添加
vim /etc/rc.local    #linux在开启启动时,会加载的内容
/sbin/route add -host 192.168.85.71 dev lo:0

route -n  #查看

QQ截图20221019211502.png

(3)调整内核的ARP响应参数以阻止更新vip的MAC地址

vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1   #系统只响应目的ip为本地的arp请求
net.ipv4.conf.all.arp_announce = 2  #系统不使用ip包的源地址来设置arp请求的原地址,而选择发送接口的ip地址。
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

sysctl -p   #刷新

QQ截图20221019211726.png

(4)安装httpd服务,nfs服务,rpc服务,进行网络挂载

yum -y install httpd nfs-utils rpcbind   #下载包
showmount -e 192.168.85.80  #验证是否查看到共享
mount.nfs 192.168.85.80:/opt/wa /var/www/html #网络挂载

systemctl start rpcbind
systemctl start nfs
systemctl start httpd

                   web1
echo 'this is benet web!' > /var/www/html/index.html
                   web2
echo 'this is wa web!' > /var/www/html/index.html

QQ截图20221019212725.png

5. 客户端访问

QQ截图20221019213337.png

QQ截图20221019213359.png