相比于nginx只能用于7层负载均衡,LVS就比较强大了,能在4层做负载均衡。而且性能和稳定性上LVS也比较占优,毕竟是合入内核模块,不稳定肯定不行。

视频介绍:https://v.youku.com/v_show/id_XMzM0Nzk0MjU2.html

关于LVS

LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter的INPUT链上。除此之外,还需要一个用户态工具,ipvdadm,用于用户负载集群定义和集群服务管理。

LVS DR模式工作原理

LVS DR模式的流程大概如下:

 

 
负载均衡——LVS DR模式
 

1、客户端发送请求至VIP,也就是访问服务,请求报文源地址是CIP,目标地址为VIP;

2、LVS调度器接收到请求,报文在PREROUTING链检查,确定目的IP是本机,于是将报文发送至INPUT链,ipvs内核模块确定请求的服务是我们配置的LVS集群服务,然后根据用户设定的均衡策略选择某台后端RS,并将目标MAC地址修改RIP的MAC地址。因为调度器和后端服务器RS在同个网段,因此直接二层互通,将请求发给选择的RS处理;

3、因为报文目的mac是本机,且RS上有配置VIP,因此RS能接收该报文。后端服务处理完请求后,将响应直接发往客户端,此时源IP地址为VIP,目标IP为CIP。

LVS DR模式配置

1、环境准备

如下,准备三台服务器,

机器 作用

192.168.0.100 VIP,LVS调度器对外服务IP

192.168.0.200 RIP,后端web服务器之一

192.168.0.300 RIP,后端web服务器之二

2、LVS调度器配置

上面我们说过lvs依赖于ipvs内核模块,和ipvsadm用户态工具。因为centos 7已经默认加载ipvs模块,因此这一步我们不需要配置。我们只需要安装ipvsadm工具即可,

yum install -y ipvsadm

然后在LVS调度器上配置VIP,这里我们采用虚拟网卡,当然也可以使用独立网卡配置,

ifconfig eth0:0 192.168.0.100/24 up

接着配置LVS集群服务,

[root@CentOS-7-2 ~]# ipvsadm -C

[root@CentOS-7-2 ~]# ipvsadm -A -t 192.168.0.100:80 -s rr

