首页 > 其他 > 详细

lvs+keepalived高可用

时间:2020-05-08 18:20:12      阅读:69      评论:0      收藏:0      [点我收藏+]

1. LVS的介绍

LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前从内核版本2.4.24以后IPVS已经成为linux官方标准内核的一部分。

虽然lvs已经被Linux集成到内核中了,内核模块为ipvs,但是不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。通过keepalived也可以管理LVS。

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模式的案例:

技术分享图片

 

lvs+keepalived高可用

原文:https://www.cnblogs.com/shanghai1918/p/12851057.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!