目录
一、LVS-DR工作原理
LVS-DR模式,Director Server 作为集群的访问入口,不作为网关使用
节点Director Server与Real Server需要在同一个网络中,返回给客户端的数据不需要经过Director Server。
为了响应对整个集群的访问,Director Server与Real Server都需要配置VIP地址
客户机发起请求,经过调度服务器(lvs),经过算法调度,去访问真实服务器(RS)
由于不原路返回,客户机不知道,真实主机的ip地址,
所以只能通过调度服务器的外网IP(vip)去放回报文信息
Director Server 作为集群的访问入口,但不作为网关使用,后端服务器池中的Real Server与Director Server在同一个物理网络中,发给客户机的数据包不需要经过Director Server。为了响应对整个集群的访问,DS(前端负载均衡节点服务器)与RS(后端真实服务器)都需要配置有VIP地址。
每个Real Server上都有两个IP:VIP(负载均衡对外提供访问的IP地址)和RIP(负载均衡后端的真实服务器IP地址),但是VIP是隐藏的,就是不难提供解析等功能,只是用来做请求回复的源IP的,Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP(负载均衡与后端服务器通信的IP地址),在DIR接收到客户端的请求后。DIR根据负载均衡算法选择一台rs server的网卡mac作为客户端请求包中的目标mac,通过arp转交给后端rs server处理,后端在通过自己的网关回复给客户端。
二、LVS-DR数据流向
数据流向分析
用户发送请求到Director Server,请求的数据报文(源IP是CIP(客户端IP),目标IP是VIP)到达内核空间
由于DS和RS在用一个网络中,所以是通过二层数据链路层来传输
内核空间判断数据包的目标IP是本机IP,此时IPVS比对数据包请求的服务是否为集群服务,若是,重新封装数据包,修改源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server
RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文,重新封装报文(源IP地址为VIP,目标IP为CIP)将响应报文通过io传送给ens33网卡然后向外发出。
RS直接将响应报文传送到客户端
客户端访问内网负载均衡器,走的是内网vip
三.ARP解析问题
问题1:ip地址冲突
问题描述:当公网中的用户发起请求发送至路由器中,此时肯定需要走的是负载均衡器这台服务器,而不是走的真实服务器1,这里就会出现一个问题,因为内网在转发数据帧的时候即使用ARP(广播)来查询目标MAC地址的时候针对对象ip地址就是vip即192.168.226.100,即在DR负载军恶化那个集群中,负载均衡器与节点服务器都要配置相同的vip,所以这里就会出现混乱,如果此时ARP解析,解析的是真实服务器1那么从外网中进来的业务请求就不会经过负载均衡器而是直接交给真实服务器,如此实现不了负载均衡的效果那么我们怎么解决呢?
解决:那么我们只需要让在ARP响应的时候真是服务器1不进行响应2即可, vip实际上只是一个虚拟ip接口,那么就使用虚拟接口即lo:0来承载vip,并设置内核参数让系统响应目的ip为本地ip的请求。在真实服务器中vip是做在lo:0中的,即虚拟网卡,而真实服务器中的真实的网卡还是ens33即当ARP请求过来的时候需要的是226.100的网卡,真实服务器这边一看我的本地真实ip不是226.100,那就不是找我的,如此就能排除出去这两个真实服务器,在负载均衡器中的vip它实际上是虚拟子接口,虽然它是虚拟子接口,但是它也算是一张网卡,即负载均衡器这边实际上有两张网卡,当请求过来的时候负载均衡器这边一看,226.100这个ip,我这张网卡这边和他匹配,就是来找我的,那么这时候负载均衡器这边就会把相对应的MAC地址给到路由器,即完成正确的ARP响应。
问题2:真实服务器的第二次ARP请求
问题描述:真实服务器想要将数据帧发送给路由器的时候,源ip地址变成虚拟ip地址即226.100,目标ip地址变成用户的ip地址实际上只是做了一个源目转换,根据三层转发原理可以知道通过改变MAC地址来进行数据帧的转发,那么真实服务器想要将返回的信息发送给用户就必须要经过路由器,路由器的ip地址真实服务器是肯定知道的,因为在同一个网段,但是它不知道路由器的MAC地址,那么就会进行第二次ARP请求(广播),而此时的ARP广播的源地址却是lo:0的226.100即vip,且在进行泛洪的时候会带上真实服务器的源MAC地址,因为第一次ARP请求的时候我们好不容易让路由器去识别负载均衡器上的MAC,在真实服务器进行第二次ARP请求的时候,路由器这边会发现226.100的ip条目已经记录过了,这里又来了一个相同的请求,有可能是因为路径的更新导致位置变了,那么就要更新,会把原来226.100的虚拟ip地址所对应的MAC地址更新成真实服务器的MAC地址,那么以后再从用户端发送来的请求又会再次的发送给真实服务器,不经过负载均衡器,导致负载均衡失效。
解决:对节点服务器进行处理,修改其内核,让系统不适用ip包的源地址来设置ARP请求的源地址,而选择发送接口的ip地址,即数据帧先从lo:0出去到达ens33后再去到路由器,设置了这条内核信息后,就不会再使用lo:0的虚拟ip地址了而是使用ens33的真实ip地址发送到路由器中如此,就不会和负载均衡的vip冲突,真实服务器又知道如何去到路由器。
四.部署LVS-DR集群
1.实验准备
lvs调度服务器 192.168.239.128 虚拟子接口:192.168.239.100
web1 ens33 192.168.239.131 lo:192.168.239.100
web2 ens33 192.168.239.130 lo:192.168.239.100
2.关闭防火墙
systemctl stop firewalld
setenforce 0
systemctl disable firewall
3.安装ipvsadm keeplived
yum -y install keepalived ipvsadm
modprobe ip_vs #加载ip_vs模块
cat /proc/net/ip_vs 查看ip_vs版本信息
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
4.给调度服务器配置虚拟子接口
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
开启网卡
ifup ens33:0
ifconfig
5. 调整proc的响应参数
由于LVS负载均衡器和各节点需要共用vip地址,应该关闭linux内核的重定向响应参数,不充当路由器(转发,重定向)
由于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 #查看内核参数
开启ipvsadm
6. 配置负载均衡策略
ipvsadm -C #清除规则
ipvsadm -A -t 192.168.239.100:80 -s rr #创建虚拟主机,指定ip地址,并指定分流模式为轮询
ipvsadm -a -t 192.168.135.100:80 -r 192.168.239.131:80 -g
#添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i,-m为nat模式
ipvsadm -a -t 192.168.1135.100:80 -r 192.168.239.130:80 -g
#添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i
ipvsadm #启动策略
ipvsadm -ln #查看节点状态信息
ipvsadm -Lnc #监控连接数
7.web站点服务配置
1.web1修改网卡
cd /etc/sysconfig/network-scripts/ #进入网卡配置目录
cp -p ifcfg-lo ifcfg-lo:0 #复制环回网卡
vim ifcfg-lo:0 #修改内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.135.100 #地址为VIP
NETMASK=255.255.255.255
ifup ifcfg-lo:0 #启动环回网卡
ifconfig lo:0 #查看环回网卡
2.添加路由禁锢
route add -host 192.168.239.100 dev lo:0
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
8.web2配置
2.添加路由禁锢
route add -host 192.168.135.100 dev lo:0
3.修改内核
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
4.开启阿帕奇