[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.200:80 -g

[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.300:80 -g

其中,

第一条命令是清空所有规则;

第二条命令是定义LVS服务,并指定负责均衡策略为rr,即轮询;

第三、四条命令各添加一台后端web服务器,作为负载均衡节点,并指定为DR模式。

ipvsadm基本命令参数如下:

-A  指定添加的LVS负载均衡虚拟服务

-t  指定虚拟服务器的IP地址和端口

-s  指定调度算法,ss为轮询,wrr为加权轮询,dh为目标地址散列,sh为源地址散列,lc为最少链接等

-a  在对应的VIP下添加RS节点

-g  指定LVS的工作模式为DR模式

-l  指定LVS的工作模式为tunnel模式

-m  指定LVS的工作模式为NAT模式

添加完后端RS,我们可以查看此LVS对应的均衡规则,

[root@CentOS-7-2 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port          Forward Weight ActiveConn InActConn

TCP  192.168.0.100:80 rr

  -> 192.168.0.200:80            Route  1      0          0       

  -> 192.168.0.300:80            Route  1      0          0

3、后端RS配置

这里web服务器使用nginx搭建,因此在两台RS上安装nginx,

yum install -y nginx

同时为了后面测试,我们修改web服务器的index.html内容,

[root@192_168_0_200 ~]# cat /usr/share/nginx/html/index.html

This is 192.168.0.200

[root@192_168_0_300 ~]# cat /usr/share/nginx/html/index.html

This is 192.168.0.300

接着开始进行LVS相关配置,

首先将VIP配置在lo接口上,(注意掩码要配置成32位,不然RS通信会出问题)

ifconfig lo:0 192.168.0.100/32 up

接着配置对应路由,

route add -host 192.168.0.100 dev lo (将目标ip为192.168.0.100的请求通过lo网卡发送出去)

然后设置相关系统参数,

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

其实严格意义上只要配置出口网卡的对应参数就可以了,配置all也只是为了保险而已,文章最后面会有说明。

4、测试

使用curl命令对vip进行访问,

[root@CentOS-7-3 /home]# curl  http://192.168.0.100:80

This is 192.168.0.200

[root@CentOS-7-3 /home]# curl  http://192.168.0.100:80

This is 192.168.0.300

[root@CentOS-7-3 /home]# curl  http://192.168.0.100:80

This is 192.168.0.200

[root@CentOS-7-3 /home]# curl  http://192.168.0.100:80

This is 192.168.0.300

可见结果符合我们设置的轮询策略。

几点思考

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也不需要开启。

 
arp_ignore具体解释
 

LVS的DR模型中,调度器和所有的Real Server都配置了VIP,且都在同一网段内,那为了保证客户端的arp广播请求只被调度器所响应,必须更改Real Server的arp默认响应规则,这就是修改内核参数arp_ignore

  今天我们来解释一下这个参数设置的意义在哪里?为什么要做这种设置?

  arp_ignore作用:控制系统在收到arp广播请求报文时,是否返回arp响应报文

  常见取值解释:

  0、主机上任意一个网卡接口有arp广播请求报文中的IP地址,就进行回应

  1、只响应目的IP地址为接收网卡上的本地地址的arp请求

  2、只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段

  取值为0,举例解释:

  例如:一台Linux主机,有2块网卡,接口1的IP地址为:1.1.1.1,接口2的IP地址为2.2.2.2;这时该主机收到一个arp广播请求,请求问到”谁拥有1.1.1.1的IP地址,请将你的MAC地址发给我“,不管接口1还是接口2收到这个arp广播请求,都会进行回应,即使2.2.2.2这个接口收到这个广播解析请求,这个接口没配置这个IP地址,但这个接口依然可以探测到其他接口配有这个IP地址,依然会进行回应;

  上面的阐述涉及到的核心要点:IP地址是逻辑地址,是属于我们的Linux主机的,是由位于内核的TCP/IP协议栈处理的,不属于网卡本身,一定理解这点,重要重要!!!

  取值为1,举例解释:

  例如:一台Linux主机,有2块网卡,接口1的IP地址为:1.1.1.1,接口2的IP地址为2.2.2.2;这时该主机收到一个arp广播请求,请求问到”谁拥有1.1.1.1的IP地址,请将你的MAC地址发给我“,假如2.2.2.2的接口收到这个arp广播请求,那么不会对其做出回应,因为arp_ignore配置为1了,也就是说:收到arp广播请求的网卡接口,只查看自身有没有配置这个IP地址,如果没有配置,即使别的接口上配置了,也不会做出相应;但如果1.1.1.1的接口收到了这个arp广播请求,由于自身就配置了这个IP地址,那么会回送arp响应报文

  取值为2,举例解释:

  不仅要满足取值为1的要求,而且还会对arp请求包的源IP地址做校验,一个网段内的才会做相应,相较于1,更加严格

  例如:一台Linux主机,有2块网卡,接口1的IP地址为:1.1.1.1,接口2的IP地址为2.2.2.2;这时该主机收到一个arp广播请求,请求问到”谁拥有1.1.1.1的IP地址,请将你的MAC地址发给我“?假如1.1.1.1的接口收到了这个arp广播请求报文,但会检查请求报文中的源IP地址是否和1.1.1.1在同一网段内,如果在同一网段内,则回送arp相应报文;相反不在同一网段内,则依然不会回送响应报文

  总结:从上面解释可以看出,arp_ignore从0--1--2,是越来越严格;

  取值为0,不管那个网卡收到,只要任一网卡有配置这个IP地址,就会响应

  取值为1,收到arp请求报文的网卡接口,刚好该接口配置的IP地址又正好是请求的IP地址,才回应

  取值为2,不仅要满足取值为1的条件,还要对arp请求报文的源地址做判断,只有同一网段内,才会回应

  我们知道,调度器和所有的Real Server都配置了VIP地址,LVS的VIP配置在物理网卡接口上,而Real Server都是配置在了本地接口lo上

  为了保证客户端的ARP广播请求可以只被调度器所响应,因此必须限制所有Real Server的arp响应级别,所以才设置arp_ignore为1,这样对于Real Server来说,因为arp请求一定来自别的主机,所以接收的网卡只能是物理接口,而Real Server又将VIP配置到了lo接口上,因此刚好不会回应,从而保证了请求只会到达调度器;

  理解了上面的内容,也就理解了为什么我们要把调度器的VIP配置到物理接口上,而把Real Server的VIP配置到本地接口lo上

  希望上面的解释,可以帮助大家更好的理解arp_ignore;如果你不知道什么是arp,请参考其他资料

 

DR模式小结:

1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。

2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)

3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面,通过ARP方式寻找局域网相应RS的MAC地址

4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。

5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。

6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。


————————————————
版权声明:本文为CSDN博主「张必安」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41772936/article/details/80146464



作者:BlueBlueSummer
链接:https://www.jianshu.com/p/eae3fd16bb6c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分类:

技术点:

相关文章: