文章目录
基于LVS实现四层负载均衡
负载均衡LVS基本介绍
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
是一个虚拟的服务器集群系统。其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构,其体系结构如图所示:
LVS集群的通用体系结构:
LVS集群采用三层结构,其体系结构如图1所示,三层主要组成部分为:
- 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
- 服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
- 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
keepalived是集群管理中保证集群高可用的一个服务软件,简而言之,它的主要功能检查后端服务器 ( real server)的健康情况,如后端服务器出现故障,则将它隔离,恢复后将它加入。keepalived运行在 LVS之上,提高系统的可用性。
LVS由两部分程序组成,包括 ipvs 和 ipvsadm。
- ipvs (ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
LVS相关术语
VS:Virtual Server,Director,Dispatcher,Balancer #调试器,分发器、负载均衡器
DS:Director Server #前端负载均衡器节点。
RS:Real Server #后端请求处理服务器。
CIP:Client IP #客户端的IP
VIP:Director Virtual IP #负载均衡器虚拟IP,向外部直接面向用户请求,作为用户请求的目标的IP地址。
DIP:Director Server IP #负载均衡器真实IP,主要用于和内部主机通讯的IP地址。
RIP:Real Server IP #后端服务器的内网IP
sip: source ip,源IP
dip: destination ip,目的IP
LB: Load Balance 负载均衡器
LVS: Linux Virtual Server
NAT: Network Address Translation,网络地址转换
SNAT: Source Network Address Translation,源地址转换
DNAT: Destination Network Address Translation,目的地址转换
LVS四种工作模式:
NAT:路由转发模式
DR:直接路由模式
TUN:隧道模式
FULLNAT: 双向转换模式
LVS的基本工作原理
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
1、LVS/NAT原理和特点
LVS的nat集群会将请求报文中的目标地址和目标端口修改为选定到的真实服务器的IP和端口,从而实现报文的转发。
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
- POSTROUTING链通过选路,将数据包发送给Real Server
- Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
- Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS-NAT模型的特性
- RS应该使用私有地址,RS的网关必须指向DIP
- DIP和RIP必须在同一个网段内
- 请求和响应报文都需要经过Director Server,高负载场景中Director Server易成为性能瓶颈
- 支持端口映射
- RS可以使用任意操作系统
- 缺陷:对Director Server压力会比较大,请求和响应都需经过Director Server
2、LVS/TUN 原理和特点
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
- POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
- RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送达至客户端
LVS-Tun模型特性
- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能经过Director Server
- 不支持端口映射
- RS的系统必须支持隧道
企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便。
3、LVS/DR原理和特点
LVS-DR集群是LVS的默认模式,将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
- 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送达至客户端
LVS-DR模型的特性
- 特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问 - RS跟Director Server必须在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能经过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(不允许数据包经过director)
- RS上的lo接口配置VIP的IP地址
- 缺陷:RS和DS必须在同一机房中
特点1的解决方案:
修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
在RS上修改内核参数以限制arp通告及应答级别
arp_ignore = 1 #表示系统只响应目的IP为本地IP的ARP请求。
arp_announce = 2 #表示系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址。
4、LVS/FULLNAT原理和特点
Full-NAT模式,即通过同时修改请求报文的源IP地址和目标IP地址进行转发的模式。此类型的模式,默认Kernel不支持。
原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,又内部路由路由到Director,Director接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP
请求使用DNAT,响应使用SNAT
lvs-fullnat(双向转换)
通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:
CIP --> DIP VIP --> RIP
RIP --> VIP DIP–>CIP
FULLNAT模式下,LB会对请求包和响应包都做SNAT+DNAT。
无论是DR还是NAT模式,不可避免的都有一个问题:LVS和RS必须在同一个VLAN下,否则LVS无法作为RS的网关。
LVS-FullNat模式:
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),源地址改为自己的ip地址(SNAT),发送给后端真实服务器;
3.后端服务器在处理完之后要将响应的报文返回给lvs;
4.LVS将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),发送给客户端。
fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。
LVS FULLNAT模型的特性:
FULLNAT模式也不需要DIP和RIP在同一网段
FULLNAT和NAT相比的话:会保证RS的回包一定可到达LVS
FULLNAT需要更新源IP,所以性能正常比NAT模式下降10%
优点:
解决了NAT对LVS和RS要求在同一个vlan的问题,适用更复杂的部署形式
不要求配置LVS为网关(LVS与RS可以通过三层通讯)
缺点:
RS看不到cip(NAT模式下可以看到)
进出流量还是都走的lvs,容易成为瓶颈(跟NAT一样都有这个问题)
VS/DR的工作流程
VS/DR的工作流程:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
LVS四种工作模式简单概述
NAT:
SNAT: 修改源地址
DNAT: 修改目标地址
DR:修改目标MAC
TUN:在原请求IP报文之外新加一个IP首部
FULLNAT:修改请求报文的源IP和目标IP
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:双向转换
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
IPVS的十种负载调试算法
1.轮叫(Round Robin)
2.加权轮叫(Weighted Round Robin)
3.最少链接(Least Connections)
4.加权最少链接(Weighted Least Connections)
5.基于局部性的最少链接(Locality-Based Least Connections)
6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
7.目标地址散列(Destination Hashing)
8.源地址散列(Source Hashing)
9.最短期望延迟(Shortest Expected Delay)
10.无须队列等待(Never Queue)
- 轮叫调度 rr
均等地对待每一台服务器,不管服务器上的实际连接数和系统负载 - 加权轮叫 wrr
调度器可以自动问询真实服务器的负载情况,并动态调整权值 - 最少链接 lc
动态地将网络请求调度到已建立的连接数最少的服务器上
如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡 - 加权最少链接 wlc
调度器可以自动问询真实服务器的负载情况,并动态调整权值
带权重的谁不干活就给谁分配,机器配置好的权重高 - 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器 - 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。 - 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。 - 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。 - 最少期望延迟 sed
不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙 - 永不排队 nq
无需队列,如果有realserver的连接数为0就直接分配过去
三种LVS负载均衡技术的优缺点归纳表:
VS/NAT | VS/TUN | VS/DR | |
---|---|---|---|
服务器操作系统 | 任意 | 支持隧道 | 多数(支持Non-arp) |
服务器网络 | 私有网络 | 局域网/广域网 | 局域网 |
服务器数目(100M网络) | 10~20 | 100 | 大于100 |
服务器网关 | 负载均衡器 | 自己的路由 | 自己的路由 |
效率 | 一般 | 高 | 最高 |
The LVS/NAT working principle and configuration instructions.
The LVS/TUN working principle and configuration instructions.
The LVS/DR working principle and configuration instructions.
Virtual Server via NAT
Virtual Server via IP Tunneling
Virtual Server via Direct Routing