1. LVS的介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前从内核版本2.4.24以后IPVS已经成为linux官方标准内核的一部分。
2. LVS的用途
LVS主要用于多服务的负载均衡。如下图所示,通过lvs可以将外部请求负载均衡到后端的多个web服务器上。
LVS的优点:
它工作在网络层,可以实现高性能,高可用的服务器集群技术。 它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。 它易用,配置非常简单,且有多种负载均衡的方法。 可扩展性也非常好。 性能好,几乎可以和F5相媲美
3. LVS的核心组件
LVS的管理工具和内核模块 ipvsadm/ipvs:
ipvsadm:用于空间的命令行工具, 用于管理集群服务及集群服务上的RS等;
ipvs:工作于内核上的程序, 可根据用户定义的集群实现请求转发。
LVS的常用术语: VS:Virtual Server,虚拟服务器 Director/Balancer:负载均衡器,上图中的lvs调度器 RS:Real Server,后端请求处理服务器,上图中的web服务 CIP:client ip,客户单ip VIP:Director Virtural IP,负载均衡虚拟IP,应该出现在lvs调度器上和后端的RS上 DIP:Director IP 负载均衡器ip RIP:Real Server IP,后端请求处理服务器IP
4. LVS的四种模式(DR模式最常用)
NAT 模式 DR 模式 (重点是DR模式,其他模式了解即可) tun 隧道模式 full-NAT模式 其中DR模式效率最高
4.1 DR模式
lvs的DR模式最最稳定, 是使用最多的一种模式。DR模式也叫直接路由模式,我们通过一个案例来讲解DR模式。
如下图所示:
环境信息如下:
VIP:集群的VIP是192.168.147.150 DIP:lvs服务器自身的eth0网卡ip是192.168.1.110 RIP:两个RS的ip分别是192.168.1.111,192.168.1.112 另外补充一句:配置lvs,则需要在lvs的服务器上和后端的RS服务器上的lo口(本地环回口)上配置vip的地址。
整体如下图所示,LVS服务器和RS服务器上都有两个IP地址,一个是eth0网口的本地真实IP,另一个是手动配置给lo口的VIP地址。
(图片来自网络,侵权即删)
那上图的请求流程是:
1. client APP访问域名www.xxxxx.com
2. DNS将域名www.xxxxx.com解析为VIP地址192.168.147.150
3. Client要访问192.168.147.150,则先通过arp广播查询,找到192.168.147.150对应的mac地址,查询后发现192.168.147.150的ip地址对应的mac是lvs服务器的mac地址,于是,向lvs服务器发起访问请求。
4. lvs收到请求后,通过负载均衡算法,将请求转发给后端的RS。
5. RS收到请求后,将reply回复给client。
整个流程看起来挺完美的。
但是!这里遇到了我们的第一个问题,稍微细心的同学肯定也有个疑惑? 本地局域网中有3台机器配置了同样的VIP地址,client端请求VIP地址时,为什么没有把请求打到RS,而是打到了LVS上?
也就是说为什么第3步arp广播请求VIP地址时,将VIP地址解析成了lvs的mac地址,而不是另外两台RS的mac地址?
我们带着问题来思考, 可能才更好的帮助我们来理解LVS的DR模式, 那么要解决这个问题, 我们就需要提到我们刚开始提到的ARP请求了, 我们需要在LVS, RS1, RS2上都需要绑定三个VIP, 如果我们在
RS的服务器上做一些额外的配置,比如配置抑制ARP应答不就可以了。
很好,解决方法就是在RS的服务器上通过修改Linux内核参数,如下:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
为了帮助大家更好的理解三个vip之间的关系, 我们举个例子来说:
LVS服务器是正常的, 当DNS在请求的时候会解析出来VIP的地址, 但是并不知道, 具体的mac地址是哪一个, 那LVS服务器会通过ARP请求, 告知别人自己的mac地址, 别人就缓存下来了, 反之, 我们的RS是抑制ARP应答的, 其实他就是一个哑巴, 他不会响应arp的请求报文, 这样别人就不知道他的mac地址, 即使他有VIP地址, 所以DNS只会把请求转发到LVS上, 而不能转发到RS上。
但是这里又遇到了我们的第二个问题, 那就是我们抑制了RS的arp报文,也就不知道RS的mac地址了,那么LVS如何把请求转发给RS呢?
解决了上面的问题, 那新的问题又来了,既然我们说RS禁止了ARP请求, 那LVS是如何把请求转发给RS的呢?其实我告诉你, 是通过修改mac地址, 进行转发的, 这个是DR模式的核心技术,修改mac地址。
OK,这里我们清楚了,client请求到了lvs,lvs通过修改目的mac地址为RS的mac,将请求转发给RS。
但是还有一个问题?
LVS又是如何知道RS的mac地址呢, 毕竟RS上的arp都被抑制了,这里我可以提前告诉你lvs就是通过arp请求知道RS的mac地址的, 那有些人就会问我, 你这个不是自相矛盾吗?
首先我们看一下, 我们的vip都是绑定在lo上的, 我们要理解上面我提出的这个问题, 就要深入的了解一下linux内核参数的配置信息了。
有关arp_ignore的相关介绍:
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询
看了上述的介绍,我们明白了,我们设置的arp_ignore内核参数是1, 就是只回答目标IP地址是来访网络接口本地地址的ARP查询请求,即: 只回答本地网卡eth0上的ARP请求。
我们就拿上面的图举例:
LVS服务器: DIP: 绑定的网卡eth0: 192.168.1.110 VIP: 绑定的网卡是lo:0: 192.168.147.150 RS服务器: RIP: 绑定的网卡是eth0: 192.168.1.111 VIP: 绑定的网卡lo:0: 192.168.147.150
其实客户端在发送ARP请求的时候, 询问的是VIP的mac地址, LVS服务器进行了正确的ARP请求回应, 而当循环RS服务器的mac地址的时候, 这个时候, 我们网卡的IP地址是: 192.168.1.111/112, RS是做过阉割的, 所以不给与回应。当LVS服务器发起ARP请求的时候, 循环192.168.1.111或者192.168.1.112的mac地址, 这个时候, RS本地的网卡地址, 就是LVS需要访问的ip地址, 就进行ARP请求的回应. 所有LVS服务器就缓存了RS服务器的mac地址。上面的问题是不是都迎刃而解了
最后一个问题:我们说在响应client时,是由RS直接返回给client的,这个是怎么做到的呢?
这个问题太好, 我们一般接收的请求, 应该都是哪里来, 哪里回, 那RS是如何做到直接返回个客户端的呢?好的, 既然我们前面提到了在RS上进行设计linux内核参数的更改, 分别是arp_ignore和arp_announce两个内核参数, 既然arp_ignore是禁止arp请求的,我们上面已经介绍过了, arp_announce内核参数是做什么的嗯? 我们下面就来讲解一下这个参数的作用吧。既然存在, 那就是有意义的, arp_announce这个内核参数, 其实就是让RS可直接返回给客户端。
有关arp_announce的相关介绍:
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口。
0 - (默认) 在任意网络接口上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
其实我们RS可以直接返回给客户端, 就是arp_announce设置为2起到的作用, 他会自主的选择一个地址, 即VIP地址, 返回给我们的客户端, 其实就是利用了一个欺骗的技术, 让客户端不会把我们返回的请求丢弃掉, 让他以为RS返回的请求是正常的。
使用DR模式:
lvs 负载均衡器主要做的是修改目的mac,将mac改为某一台real_server real server 主要做的是 1.绑定vip 2.抑制arp
数据包流程: 客户求请求由LVS接受,但是由Real Server返还给用户信息,不经过LVS转发. 这里引发一个问题: 当用户请求时,源IP是CIP,目标地址是VIP;LVS调度器将请求转发给Real Server处理后再发送给用户,这个时候源IP是RIP,目标地址是CIP,但是用户并没有请求RIP,用RIP响应请求时CIP不会接受,所以需要用VIP响应请求。
所以DR原理是: DR模式下LVS和Real server都需要配备一样的VIP(Real Server通过将VIP绑定在loopback实现). 但是 同一个局域网中,多台服务器出现同样的IP地址会引起冲突(arp协议的ip地址冲突检测机制,免费arp),so 那么如何工作下去? 需要在调度服务器上设置一个VIP和DIP, 每个RS也有一个RIP和VIP,但是RS需要对VIP地址做隐藏,不会应答ARP广播,只有在响应CIP时,作为源地址使用. 当产生请求时,LVS将目标mac修改为RS中的MAC,然后转发到相应的RS上处理,此时源,目的IP都没有改变,RS收到LVS转发来的包时,发现mac是自己的,IP也是自己的,所以合法接收,并直接回复,不经过LVS. 注意: 免费arp,主机发送自己的ip查询mac,如果没有应答ok,有应答出事.
DR模式的案例:
原文:https://www.cnblogs.com/shanghai1918/p/12851057.html