ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

负载均衡原图图解

2022-05-12 09:02:26  阅读:181  来源: 互联网

标签:原图 负载 LVS IP 均衡 服务器 图解 数据包


负载均衡由来

在业务初期,一般会先使用单台服务器对外提供服务,随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单台服务器的性能无法满足业务需求时,就需要把多台服务器组成集群系统提高整体的处理性能。

基于上述需求,我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户大量的请求流量均衡地分发到集群中不同的服务器上。这其实就是我们今天所说的负载均衡

使用负载均衡可以给我们带来如下好处:

  • 提高了系统的整体性能
  • 提高了系统的扩展性
  • 提高了系统的可用性

负载均衡类型

广义上的负载均衡器大概可以分为3类,包括:DNS方式实现负载均衡、硬件负载均衡、软件负载均衡

DNS实现负载均衡

DNS实现负载均衡是最基础简单的方式。一个域名通过DNS解析到多个IP,每个IP对应不同的服务器实例,这样就完成了流量的调度,虽然没有使用常规的负载均衡器,但实现了简单的负载均衡功能。

通过DNS实现负载均衡的方式,最大的优点就是实现简单、成本低,无需自己开发或维护负载均衡设备,不过存在一些缺点:

  • 服务器故障切换延迟大,服务器升级不方便。由于DNS和用户之间是层层的缓存,即便是在故障发生时及时通过DNS修改或摘除故障服务器,但中间经过运营商的DNS缓存,且缓存很有可能不遵循TTL规则,导致DNS生效时间变得非常缓慢,有时候一天后还会有些许的请求流量。
  • 流量调度不均衡,粒度太粗。DNS调度的均衡性,受地区运营商LocalDNS返回IP列表的策略有关系,有的运营商并不会轮询返回多个不同的IP地址。另外,某个运营商LocalDNS背后服务了多少用户,这也是构成流量调度不均的重要因素。
  • 流量分配策略太简单,支持的算法太少。DNS一般只支持rr的轮询方式,流量分配策略比较简单,不支持权重、Hash等调度算法
  • DNS支持的IP列表有限制。我们知道DNS使用UDP报文进行信息传递,每个UDP报文大小受链路的MTU限制,所以报文中存储的IP地址数量也是非常有限的,阿里DNS系统针对同一个域名支持配置10个不同的IP地址。

实际上生产环境中很少使用这种方式来实现负载均衡,毕竟缺点也很明显。想BAT体量的公司一般会利用DNS来实现地理级别的全局负载均衡,实现就近访问,提高访问速度,这种方式一般是入口流量的基础负载均衡,下层会有更专业的负载均衡设备实现的负载架构。

硬件负载均衡

硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有两款:FSA10

这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。

硬件负载均衡的优点:

  • 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法
  • 性能强大:性能远超常见的软件负载均衡器
  • 稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高
  • 安全防护:还具备防火墙,防DDos攻击等安全功能,以及支持SNAT功能。

硬件负载均衡的缺点也很明显:

  • 价格昂贵
  • 扩展性差、无法进行扩展和定制
  • 调试和维护比较麻烦,需要专业人员

软件负载均衡

软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有:NginxHAproxyLVS。其中的区别:

  • Nginx:七层负载均衡,支持HTTP、E-mail协议,同时也支持4层负载均衡
  • HAproxy:支持七层规则,性能也很不错,OpenStack默认使用的负载均衡软件就是HAproxy
  • LVS:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务

软件负载均衡的优点:

  • 易操作:无论是部署还是维护,都相对比较简单
  • 便宜:只需要服务器的成本,软件是免费的
  • 灵活:4层和7层负载均衡可以根据业务特点进行选择,方便进行扩展和定制功能

负载均衡LVS

软件负载均衡主要包括:Nginx、HAproxy和LVS,三款软件都比较常用。四层负载均衡基本上都会使用LVS,据说BAT等大厂都是LVS重度使用者,就是因为LVS非常出色的性能,能为公司节省巨大的成本。

LVS,全称Linux Virtual Server,是由国人章高嵩博士发起的一个开源项目,在社区具有很大的热度,是一个基于四层、具有强大性能的反向代理服务器。

它现在是标准内核的一部分,它具备可靠性、高性能、可扩展性和可操作性的特点,从而以低廉的成本实现最优的性能。

什么是LVS (Linux Virtual Server)?

