
一、负载平衡的来源
在业务初期,我们通常使用单台服务器来提供外部服务。流量越来越大,单个服务器再怎么优化,硬件再好,总会有一个性能天花板。当单台服务器的性能无法满足业务需求时,就需要组成多台服务器的集群系统来提高整体处理性能。但是,我们需要使用统一的门户来提供外部服务,所以我们需要一个流量调度器来分发大量的用户通过均衡算法均衡地向后端集群中的不同服务器发出请求。这就是我们后面要讲的负载均衡。
使用负载平衡的好处:
提高系统的整体性能。
提高了系统的可扩展性。
提高了系统的可用性。
二、负载平衡类型
一般来说,负载均衡器可以分为三类,包括:DNS负载均衡、硬件负载均衡和软件负载均衡。
2.1 DNS实现负载均衡
DNS负载均衡是最基本最简单的方式。一个域名通过DNS解析成多个IP,每个IP对应一个不同的服务器实例,从而完成流量调度。虽然没有使用传统的负载平衡器,但它确实完成了简单负载平衡的功能。
通过DNS进行负载均衡的最大优势是简单,成本低,不需要开发或维护负载均衡设备。然而,也有一些缺点:
服务器故障转移延迟大,服务器升级不方便。我们知道在DNS和用户之间有多层缓存。即使在故障发生时及时通过DNS修改或移除故障服务器,由于经过运营商的DNS缓存,DNS的生效时间也变得很慢,缓存很可能没有不要遵循TTL规则。有时候,一天后会有一些请求流量。
流量调度不均衡,粒度过粗。DNS调度的平衡与区域运营商LocalDNS返回IP列表的策略有关,部分运营商通过轮询不返回多个不同的IP地址。另外,一个运营商的LocalDNS后面服务了多少用户,也会构成流量调度不均衡的重要因素。
流量分配策略比较简单,支持的算法很少。一般DNS只支持RR轮询,流量分配策略比较简单,不支持权重、哈希等调度算法。
DNS支持的IP列表是有限的。我们知道DNS使用UDP消息进行信息传输。每个UDP消息的大小受到链路MTU的限制,因此消息中存储的IP地址数量也非常有限。阿里DNS系统支持为同一个域名配置10个不同的IP地址。
实际上,这种方法很少用于生产环境中实现负载均衡,毕竟缺点很明显。本文之所以描述DNS负载均衡,是为了更清楚地解释负载均衡的概念。一些大公司一般使用DNS来实现地理层面的负载均衡,实现就近访问,提高访问速度。这种方式一般是入口流量的基本负载均衡,下层会有更专业的负载均衡设备实现的负载架构。
2.2硬件负载平衡
硬件负载均衡是专用于负载均衡的网络设备,类似于交换机和路由器。目前,业界有两种典型的硬件负载均衡设备:F5和A10。这种设备性能强,功能强大,但是价格非常昂贵。一般来说,只有土豪公司会用这种设备,一般业务水平的公司都可以我买不起。其次,业务量没那么大,用这些设备也是浪费。
硬件负载平衡的优势:
功能强大:全面支持各级负载均衡和全面的负载均衡算法。
强大的性能:性能远远超过常见的软件负载均衡器。
稳定性高:商用硬件负载均衡,通过了良好的严格测试,大规模使用后稳定性高。
安全防护:除了负载均衡之外,还有防火墙、DDoS攻击防范等安全功能,似乎还支持SNAT功能。
硬件负载平衡的缺点:
价格贵,但是贵。
扩展性差,无法扩展和定制。
调试和维护比较麻烦,需要专业人员。
注:到目前为止,我还没有用的是硬件负载均衡,不过还好我曾经遇到过F5一次。
2.3软件负载平衡
软件负载均衡,可以在普通服务器上运行负载均衡软件,实现负载均衡功能。目前常用的有Nginx、HAproxy、LVS。区别在于:
Nginx:它是7层负载平衡,支持HTTP和电子邮件协议。好像还支持4层负载均衡。
HAproxy:是一款7层负载均衡软件,支持7层规则的设置,性能良好。OpenStack默认使用的负载均衡软件是HAproxy。
LVS:这是一个纯粹的4层负载均衡。它运行在内核模式,性能是软件负载均衡中最高的。因为是在4层,所以也比较一般。
软件负载平衡的优势:
简单:部署和维护都相对简单。
便宜:买个Linux服务器装软件就行了。
灵活:可根据业务选择4层和7层负载均衡;也便于根据业务特点进行功能扩展和定制。
三、开源负载平衡器LVS
软件负载均衡主要有Nginx、HAproxy和LVS。其实这三个负载均衡软件都是常用的。基本上,LVS将用于四层负载平衡。众所周知,BAT等大厂商都是LVS的重度用户,因为其性能优异,可以为公司节省大量成本。
我了解到很多大公司用的LVS都是定制版,做了很多性能优化,性能会比开源版高很多。目前只有淘宝有开源和优化的阿里巴巴/LVS,支持FNAT模式,但没有好久没更新了。另外,爱奇艺去年开通了DPDK版的《LVS》,取名DPVS,性能非常强劲。
目前大家比较熟悉的负载均衡软件是LVS,大多数中小型公司都使用开源的LVS来满足业务需求。
3.1网络过滤器的基本原理
LVS是Linux内核中基于netfilter框架的负载均衡系统,所以在学习LVS之前,首先要了解netfilter的基本工作原理。Netfilter其实很复杂,也很重要。通常我们称之为Linux防火墙netfilter,但我们通常操作的是iptables,它只是在用户空间编写和交付规则的工具。真正管用的是netfilter。你可以通过下图简单了解netfilter的工作机制:
Netfilter是一种内核Linux防火墙机制。作为一个通用的抽象框架,它提供了一套完整的钩子函数管理机制,提供了包过滤、网络地址转换、基于协议类型的连接跟踪等功能。
一般来说,netfilter提供了一种机制,可以在数据包流动的过程中,根据规则设置若干检查点(钩子函数)来执行相关操作。Netfilter总共有五个点,包括:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
预路由:刚刚进入网络层和haven 我没有被探路,通过这里;
输入:通过路由搜索确定发送到本机的数据包,在此通过;
FORWARD:路由查找之后,POST_ROUTING之前要转发的数据包;
输出:刚从本机进程发出的包,经过这里;
POSTROUTING:进入网络层的数据包,已经被路由转发,将要离开这个设备,经过这里;
当一个数据包进入网卡时,它会经过链路层和网络层到达预路由,然后它会根据目的IP地址找到路由。如果目的IP是本地的,数据包会继续传递到输入端,通过协议栈后,数据会根据端口发送到相应的应用程序。应用程序处理完请求后,将响应包发送到输出端,最后经过POSTROUTING后送出网卡。如果目的IP不是本地的,并且服务器打开了forward参数,那么数据包将被传递到FORWARD,最后在POSTROUTING后被送出网卡。
3.2 LVS的基本原则
LVS基于netfilter框架,主要工作于输入链。ip_vs_in钩子函数是在输入端注册的,用来执行IPVS的主进程。一般原理如图所示:
当用户访问www.sina.com.cn时,用户数据经过层层网络,最终通过交换机进入LVS服务器网卡,进入核心网络层。
进入PREROUTING后,通过路由查找确定目的VIP是本地机器的IP地址,于是数据包进入输入链。
IPVS在输入链上工作,会根据访问的vip端口判断请求是否是IPVS服务。如果是,它将调用注册的IPVS钩子函数,执行与IPVS相关的主流程,强行修改数据包的相关数据,并将数据包发送到POSTROUTING链。
在POSTROUTING上收到数据包后,根据目的IP地址(后端服务器),最终通过路由将数据包发送到后端服务器。
开源的LVS版本有三种工作模式,每种模式都有完全不同的工作原理。都说各种模式各有利弊,适用于不同的应用场景,但其本质功能是实现均衡的流量调度和良好的可扩展性。它主要包括以下三种模式:
灾难恢复模式
NAT模式
隧道模式
另外,必须说的是,模式是FullNAT,开源版本中没有,代码也没有合并到内核主线版本中。后面会有专门一章详细介绍FullNAT模式。下面详细介绍DR、NAT和隧道模式的原理。
3.3灾难恢复模式的实现原理
LVS(上图)的基本示意图很简单,它显示了一个大致的流程。下面将根据DR模式的具体实现原理详细说明DR模式是如何工作的。
实际上,由于其强大的性能,DR是最常用的工作模式。下面用一次请求和响应数据流的过程来描述DR模式的具体原理。
(一)实现原则的过程
当客户端请求www.sina.com.cn主页时,经过DNS解析为IP后,将请求数据发送到新浪服务器,数据包通过层层网络到达新浪LVS服务器。到达LVS网卡时,数据包:源IP是客户端的IP地址CIP,目的IP是新浪的IP地址的外部服务器,即VIP;此时,源MAC地址是CMAC,实际上是连接到LVS的路由器的MAC地址(为了便于理解,标为CMAC),目的MAC地址是VIP对应的MAC,标为VMAC。
数据包到达网卡后,经过链路层到达预路由位置(刚进入网络层)。经过路由搜索,发现目的IP是LVS的VIP,会投递到输入链。此时,不修改数据包的MAC、IP和端口。
数据包到达输入链,输入是LVS的主要工作位置。此时,LVS将根据目的IP和端口确认它是否是LVS定义的服务。如果是定义好的VIP服务,它会根据配置好的服务信息,选择RealServer中的一个作为后端服务器RS1,然后以RS1为目标,寻找出方向的路由,确定出跳信息和发送数据包要经过的网卡。最后通过INET _ HOOK(Out方向刚从第四层进入网络层)将数据包发送到输出链。
数据包经过POSTROUTING链后,从网络层转到链路层,目的MAC地址改为RealServer服务器的MAC地址,记为RMAC;并将源MAC地址改为LVS和RS同一网段中selfIP对应的MAC地址,记为DMAC。此时,数据包通过交换机被转发到RealServer服务器(注意:为了简单起见,图中没有显示交换机)。
请求包到达RealServer服务器后,链路层检查目的MAC是否为其网卡地址。当你到达网络层时,寻找路由。目的IP是VIP (VIP配置在LO上),确定是本地主机的数据包。经过协议栈后,复制到应用程序(比如这里的nginx服务器)。nginx响应请求后,生成响应包。目的利用VIP作为dst查找路由,确定惊吓信息,发送网卡设备信息,发送数据包。此时,数据包的源IP和目的IP分别是VIP和CIP,而源MAC地址是RS1的RMAC,而
从整个过程可以看出,LVS在DR模式下的逻辑非常简单。数据包通过路由直接转发给RS,响应数据包由RS服务器直接发送给客户端,不经过LVS。我们知道,一般来说,请求数据包较小,响应数据包较大,通过LVS的数据包基本上都是小数据包。以上因素是LVS灾难恢复模式表现强劲的主要原因。
(二)优缺点和使用场景
灾难恢复模式的优势
A.响应数据不经过lvs,所以性能高。
b、稍微修改数据包,保持信息完整(携带客户端源IP)
灾难恢复模式的缺点
A.LV和rs必须在同一个物理网络中(不支持跨机房)
B.必须在rs上配置lo和其他内核参数。
C.不支持端口映射。
灾难恢复模式的使用场景
如果性能要求非常高,可以优先选择DR模式,客户端源IP地址可以透明传输。
3.4 NAT模式的实现原理
lvs的第二种工作模式是NAT模式。下图详细描述了数据包从客户端进入lvs,转发给rs,然后rs再次转发响应数据给lvs,lvs回复数据包给客户端的全过程。
(一)实现原则和过程
用户请求的数据包经过层层网络,到达lvs网卡。此时数据包的源IP是CIP,目的IP是VIP。
通过网卡进入网络层预路由位置,根据目的IP找到路由,确认是本地IP,转发数据包输入。此时,源IP和目的IP没有改变。
到达lvs后,通过目的IP和目的端口查找是否服务IPVS。在IPVS业务的情况下,将选择一个RS作为后端服务器,数据包的目的IP将更改为RIP,以RIP为目的的IP将查找路由信息,确定下一跳和出口信息,并将数据包转发到输出。
修改后的数据包经过后路由和链路层处理后,到达RS服务器,数据包的源IP为CIP,目的IP为RIP。
到达RS服务器的数据包经过链路层和网络层检查后,发送给用户空间的nginx程序。nginx程序处理完毕后,发送响应包。由于RS上的默认网关配置为lvs设备IP,nginx服务器会将数据包转发到下一跳,也就是lvs服务器。此时,数据包的源IP是RIP,目的IP是CIP。
lvs服务器收到RS响应包后,根据路由查找发现目的IP不是本地IP,lvs服务器开启转发模式,于是将包转发到转发链,此时不修改包。
LVS收到响应数据包后,根据目的IP和目的端口查找服务和连接表,将源IP改为VIP,通过路由查找确定下一跳和出口信息,将数据包发送到网关,通过复杂网络到达用户客户端,最终完成一次请求和响应交互。
NAT模式下的双向流量经过LVS,所以NAT模式的性能会有一些瓶颈。但是,与其他模式不同,NAT支持端口映射和windows操作系统。
(二)优缺点和使用场景
NAT模式的优势
A.能够支持windows操作系统
B.支持端口映射。如果rs端口与vport不一致,lvs将修改dport以支持除目的IP之外的端口映射。
NAT模式的缺点
A.后端RS需要配置网关。
B.lvs负载上双向流的压力比较大。
NAT模式的使用场景
如果你是windows系统,使用lvs,必须选择NAT模式。
3.5隧道模式实现的原理
隧道模式在国内很少使用,但据说腾讯大量使用隧道模式。也是单臂模式。只有请求数据会通过lvs,响应数据会直接从后端服务器发送到客户端。它的性能也很强,支持跨房间。让继续看图解分析原理。
(一)实现原则和过程
用户请求的数据包通过多层网络到达lvs网卡。此时数据包的源ip是cip,目的ip是vip。
通过网卡进入网络层预路由位置,根据目的ip找到路由,确认是本地ip,将数据包转发到输入链到达lvs。此时,源ip和目的IP没有改变。
到达lvs后,通过目的IP和目的端口了解其是否服务于ipVS。在ipVS业务的情况下,会选择一个rs作为后端服务器,以rip为目的地的ip会搜索路由信息,确定下一跳,dev等信息,然后在ip头前增加一个额外的IP头(以dip为源,rip为目的地的IP),将数据包转发到输出。
根据路由信息,数据包最终经过lvs网卡,发送到路由器网关,通过网络到达后端服务器。
后端服务器收到数据包后,ipip模块卸载隧道头,正常看到的源ip是cip,目的ip是vip。由于在tunl0上配置了vip,路由查找后确定为本地ip,并发送给应用程序。应用nginx正常响应数据后,以vip为源ip,cip为目的地的ip包被送出网卡,最终到达客户端。
隧道模式拥有DR模式的高性能,支持跨机房访问,听起来很完美。但是国内运营商有一定的特点。比如RS的响应包的源IP是VIP,VIP和后端服务器可能会跨运营商,可能会被运营商屏蔽政策。Tunnel从来没有在生产环境中使用过,所以在国内可能很难实现Tunnel!
(二)优缺点和使用场景
隧道模式的优势
A.单臂模式,lvs上的低负载压力
b、数据包稍作修改,信息原封不动。
C.可以跨机房(虽然在国内很难实现)
隧道模式的缺点
A.ipip模块需要在后端服务器上安装和配置。
B.需要在后端服务器tunl0上配置vip
C.添加隧道头可能会导致碎片并影响服务器的性能。
D.隧道头的IP地址是固定的,后端服务器网卡的哈希可能会参差不齐。
E.不支持端口映射。
隧道模式的使用场景
理论上,如果对转发性能要求高,跨机房要求,隧道可能是更好的选择。
3.6涉及的概念和术语
以上内容涉及的术语或简称较多。这里简单解释一下具体含义,便于理解。
DS:Director服务器.指前端负载平衡器节点。
RS:真实服务器.后端真正的工作服务器。
Cip: clientip,表示客户端的ip地址。
VIP:虚拟IP,表示负载均衡提供外部访问的IP地址。通常,负载平衡IP将通过虚拟IP高度可用。
RIP:RealServer IP,表示负载均衡后端的真实服务器IP地址。
DIP:Director IP,表示负载平衡与后端服务器通信的IP地址。
CMAC:客户端的MAC地址,应该是连接到LVS的路由器的MAC地址。
VMAC:负载均衡LVS VIP对应的MAC地址。
DMAC:负载均衡LVS DIP对应的MAC地址。
RMAC:后端真实服务器RIP地址对应的MAC地址。
基本原理知识,暂时了解到这里,下一章将从实际出发进一步了解LVS的工作原理和基本用法。
原文链接:3359blog.csdn.net/weixin _ 42073629/文章/详情/109441270lyn









