目录
(1)与Nginx负载均衡区别
相比于nginx只能用于7层负载均衡,LVS就比较强大了,能在4层做负载均衡。而且性能和稳定性上LVS也比较占优,LVS是合入内核模块,相比Nginx更加稳定。
(2)LVS DR与LVS NAT区别
NAT模式和DR模式的区别 两种模式都是实现负载均衡lvs的方法,NAT模式在包进入的时候在分发器上做了目的地址的mac转换,也就是DNAT,包回去的时候从哪进来的也要从哪里出去,这就造成了NAT模式在real server过多的时候造成了数据包在回去的时候都是从一个出口方向,也就造成了瓶颈。
DR模式在数据包进入的时候由分发器上把收到的数据包分派给架构下的real server来工作,而数据包在返回的时候没有经过分发器而直接发送给数据包的来源地址,这样就解决了数据包都从分发器上返回数据包的瓶颈,从而解决大量的用户访问。
客户端向目标VIP发送请求,负载均衡器接收,负载均衡器根据负载均衡算法选择后端真实服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为后端真实服务器的MAC地址,然后在局域网上发送后端真实服务器收到这个帧,解封装后发现目标IP与本机匹配(事先绑定VIP),于是处理这个报文。随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出客户端将收到回复报文。客户端认为得到正常的服务,而不会知道是哪一台服务器处理的,如果跨网段,则报文通过路由器经由 internet 返回给用户。注意,DR模式不支持端口映射,RS和DS必须在同一网段。Real Server上必须配置VIP地址,以便接收Director转发过来的数据包,以及作为响应报文的源IP,如果RS返回的报文内容里的Source IP不是VIP,Client端会将报文丢弃。
主机 | 主机名 | IP | 备注 |
客户端 | / | 192.168.2.5/24 | 关闭selinux和firewalld |
LVS服务器 | lvs | DIP:[ens33]:192.168.2.10/24 VIP:[ens33:0]:192.168.2.100/24 | 关闭selinux和firewalld |
Web1服务器 | web1 | RIP:[ens33]:192.168.2.20/24 VIP:[lo:0]:192.168.2.100/32 | 关闭selinux和firewalld |
Web2服务器 | web2 | RIP:[ens33]:192.168.2.30/24 VIP:[lo:0]:192.168.2.100/32 | 关闭selinux和firewalld |
说明:
先将LVS服务器enss33网口IP配置为192.168.2.10,然后在ens33网口上再加一个IP,作为VIP,操作如下:
- cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0
-
- vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
- TYPE=Ethernet
- BOOTPROTO="static"
- NAME=ens33:0
- DEVICE=ens33:0
- ONBOOT=yes
- IPADDR=192.168.2.100
- PREFIX=24
systemctl restart network
(web1和web2均做如下相同操作,都在lo回环地址上增加一个192.168.2.100 VIP)
(1)给lo回环网卡配置VIP
- cp /etc/sysconfig/network-scripts/ifcfg-lo{,:0}
-
- vim /etc/sysconfig/network-scripts/ifcfg-lo:0
(注意配置完不要立刻重启网络,不然同一网络出现相同IP会冲突)
- DEVICE=lo:0
- IPADDR=192.168.2.100
- NETMASK=255.255.255.255
- NETWORK=192.168.2.100
- BROADCAST=192.168.2.100
- ONBOOT=yes
- NAME=lo:0
防止地址冲突:
vim /etc/sysctl.conf
- net.ipv4.conf.all.arp_ignore = 1 #当有arp广播问谁是192.168.2.100时,本机忽略该ARP广播,不做任何回应
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2 #本机不要向外宣告自己的lo回环地址是192.168.2.100
- net.ipv4.conf.all.arp_announce = 2
- sysctl -p #生效配置
- systemctl restart network
- ipvsadm -C #清除历史ipvs配置
-
- ipvsadm -A -t 192.168.2.100:80 -s rr #这里的IP使用的是VIP
-A 添加虚拟服务器
-t 设置集群地址(VIP)
-s 指定负载调度算法
rr表示轮询;
wrr表示加权轮询;
lc最小连接;
wlc加权最小连接;
sh源地址哈希
- ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.20:80 -g #-g指DR模式,也是默认模式
- ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.30:80 -g
ipvsadm -Ln
如上图,Route表示DR模式。
vim /etc/sysctl.conf #新增内容如下
net.ipv4.ip_forward=1
sysctl -p #生效
在web1和web2服务器分别搭建一个监听端口为80的web服务器,可以使用Nginx、tomcat等可以,并在html页面做好标识,以便测试效果:
Nginx安装、配置与概述_桂安俊@kylinOS的博客-CSDN博客
curl 192.168.2.100
注:如果使用客户端浏览器测试轮询,应使用火狐浏览器(ctrl+f5强制刷新),使用谷歌和360浏览器测试发现不会轮询,始终访问的一个IP。
问1:为什么所有RS上都要配置VIP?
答:因为当调度器把请求转发给对应RS时,并没有修改报文目的IP,因此请求报文目的IP仍为VIP,所以如果RS没有配置VIP,那么报文到达RS后就会被丢弃。
问2:为什么所有RS要设置arp_ignore=1和arp_announce=2,arp_ignore=1,只响应目的IP地址为接收网卡上的本地地址的arp请求?
答:因为我们在RS上都配置了VIP,因此此时是存在IP冲突的,当外部客户端向VIP发起请求时,会先发送arp请求,此时调度器和RS都会响应这个请求。如果某个RS响应了这个请求,则之后该客户端的请求就都发往该RS,并没有经过LVS,因此也就没有真正的负载均衡,LVS也就没有存在的意义。因此我们需要设置RS不响应对VIP的arp请求,这样外部客户端的所有对VIP的arp请求才会都解析到调度器上,然后经由LVS的调度器发往各个RS。
系统默认arp_ignore=0,表示响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。也就是说,如果机器上有两个网卡设备A和B,即使在A网卡上收到对B IP的arp请求,也会回应。而arp_ignore设置成1,则不会对B IP的arp请求进行回应。由于lo肯定不会对外通信,所以如果只有一个对外网口,其实只要设置这个对外网口即可,不过为了保险,很多时候都对all也进行设置。
arp_announce=2:网卡在发送arp请求时使用出口网卡IP作为源IP
当RS处理完请求,想要将响应发回给客户端,此时想要获取目的IP对应的目的MAC地址,那么就要发送arp请求。arp请求的目的IP就是想要获取MAC地址的IP,那arp请求的源IP呢?自然而然想到的是响应报文的源IP地址,但也不是一定是这样,arp请求的源IP是可以选择的,而arp_announce的作用正是控制这个地址如何选择。系统默认arp_announce=0,也就是源ip可以随意选择。这就会导致一个问题,如果发送arp请求时使用的是其他网口的IP,达到网络后,其他机器接收到这个请求就会更新这个IP的mac地址,而实际上并不该更新,因此为了避免arp表的混乱,我们需要将arp请求的源ip限制为出口网卡ip,因此需要设置arp_announce=2。
问3:为什么RS上的VIP要配置在lo上?
答:由上可知,只要RS上的VIP不响应arp请求就可以了,因此不一定要配置在lo上,也可以配置在其他网口。由于lo设备不会直接接收外部请求,因此只要设置机器上的出口网卡不响应非本网卡上的arp请求接口。但是如果VIP配置在其他网口上,除了上面的配置,还需要配置该网口不响应任何arp请求,也就是arp_ignore要设置为8。
问4:为什么RS上lo配置的VIP掩码为32位?
答:这是由于lo设备的特殊性导致, 如果lo绑定192.168.0.200/24,则该设备会响应该网段所有IP(192.168.0.1~192.168.0.254) 的请求,而不是只响应192.168.0.200这一个地址。
问5:为什么调度器与RS要在同一网段中?
答:根据DR模式的原理,调度器只修改请求报文的目的mac,也就是转发是在二层进行,因此调度器和RS需要在同一个网段,从而ip_forward也不需要开启。