LVS其实是一种集群(cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明地,而且无需修改客户端和服务器端的程序。

为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构,其结构如图所示:

LVS主要组成部分

  1. 负载调度器(load balancer/Director),它是整个集群对外的前端机,负载将客户的请求发送到一组服务器上执行,而客户认为服务时来自一个IP地址(可称之为虚拟IP地址)上的
  2. 服务器池(server pool/Realserver),是一组真正执行客户请求的服务器,执行的服务一般有web、mail、ftp和dns等
  3. 共享存储(shared storage),它为副武器池提供一个共享的存储区,这样很容器使得服务器池拥有相同的内容,提供相同的服务。

Netfilter基础原理

LVS是基于Linux内核中netfilter框架实现的负载均衡功能,所以咱们先简单了解netfilter的基本工作原理。

netfilter其实很复杂,我们平时所说的Linux防火墙就是netfilter,不过我们平时操作都是iptables,iptables只是用户空间编写和传递规则的工具而已,真正工作的是netfilter。

netfilter是内核态的Linux防火墙机制,作为一个通用、抽象的框架,提供了一整套的hook函数管理机制,提供诸如数据包过滤、网络地址转换、基于协议类型的连接跟踪的功能。

通俗来讲,就是netfilter提供一种机制,可以在数据包流经过程中,根据规则设置若干个关卡(hook函数)来执行相关的操作。netfilter总共设置了5个点,包括:

  • PREROUTING:刚刚进入网络层,还未进行路由查找的包,通过此处

  • INPUT:通过路由查找,确定发往本机的包,通过此处

  • FORWARD:经路由查找后,要转发的包,在POST_ROUTING之前

  • OUTPUT:从本机进程刚发出的包,通过此处

  • POSTROUTING:进入网络层已经经过路由查找,确定转发,将要离开本设备的包,通过此处

当一个数据包进入网卡,经过链路层之后进入网络层就会到达PREROUTING,接着根据目标IP地址进行路由查找,如果目标IP是本机,数据包继续传递到INPUT上,经过协议栈后根据端口将数据送到相应的应用程序。

应用程序处理请求后将响应数据包发送到OUTPUT,最终通过POSTROUTING后发送出网卡

如果目标IP不是本机,而且服务器开启了forward参数,就会将数据包传递给FORWARD,最后通过POSTROUTING后发送出网卡。

LVS基础原理

LVS是基于netfilter框架,主要工作于INPUT链上,在INPUT上注册ip_vs_inHOOK函数,进行IPVS主流程,大概原理如图:

流程如下:

  • 当用户访问www.sina.com.cn时,用户数据通过层层网络,最后通过交换机进入LVS服务器网卡,并进入内核网络层
  • 进入PREROUTING后经过路由查找,确定访问的目标IP是本机IP地址,所以数据包进入到INPUT链上
  • LVS是工作在INPUT链上,会根据访问的IP:Port判断请求是否是LVS服务,如果是则进行LVS主流程,强行修改数据包的相关数据,并将数据包发往POSTROUTING链上
  • POSTROUTING上收到数据包后,根据目标IP地址(后端真实服务器),通过路由选路,将数据包最终发往后端的服务器上

开源LVS版本有3中工作模式,每种模式工作原理都不同,每种模式都有自己的优缺点和不同的应用场景,包括以下三种模式:

  • DR模式
  • NAT模式
  • Tunnel模式

DR模式实现原理

LVS基本原理图中描述的比较简单,是比较通用的流程。以下针对DR模式的具体实现原理,进行详细的阐述:

工作原理

其实DR是最常用的工作模式,因为它强大的性能。以下尝试以某个请求和响应数据流的过程来描述DR模式的工作原理:

  1. 当客户端请求www.sina.com.cn主页,请求数据包穿过网络到达Sina的LVS服务器网卡:源IP是客户端IP地址CIP,目的IP是新浪对外的服务器IP地址,也就是VIP;此时源MAC地址是CMAC,其实是LVS连接的路由器的MAC地址,目标MAC地址是VIP对应的MAC,记为VMAC

  2. 数据包经过链路层到达PREROUTING位置(刚进入网络层),查找路由发现目的IP是LVS的VIP,就会递送到INPUT链上,此时数据包MAC、IP、Port都没有修改

  3. 数据包到达INPUT链,INPUT是LVS主要工作的位置。此时LVS会根据目的IP和Port来确认是否是LVS定义的服务,如果是,就会根据配置信息,从真实服务器列表中选择一个作为RS1,然后以RS1作为目标查找Out方向的路由,确定一下跳信息以及数据包要通过哪个网卡发出。最后将数据包投递到OUTPUT链上。

  4. 数据包通过POSTROUTING链后,从网络层转到链路层,将目的MAC地址修改为RealServer服务器MAC地址,记为RMAC;而源MAC地址修改为LVS与RS同网段的selfIP对应的MAC地址,记为DMAC。此时,数据包通过交换机转发给了RealServer服务器(注:图中没有画交换机)

  5. 请求数据包到达后端真实服务器后,链路层检查目的MAC是自己的网卡地址。到了网络层,查找路由,目的IP是VIP(IO上配置了VIP),判定是本地主机的数据包,经过协议栈拷贝至应用程序(比如nginx服务器),nginx响应请求后,产生响应数据包。

    然后以CIP查找出方向的路由,确定下一跳信息和发送网卡设备信息。此时数据包源、目的IP分别是VIP、CIP,而源MAC地址是RS1的RMAC,目的MAC是下一跳(路由器)的MAC地址,记为CMAC。然后数据包通过RS相连的路由器转发给真正客户端,完成了请求响应的全流程。

从整个过程可以看出,DR模式LVS逻辑比较简单,数据包通过直接路由方式转发给后端服务器,而且响应数据包是由RS服务器直接发送给客户端,不经过LVS。

通常请求数据包会比较小,响应报文较大,经过LVS的数据包基本上都是小包,所以这也是LVS的DR模式性能强大的主要原因。

优缺点

优点:

  1. 响应数据不经过lvs,性能高
  2. 对数据包修改小,信息保存完整(携带客户端源IP)

缺点:

  1. lvs与rs必须在同一个物理网络(不支持跨机房)
  2. 服务器上必须配置Io和其他内核参数
  3. 不支持端口映射
使用场景

如果对性能要求非常高,可以首选DR模式,而且可以透传客户端源IP地址

NAT模式实现原理

lvs的第二种工作模式是NAT模式,下图详细介绍了数据包从客户端进入lvs后转发到rs,后经rs再次将响应数据转发给lvs,由lvs将数据包回复给客户端的整个过程。

实现原理
  1. 用户请求数据包经过层层网络,到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP
  2. 经过网卡进入网络层prerouting位置,根据目的IP查找路由,确认是本机IP,将数据包转发到INPUT上,此时源、目的IP都未发生变化
  3. 到达lvs后,通过目的IP和目的port查找是否为IPVS服务。若是IPVS服务,则会选择一个RS作为后端服务器,将数据包目的IP修改为RIP,并以RIP为目的IP查找路由信息,确定下一跳和出口信息,将数据包转发至output上
  4. 修改后的数据包经过postrouting和链路层处理后,到达RS服务器,此时的数据包源IP是CIP,目的IP是RIP
  5. 到达RS服务器的数据包经过链路层和网络层检查后,被送往用户空间nginx程序。nginx程序处理完毕,发送响应数据包,由于RS上的默认网关配置为lvs设备IP,所以nginx服务器会将数据包转发至下一跳,也就是lvs服务器。此时数据包源IP是RIP,目的IP 是CIP。
  6. lvs服务器收到RS响应数据包后,根据路由查找,发现目的IP不是本机IP,且lvs服务器开启了转发模式,所以将数据包转发给forward链,此时数据包未作修改。
  7. lvs收到响应数据包后,根据目的IP和目的port查找服务和连接表,将源IP改为VIP,通过路由查找,确定下一跳和出口信息,将数据包发送至网关,经过复杂的网络到达用户客户端,最终完成了一次请求和响应的交互

NAT模式双向流量都经过LVS,因此NAT模式性能会存在一定的瓶颈。不过去其他模式的区别是:NAT支持端口映射,且支持Windows操作系统

优缺点和使用场景

优点:

1、支持Windows操作系统

2、支持端口映射,如果rs端口和vport不一致,lvs除了修改目的IP,也会修改dport以支持端口映射

缺点:

1、后端RS需要配置网关

2、双向流量对lvs负载压力比较大

使用场景

如果是Windows系统,使用lvs的话,则必须选择NAT模式了

Tunnel模式实现原理

Tunnel是一种单臂的模式,只有请求数据会经过lvs,响应数据直接从后端服务器发送给客户端,性能也很强大,同时支持跨机房。

实现原理
  1. 用户请求数据包经过多层网络,到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP
  2. 经过网卡进入网络层prerouting位置,根据目的IP查找路由,确认是本机IP,将数据包转发到input链上,到达lvs,此时源、目的IP都未发生变化
  3. 到达lvs后,通过目的IP和目的Port查找是否为IPVS服务。若是IPVS服务,则会选择一个RS作为后端服务器,以RIP为目的IP查找路由信息,确定下一跳,dev等信息,然后IP头部前边额外增加了一个IP头(以DIP为源,RIP为目的的IP),将数据包转发至output上
  4. 数据包根据路由信息经最终经过lvs网卡,发送至路由器网关,通过网络到达后端服务器
  5. 后端服务器收到数据包后,ipip模块将Tunnel头部卸载,正常看到的源IP是CIP,目的IP是VIP,由于在tunl0上配置VIP,路由查找后判断为本机IP,送往应用程序。应用程序nginx正常响应数据后以VIP为源IP,CIP为目的IP数据包发送出网卡,最终到达客户端。

Tunnel模式具备DR模式的高性能,又支持跨机房访问,听起来比较完美。不过由于国内运营商有一定的特色性,比如RS的响应数据包的源IP为VIP,VIP与后端服务器有可能存在跨运营商的情况,很有可能被运营商的策略封掉,Tunnel在生产环境确实没有使用过。

优缺点与使用场景

优点:

1、单臂模式,对lvs负载压力小

2、对数据包修改较小,信息保存完整

3、可跨机房

缺点:

1、需要在后端服务器安装配置ipip模块

2、需要在后端服务器tunl0配置vip

3、隧道头部的加入可能导致分片,影响服务器性能

4、隧道头部IP地址固定,后端服务器网卡hash可能不均

5、不支持端口映射

使用场景:

理论上,如果对转发性能要求较高,且有跨机房需求,可选Tunnel

标签:原图,负载,LVS,IP,均衡,服务器,图解,数据包
来源: https://www.cnblogs.com/Torres-tao/p/16260843.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有