当前位置: 首页 > 科技观察

刚进来的哥们说负载均衡还是太年轻了!_0

时间:2023-03-13 22:00:32 科技观察

图片来自Pexels负载均衡出处随着业务流量越来越大,单台服务器再优化,硬件再好,总会有一个性能天花板。当单台服务器的性能不能满足业务需求时,就需要组成多台服务器的集群系统来提高整体的处理性能。基于以上需求,我们需要使用统一的流量入口对外提供服务。本质上,我们需要一个流量调度器,通过均衡算法,将大量的用户请求流量均衡的分配到集群中的不同服务器上。这其实就是我们今天说的负载均衡。使用负载均衡可以给我们带来几个好处:提高系统的整体性能提高系统的可扩展性提高系统的可用性实现负载均衡硬件负载均衡软件负载均衡DNS实现负载均衡DNS实现负载均衡是最基本、最简单的方式。一个域名通过DNS解析到多个IP,每个IP对应不同的服务器实例,从而完成流量调度。虽然没有使用传统的负载均衡器,但是实现了简单的负载均衡功能。通过DNS实现负载均衡最大的好处是实现简单,成本低,不需要自己开发和维护负载均衡设备。但也存在一些缺点:①服务器故障切换延迟大,服务器升级不方便。我们知道DNS和用户之间有层层缓存。DNS缓存,而且缓存可能不遵循TTL规则,导致DNS生效很慢,有时一天后会有一点请求流量。②流量调度不平衡,粒度过粗。DNS调度的平衡与区域运营商LocalDNS返回IP列表的策略有关。一些运营商不会轮询并返回多个不同的IP地址。此外,某家运营商的LocalDNS服务的用户数量,也会构成流量调度不均的重要因素。③分流策略过于简单,支持的算法太少。一般DNS只支持rr轮询方式。流量分配策略比较简单,不支持权重、Hash等调度算法。④DNS支持的IP列表是有限的。我们知道DNS是使用UDP数据包进行信息传输的。每个UDP数据包的大小受到链路MTU的限制,因此数据包中存储的IP地址数量也非常有限。一个域名支持配置10个不同的IP地址。其实生产环境很少用这种方式来实现负载均衡,毕竟缺点很明显。本文之所以介绍DNS负载均衡的方法,是为了更清楚地解释负载均衡的概念。像BAT这样的公司一般都是通过DNS在地域层面实现全局负载均衡,实现就近访问,提高访问速度。这种方式一般是入口流量的基础负载均衡,下层会有比较专业的负载均衡设备。加载模式。硬件负载均衡硬件负载均衡是通过专门的硬件设备实现负载均衡功能,是一种专用的负载均衡设备。目前业界有两种典型的硬件负载均衡设备:F5和A10。这类设备性能强劲,功能强大,但价格非常昂贵。一般只有有钱的公司才会用这种设备。中小企业一般用不起,业务量也没那么大。使用这些设备是相当浪费的。硬件负载均衡优势:功能强大:全面支持各级负载均衡,支持完善的负载均衡算法。性能强大:性能远超普通软件负载均衡器。稳定性高:商用硬件负载均衡已经通过良好严格的测试,已经大规模使用,稳定性高。安全保护:还具有防火墙、抗DDoS攻击等安全功能,支持SNAT功能。硬件负载均衡的缺点也很明显:价格昂贵,扩展性差,无法扩展定制,调试维护麻烦,需要专业的软件负载均衡软件负载均衡,负载均衡软件可以运行在普通服务器上实现负载均衡功能.目前常用的有Nginx、HAproxy、LVS,区别如下:Nginx:七层负载均衡,支持HTTP、E-mail协议,也支持四层负载均衡。HAproxy:支持七层规则,性能也很好。OpenStack默认使用的负载均衡软件是HAproxy。LVS:运行在内核态,在软件负载均衡中性能最高。严格来说,它工作在第三层,所以更通用,适用于各种应用服务。软件负载均衡的优点:易于操作:部署和维护都比较简单。便宜:只需要服务器成本,软件免费。灵活:可根据业务特点选择四七层负载均衡,方便扩展和定制。负载均衡LVS软件负载均衡主要包括:Nginx、HAproxy和LVS,这三个软件都是常用的。四层负载均衡基本都是用LVS。据了解,BAT等大公司都是LVS的重度用户,因为LVS的优良性能,可以为公司节省巨额成本。LVS,全称LinuxVirtualServer,是由中国人张文松博士发起的一个开源项目。它在社区中具有很高的知名度。它是一个基于四层的反向代理服务器,具有强大的性能。它现在是标准核心的一部分,具有可靠性、高性能、可扩展性和可操作性,以低成本实现最佳性能。NetfilterLVS的基本原理是基于Linux内核中netfilter框架实现的负载均衡功能,所以在学习LVS之前,首先要了解netfilter的基本工作原理。Netfilter其实很复杂。我们通常将Linux防火墙称为netfilter,但我们通常操作的是iptables。iptables只是一个在用户空间编写和传递规则的工具。真正有用的是netfilter。通过下图可以简单了解一下netfilter的工作机制:netfilter是内核态的Linux防火墙机制。作为一个通用和抽象的框架,它提供了一套完整的钩子函数管理机制,例如数据包过滤、网络地址转换、基于协议类型的连接跟踪能力。通俗地说,netfilter提供了一种机制,可以在数据包流转过程中,根据规则设置若干个检查点(钩子函数)来执行相关操作。Netfilter一共设置了5个点,包括:PREROUTING:刚进入网络层还没有路由经过这里的数据包。INPUT:通过路由查找,确定发送到本机的包,通过这里。FORWARD:路由查找后,要转发的数据包,在POST_ROUTING之前。OUTPUT:刚刚从本机进程发送的包,通过这里。POSTROUTING:进入网络层并经过路由确定转发,即将离开设备的数据包,从这里经过。当一个数据包进入网卡后,经过链路层进入网络层后会到达PREROUTING,然后根据目标IP地址进行路由搜索。将数据发送到相应的应用程序。应用程序处理请求后,将响应包发送到OUTPUT,最后通过POSTROUTING发送出网卡。如果目标IP不是本机,并且服务器开启了forward参数,数据包会被转发到FORWARD,最后通过POSTROUTING发送出网卡。LVS基本原理LVS基于netfilter框架,主要工作在INPUT链上,在INPUT上注册ip_vs_inHOOK函数,执行IPVS的主要流程。大致原理如上图所示:当用户访问www.sina.com.cn时,用户数据经过层层网络,最后通过交换机进入LVS服务器网卡,然后进入内核网络层。进入PREROUTING后,经过路由查找,确定访问的目的VIP为本地IP地址,于是数据包进入INPUT链。LVS在INPUT链上工作。会根据访问的IP:Port判断请求是否为LVS服务。如果是,则执行LVS的主进程,强行修改数据包的相关数据,并将数据包发送到POSTROUTING链。在POSTROUTING上收到数据包后,根据目标IP地址(后端真实服务器),通过路由选择最终将数据包发送到后端服务器。开源的LVS版本有3种工作模式,每种模式都有不同的工作原理,每种模式都有自己的优缺点和不同的应用场景。包括以下三种模式:DR模式NAT模式隧道模式这里必须要提一下,还有一种模式是FullNAT,开源版本是没有的。这种模式最早起源于百度,后来在阿里发扬光大。由阿里团队开源。代码地址如下:https://github.com/alibaba/lvsLVS官网也有相关下载地址,但是没有合并到内核主线版本中。后面会有专门的章节详细介绍FullNAT模式。下面详细介绍DR、NAT、Tunnel模式的原理。DR模式实现原理LVS基本原理图中的描述比较简单,表达了一个比较笼统的过程。下面将针对DR模式的具体实现原理来详细解释DR模式是如何工作的。事实上,DR因其强大的性能而成为最常用的工作模式。下面尝试以一个请求和响应数据流的过程来描述DR模式的工作原理。实现原理过程①客户端请求www.sina.com.cn的首页时,请求数据包通过网络到达新浪的LVS服务器网卡:源IP为客户端IP地址CIP,目的IP为新浪外部服务器IP地址。这是贵宾。此时源MAC地址为CMAC,其实就是连接LVS的路由器的MAC地址(为了便于理解记为CMAC),目标MAC地址为VIP对应的MAC,记为VMAC。②数据包通过链路层(刚进入网络层)到达PREROUTING位置,查找路由,发现目的IP为LVS的VIP,将投递到INPUT链。此时数据包的MAC、IP、Port都没有修改。③数据包到达INPUT链,INPUT是LVS主要工作的地方。这个时候LVS会根据目的IP和Port来确认是否是LVS定义的服务。如果是定义的VIP服务,会根据配置信息从realserver列表中选择一个作为RS1,然后以RS1为目标在Out方向寻找路由,并确定下一跳信息和哪个网络数据包将通过卡发送。最后,数据包被传递到OUTPUT链。④数据包经过POSTROUTING链后,从网络层传输到链路层,目的MAC地址改为RealServer服务器的MAC地址,记录为RMAC;并将源MAC地址改为LVS和RS同一网段的selfIP对应的MAC地址,记为DMAC。此时数据包通过交换机转发给RealServer服务器(注意:图中为了简单没有画出交换机)。⑤请求包到达后端真实服务器后,链路层检查目的MAC是自己网卡的地址。在网络层,寻找路由。目的IP为VIP(lo上配置了VIP),判断为本机数据包。通过协议栈拷贝到应用程序(如nginx服务器)。nginx响应请求后,生成响应数据包。然后使用CIP查找出站方向的路由,确定下一跳信息,发送网卡设备信息。此时数据包的源IP和目的IP分别为VIP和CIP。源MAC地址为RS1的RMAC,目的MAC为下一跳(路由器)的MAC地址,记为CMAC(为了便于理解,记为CMAC)。然后数据包通过与RS相连的路由器转发给真正的客户端,完成请求响应的全过程。从整个流程可以看出LVS在DR模式下的逻辑还是比较简单的。数据包通过直接路由转发给后端服务器,响应数据包由RS服务器直接发送给客户端,不经过LVS。我们知道,通常请求包比较小,响应包比较大。经过LVS的数据包基本都是小包,所以这也是LVS的DR模式性能强大的主要原因。优缺点及使用场景DR模式的优点:响应数据不经过lvs,性能高,数据包修改小,信息保存完整(携带客户端源IP)DR模式的缺点:lvs和rs必须在同一个物理网络(不支持跨机房)服务器上必须配置Lo等内核参数。不支持端口映射DR模式的场景:如果对性能要求很高,可以优先选择DR模式,源可以透传客户端的IP地址NAT模式实现原理lvs的第二种工作模式是NAT模式,下图详细介绍了数据包从客户端进入lvs转发到rs,然后转发响应数据再通过rs到lvs,lvs回复数据包到客户端的整个过程实现原理及流程①用户请求数据包到t通过层层网络,到达lvs网卡。此时数据包的源IP为CIP,目的IP为VIP。②通过网卡进入网络层预路由位置,根据目的IP查找路由,确认是本地IP,将数据包转发到INP??UT。这个时候源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服务器开启了转发模式,于是将包转发到forward链,此时不修改数据包。⑦lvs收到响应数据包后,根据目的IP和目的端口查找服务和连接表,将源IP改为VIP,通过路由查找确定下一跳和出口信息,将数据包发送给网关,并通过复杂的网络到达用户客户端后,最终完成一次请求和响应的交互。NAT模式的双向流量都经过LVS,所以NAT模式的性能会有一定的瓶颈。但与其他模式不同的是,NAT支持端口映射,支持windows操作系统。优缺点及使用场景NAT模式的优点:可以支持windows操作系统。支持端口映射。如果rs端口与vport不一致,lvs除了修改目的IP外,还会修改dport以支持端口映射。NAT模式的缺点:后端RS需要配置网关。双向流量对lvs的负载压力比较大。NAT模式的使用场景:如果你是windows系统,使用lvs,一定要选择NAT模式。Tunnel模式实现原理Tunnel模式在国内用的很少,但是据说腾讯大量使用了Tunnel模式。同样是单臂模式,只有请求数据会经过lvs,响应数据会直接从后端服务器发送到客户端,性能也很强大,支持跨机房.继续看下图分析原理:实现原理及过程①用户请求数据包经过多层网络,到达lvs网卡。此时数据包的源IP为cip,目的ip为vip。②通过网卡进入网络层prerouting位置,根据目的ip查找路由,确认是本机ip,将数据包转发到input链,到达lvs。这个时候源和目的ip都没有变。③到达lvs后,通过目的ip和目的端口查看是否为IPVS服务。如果是IPVS服务,会选择一个rs作为后端服务器,使用rip作为目的ip查找路由信息,确定下一跳,dev等信息,然后在前面增加一个额外的IP头IP头(以dip为源,rip为目的ip),转发数据包输出。④数据包根据路由信息通过lvs网卡发送到路由器网关,再通过网络到达后端服务器。⑤后端服务器收到数据包后,ipip模块卸载Tunnel头。一般看到的源ip是cip,目的ip是vip。由于在tunl0上配置了vip,路由查找后确定为本机ip,发送给application。应用nginx正常响应数据后,数据包以vip为源ip,cip为目的ip,从网卡发出,最终到达客户端。隧道模式具有DR模式的高性能,支持跨机房访问,听起来很完美。但是,国内运营商有一定的特点。比如RS响应包的源IP是VIP,VIP和后端服务器可能会出现跨运营商的情况,很可能会被运营商的策略屏蔽掉。Tunnel从来没有在生产环境中使用过,国内可能很难实现Tunnel。优缺点及使用场景Tunnel模式优点:单臂模式,对lvs负载压力小,修改数据包少,信息保存完整,跨机房(不过国内很难实现)Tunnel缺点mode:Requiresbackend要在服务器上安装配置ipip模块,需要在后端服务器tunl0上配置vip。添加隧道头可能会导致分片,影响服务器性能。隧道头的IP地址是固定的,后端服务器网卡的hash可能不统一。Tunnel模式的使用场景不支持端口映射。:理论上,如果对转发性能要求高,并且有跨房间的要求,Tunnel可能是更好的选择。至此,LVS的原理已经解释清楚了。内容很多。建议阅读两遍。由于文章太长,实际操作的内容将在下一篇文章中讨论。作者:肖邦编辑:陶家龙来源:转载自公众号编程(ID:chopin11vip)