全网最详尽的负载均衡原理图解

沙海 2021年3月9日01:44:04杂谈 Java评论100字数 7070阅读23分34秒阅读模式
摘要

速读摘要

速读摘要文章源自JAVA秀-https://www.javaxiu.com/2902.html

基于上述需求,我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户大量的请求流量均衡地分发到集群中不同的服务器上。硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。用户请求数据包经过层层网络,到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP。修改后的数据包经过postrouting和链路层处理后,到达RS服务器,此时的数据包源IP是CIP,目的IP是RIP。文章源自JAVA秀-https://www.javaxiu.com/2902.html

原文约 5337 | 图片 9 | 建议阅读 11 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解

程序IT圈 文章源自JAVA秀-https://www.javaxiu.com/2902.html

以下文章来源于编程修养,作者肖邦文章源自JAVA秀-https://www.javaxiu.com/2902.html

文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

编程修养文章源自JAVA秀-https://www.javaxiu.com/2902.html

作者从事 Linux 系统开发多年,公众号主要分享 Linux 实用技巧、算法、网络、高质量编程、高性能编程等方面的文章,欢迎关注!文章源自JAVA秀-https://www.javaxiu.com/2902.html

文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

负载均衡由来

在业务初期,我们一般会先使用单台服务器对外提供服务。随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单服务器的性能无法满足业务需求时,就需要把多台服务器组成集群系统提高整体的处理性能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

基于上述需求,我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户大量的请求流量均衡地分发到集群中不同的服务器上。这其实就是我们今天要说的负载均衡文章源自JAVA秀-https://www.javaxiu.com/2902.html

使用负载均衡可以给我们带来的几个好处:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 提高了系统的整体性能;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 提高了系统的扩展性;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 提高了系统的可用性;文章源自JAVA秀-https://www.javaxiu.com/2902.html

负载均衡类型

广义上的负载均衡器大概可以分为 3 类,包括:DNS 方式实现负载均衡、硬件负载均衡、软件负载均衡。文章源自JAVA秀-https://www.javaxiu.com/2902.html

(一)DNS 实现负载均衡文章源自JAVA秀-https://www.javaxiu.com/2902.html

DNS 实现负载均衡是最基础简单的方式。一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务器实例,这样就完成了流量的调度,虽然没有使用常规的负载均衡器,但实现了简单的负载均衡功能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

通过 DNS 实现负载均衡的方式,最大的优点就是实现简单,成本低,无需自己开发或维护负载均衡设备,不过存在一些缺点:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 服务器故障切换延迟大,服务器升级不方便。我们知道 DNS 与用户之间是层层的缓存,即便是在故障发生时及时通过 DNS 修改或摘除故障服务器,但中间经过运营商的 DNS 缓存,且缓存很有可能不遵循 TTL 规则,导致 DNS 生效时间变得非常缓慢,有时候一天后还会有些许的请求流量。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 流量调度不均衡,粒度太粗。DNS 调度的均衡性,受地区运营商 LocalDNS 返回 IP 列表的策略有关系,有的运营商并不会轮询返回多个不同的 IP 地址。另外,某个运营商 LocalDNS 背后服务了多少用户,这也会构成流量调度不均的重要因素。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 流量分配策略太简单,支持的算法太少。DNS 一般只支持 rr 的轮询方式,流量分配策略比较简单,不支持权重、Hash 等调度算法。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • DNS 支持的 IP 列表有限制。我们知道 DNS 使用 UDP 报文进行信息传递,每个 UDP 报文大小受链路的 MTU 限制,所以报文中存储的 IP 地址数量也是非常有限的,阿里 DNS 系统针对同一个域名支持配置 10 个不同的 IP 地址。文章源自JAVA秀-https://www.javaxiu.com/2902.html

实际上生产环境中很少使用这种方式来实现负载均衡,毕竟缺点很明显。文中之所以描述 DNS 负载均衡方式,是为了能够更清楚地解释负载均衡的概念。文章源自JAVA秀-https://www.javaxiu.com/2902.html

像 BAT 体量的公司一般会利用 DNS 来实现地理级别的全局负载均衡,实现就近访问,提高访问速度,这种方式一般是入口流量的基础负载均衡,下层会有更专业的负载均衡设备实现的负载架构。文章源自JAVA秀-https://www.javaxiu.com/2902.html

(二)硬件负载均衡文章源自JAVA秀-https://www.javaxiu.com/2902.html

硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有两款:F5A10文章源自JAVA秀-https://www.javaxiu.com/2902.html

这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。文章源自JAVA秀-https://www.javaxiu.com/2902.html

硬件负载均衡的优点:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 性能强大:性能远超常见的软件负载均衡器。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 安全防护:还具备防火墙、防 DDoS 攻击等安全功能,以及支持 SNAT 功能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

硬件负载均衡的缺点也很明显:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 价格贵;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 扩展性差,无法进行扩展和定制;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 调试和维护比较麻烦,需要专业人员;文章源自JAVA秀-https://www.javaxiu.com/2902.html

(三)软件负载均衡文章源自JAVA秀-https://www.javaxiu.com/2902.html

软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有 NginxHAproxyLVS。其中的区别:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • Nginx:七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • HAproxy:支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • LVS:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。文章源自JAVA秀-https://www.javaxiu.com/2902.html

软件负载均衡的优点:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 易操作:无论是部署还是维护都相对比较简单;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 便宜:只需要服务器的成本,软件是免费的;文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 灵活:4 层和 7 层负载均衡可以根据业务特点进行选择,方便进行扩展和定制功能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

负载均衡LVS

软件负载均衡主要包括:Nginx、HAproxy 和 LVS,三款软件都比较常用。四层负载均衡基本上都会使用 LVS,据了解 BAT 等大厂都是 LVS 重度使用者,就是因为 LVS 非常出色的性能,能为公司节省巨大的成本。文章源自JAVA秀-https://www.javaxiu.com/2902.html

LVS,全称 Linux Virtual Server 是由国人章文嵩博士发起的一个开源的项目,在社区具有很大的热度,是一个基于四层、具有强大性能的反向代理服务器。文章源自JAVA秀-https://www.javaxiu.com/2902.html

它现在是标准内核的一部分,它具备可靠性、高性能、可扩展性和可操作性的特点,从而以低廉的成本实现最优的性能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

Netfilter基础原理

LVS 是基于 Linux 内核中 netfilter 框架实现的负载均衡功能,所以要学习 LVS 之前必须要先简单了解 netfilter 基本工作原理。netfilter 其实很复杂,平时我们说的 Linux 防火墙就是 netfilter,不过我们平时操作的都是 iptables,iptables 只是用户空间编写和传递规则的工具而已,真正工作的是 netfilter。通过下图可以简单了解下 netfilter 的工作机制:文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

netfilter 是内核态的 Linux 防火墙机制,作为一个通用、抽象的框架,提供了一整套的 hook 函数管理机制,提供诸如数据包过滤、网络地址转换、基于协议类型的连接跟踪的功能。文章源自JAVA秀-https://www.javaxiu.com/2902.html

通俗点讲,就是 netfilter 提供一种机制,可以在数据包流经过程中,根据规则设置若干个关卡(hook 函数)来执行相关的操作。netfilter 总共设置了 5 个点,包括:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • PREROUTING :刚刚进入网络层,还未进行路由查找的包,通过此处文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • INPUT :通过路由查找,确定发往本机的包,通过此处文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • FORWARD :经路由查找后,要转发的包,在POST_ROUTING之前文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • OUTPUT :从本机进程刚发出的包,通过此处文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • POSTROUTING :进入网络层已经经过路由查找,确定转发,将要离开本设备的包,通过此处文章源自JAVA秀-https://www.javaxiu.com/2902.html

当一个数据包进入网卡,经过链路层之后进入网络层就会到达 PREROUTING,接着根据目标 IP 地址进行路由查找,如果目标 IP 是本机,数据包继续传递到 INPUT 上,经过协议栈后根据端口将数据送到相应的应用程序。文章源自JAVA秀-https://www.javaxiu.com/2902.html

应用程序处理请求后将响应数据包发送到 OUTPUT 上,最终通过 POSTROUTING 后发送出网卡。文章源自JAVA秀-https://www.javaxiu.com/2902.html

如果目标 IP 不是本机,而且服务器开启了 forward 参数,就会将数据包递送给 FORWARD 上,最后通过 POSTROUTING 后发送出网卡。文章源自JAVA秀-https://www.javaxiu.com/2902.html

LVS基础原理

LVS 是基于 netfilter 框架,主要工作于 INPUT 链上,在 INPUT 上注册 ip_vs_in HOOK 函数,进行 IPVS 主流程,大概原理如图所示:文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 当用户访问 www.sina.com.cn 时,用户数据通过层层网络,最后通过交换机进入 LVS 服务器网卡,并进入内核网络层。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • 进入 PREROUTING 后经过路由查找,确定访问的目的 VIP 是本机 IP 地址,所以数据包进入到 INPUT 链上文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • LVS 是工作在 INPUT 链上,会根据访问的 IP:Port 判断请求是否是 LVS 服务,如果是则进行 LVS 主流程,强行修改数据包的相关数据,并将数据包发往 POSTROUTING 链上。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • POSTROUTING 上收到数据包后,根据目标 IP 地址(后端真实服务器),通过路由选路,将数据包最终发往后端的服务器上。文章源自JAVA秀-https://www.javaxiu.com/2902.html

开源 LVS 版本有 3 种工作模式,每种模式工作原理都不同,每种模式都有自己的优缺点和不同的应用场景,包括以下三种模式:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • DR 模式文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • NAT 模式文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • Tunnel 模式文章源自JAVA秀-https://www.javaxiu.com/2902.html

这里必须要提另外一种模式是 FullNAT,这个模式在开源版本中是模式没有的。这个模式最早起源于百度,后来又在阿里发扬光大,由阿里团队开源,代码地址如下:文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • https://github.com/alibaba/lvs文章源自JAVA秀-https://www.javaxiu.com/2902.html

LVS 官网也有相关下载地址,不过并没有合进到内核主线版本。文章源自JAVA秀-https://www.javaxiu.com/2902.html

后面会有专门章节详细介绍 FullNAT 模式。下边分别就 DR、NAT、Tunnel 模式分别详细介绍原理。文章源自JAVA秀-https://www.javaxiu.com/2902.html

DR 模式实现原理

LVS 基本原理图中描述的比较简单,表述的是比较通用流程。下边会针对 DR 模式的具体实现原理,详细的阐述 DR 模式是如何工作的。文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

其实 DR 是最常用的工作模式,因为它的强大的性能。下边试图以某个请求和响应数据流的过程来描述 DR 模式的工作原理文章源自JAVA秀-https://www.javaxiu.com/2902.html

(一)实现原理过程文章源自JAVA秀-https://www.javaxiu.com/2902.html

当客户端请求 www.sina.com.cn 主页,请求数据包穿过网络到达 Sina 的 LVS 服务器网卡:源 IP 是客户端 IP 地址 CIP,目的 IP 是新浪对外的服务器 IP 地址,也就是 VIP;此时源 MAC 地址是 CMAC,其实是 LVS 连接的路由器的 MAC 地址(为了容易理解记为 CMAC),目标 MAC 地址是 VIP 对应的 MAC,记为 VMAC文章源自JAVA秀-https://www.javaxiu.com/2902.html

数据包经过链路层到达 PREROUTING 位置(刚进入网络层),查找路由发现目的 IP 是 LVS 的 VIP,就会递送到 INPUT 链上,此时数据包 MAC、IP、Port 都没有修改。文章源自JAVA秀-https://www.javaxiu.com/2902.html

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

数据包通过 POSTROUTING 链后,从网络层转到链路层,将目的 MAC 地址修改为 RealServer 服务器 MAC 地址,记为 RMAC;而源 MAC 地址修改为 LVS 与 RS 同网段的 selfIP 对应的 MAC 地址,记为 DMAC。此时,数据包通过交换机转发给了 RealServer 服务器(注:为了简单图中没有画交换机)。文章源自JAVA秀-https://www.javaxiu.com/2902.html

请求数据包到达后端真实服务器后,链路层检查目的 MAC 是自己网卡地址。到了网络层,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主机的数据包,经过协议栈拷贝至应用程序(比如 nginx 服务器),nginx 响应请求后,产生响应数据包。文章源自JAVA秀-https://www.javaxiu.com/2902.html

然后以 CIP 查找出方向的路由,确定下一跳信息和发送网卡设备信息。此时数据包源、目的 IP 分别是 VIP、CIP,而源 MAC 地址是 RS1 的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,记为 CMAC(为了容易理解,记为 CMAC)。然后数据包通过 RS 相连的路由器转发给真正客户端,完成了请求响应的全过程。文章源自JAVA秀-https://www.javaxiu.com/2902.html

从整个过程可以看出,DR 模式 LVS 逻辑比较简单,数据包通过直接路由方式转发给后端服务器,而且响应数据包是由 RS 服务器直接发送给客户端,不经过 LVS。文章源自JAVA秀-https://www.javaxiu.com/2902.html

我们知道通常请求数据包会比较小,响应报文较大,经过 LVS 的数据包基本上都是小包,所以这也是 LVS 的 DR 模式性能强大的主要原因。文章源自JAVA秀-https://www.javaxiu.com/2902.html

(二)优缺点和使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • DR 模式的优点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. 响应数据不经过 lvs,性能高文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 对数据包修改小,信息保存完整(携带客户端源 IP)文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • DR 模式的缺点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. lvs 与 rs 必须在同一个物理网络(不支持跨机房)文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 服务器上必须配置 lo 和其它内核参数文章源自JAVA秀-https://www.javaxiu.com/2902.html

  3. 不支持端口映射文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • DR 模式的使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

如果对性能要求非常高,可以首选 DR 模式,而且可以透传客户端源 IP 地址。文章源自JAVA秀-https://www.javaxiu.com/2902.html

NAT 模式实现原理

lvs 的第 2 种工作模式是 NAT 模式,下图详细介绍了数据包从客户端进入 lvs 后转发到 rs,后经 rs 再次将响应数据转发给 lvs,由 lvs 将数据包回复给客户端的整个过程。文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

(一)实现原理与过程文章源自JAVA秀-https://www.javaxiu.com/2902.html

① 用户请求数据包经过层层网络,到达 lvs 网卡,此时数据包源 IP 是 CIP,目的 IP 是 VIP。文章源自JAVA秀-https://www.javaxiu.com/2902.html

经过网卡进入网络层 prerouting 位置,根据目的 IP 查找路由,确认是本机 IP,将数据包转发到 INPUT 上,此时源、目的 IP 都未发生变化。文章源自JAVA秀-https://www.javaxiu.com/2902.html

③ 到达 lvs 后,通过目的 IP 和目的 port 查找是否为 IPVS 服务。若是 IPVS 服务,则会选择一个 RS 作为后端服务器,将数据包目的 IP 修改为 RIP,并以 RIP 为目的 IP 查找路由信息,确定下一跳和出口信息,将数据包转发至 output 上。文章源自JAVA秀-https://www.javaxiu.com/2902.html

④ 修改后的数据包经过 postrouting 和链路层处理后,到达 RS 服务器,此时的数据包源 IP 是 CIP,目的 IP 是 RIP。文章源自JAVA秀-https://www.javaxiu.com/2902.html

⑤ 到达 RS 服务器的数据包经过链路层和网络层检查后,被送往用户空间 nginx 程序。nginx 程序处理完毕,发送响应数据包,由于 RS 上默认网关配置为 lvs 设备 IP,所以 nginx 服务器会将数据包转发至下一跳,也就是 lvs 服务器。此时数据包源 IP 是 RIP,目的 IP 是 CIP。文章源自JAVA秀-https://www.javaxiu.com/2902.html

⑥ lvs 服务器收到 RS 响应数据包后,根据路由查找,发现目的 IP 不是本机 IP,且 lvs 服务器开启了转发模式,所以将数据包转发给 forward 链,此时数据包未作修改。文章源自JAVA秀-https://www.javaxiu.com/2902.html

⑦ lvs 收到响应数据包后,根据目的 IP 和目的 port 查找服务和连接表,将源 IP 改为 VIP,通过路由查找,确定下一跳和出口信息,将数据包发送至网关,经过复杂的网络到达用户客户端,最终完成了一次请求和响应的交互。文章源自JAVA秀-https://www.javaxiu.com/2902.html

NAT 模式双向流量都经过 LVS,因此 NAT 模式性能会存在一定的瓶颈。不过与其它模式区别的是,NAT 支持端口映射,且支持 windows 操作系统。文章源自JAVA秀-https://www.javaxiu.com/2902.html

(二)优点、缺点与使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • NAT 模式优点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. 能够支持 windows 操作系统文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 支持端口映射。如果 rs 端口与 vport 不一致,lvs 除了修改目的 IP,也会修改 dport 以支持端口映射。文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • NAT 模式缺点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. 后端 RS 需要配置网关文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 双向流量对 lvs 负载压力比较大文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • NAT 模式的使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

如果你是 windows 系统,使用 lvs 的话,则必须选择 NAT 模式了。文章源自JAVA秀-https://www.javaxiu.com/2902.html

Tunnel 模式实现原理

Tunnel 模式在国内使用的比较少,不过据说腾讯使用了大量的 Tunnel 模式。它也是一种单臂的模式,只有请求数据会经过 lvs,响应数据直接从后端服务器发送给客户端,性能也很强大,同时支持跨机房。下边继续看图分析原理。文章源自JAVA秀-https://www.javaxiu.com/2902.html

全网最详尽的负载均衡原理图解文章源自JAVA秀-https://www.javaxiu.com/2902.html

(一)实现原理与过程文章源自JAVA秀-https://www.javaxiu.com/2902.html

① 用户请求数据包经过多层网络,到达 lvs 网卡,此时数据包源 IP 是 cip,目的 ip 是 vip。文章源自JAVA秀-https://www.javaxiu.com/2902.html

② 经过网卡进入网络层 prerouting 位置,根据目的 ip 查找路由,确认是本机 ip,将数据包转发到 input 链上,到达 lvs,此时源、目的 ip 都未发生变化。文章源自JAVA秀-https://www.javaxiu.com/2902.html

③ 到达 lvs 后,通过目的 ip 和目的 port 查找是否为 IPVS 服务。若是 IPVS 服务,则会选择一个 rs 作为后端服务器,以 rip 为目的 ip 查找路由信息,确定下一跳、dev 等信息,然后 IP 头部前边额外增加了一个 IP 头(以 dip 为源,rip 为目的 ip),将数据包转发至 output 上。文章源自JAVA秀-https://www.javaxiu.com/2902.html

④ 数据包根据路由信息经最终经过 lvs 网卡,发送至路由器网关,通过网络到达后端服务器。文章源自JAVA秀-https://www.javaxiu.com/2902.html

⑤ 后端服务器收到数据包后,ipip 模块将 Tunnel 头部卸载,正常看到的源 ip 是 cip,目的 ip 是 vip,由于在 tunl0 上配置 vip,路由查找后判定为本机 ip,送往应用程序。应用程序 nginx 正常响应数据后以 vip 为源 ip,cip 为目的 ip 数据包发送出网卡,最终到达客户端。文章源自JAVA秀-https://www.javaxiu.com/2902.html

Tunnel 模式具备 DR 模式的高性能,又支持跨机房访问,听起来比较完美。不过国内运营商有一定特色性,比如 RS 的响应数据包的源 IP 为 VIP,VIP 与后端服务器有可能存在跨运营商的情况,很有可能被运营商的策略封掉,Tunnel 在生产环境确实没有使用过,在国内推行 Tunnel 可能会有一定的难度吧。文章源自JAVA秀-https://www.javaxiu.com/2902.html

(二)优点、缺点与使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • Tunnel 模式的优点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. 单臂模式,对 lvs 负载压力小文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 对数据包修改较小,信息保存完整文章源自JAVA秀-https://www.javaxiu.com/2902.html

  3. 可跨机房(不过在国内实现有难度)文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • Tunnel 模式的缺点文章源自JAVA秀-https://www.javaxiu.com/2902.html

  1. 需要在后端服务器安装配置 ipip 模块文章源自JAVA秀-https://www.javaxiu.com/2902.html

  2. 需要在后端服务器 tunl0 配置 vip文章源自JAVA秀-https://www.javaxiu.com/2902.html

  3. 隧道头部的加入可能导致分片,影响服务器性能文章源自JAVA秀-https://www.javaxiu.com/2902.html

  4. 隧道头部 IP 地址固定,后端服务器网卡 hash 可能不均文章源自JAVA秀-https://www.javaxiu.com/2902.html

  5. 不支持端口映射文章源自JAVA秀-https://www.javaxiu.com/2902.html

  • Tunnel 模式的使用场景文章源自JAVA秀-https://www.javaxiu.com/2902.html

理论上,如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择。文章源自JAVA秀-https://www.javaxiu.com/2902.html

到此为止,已经将 LVS 原理讲清楚了,内容比较多,建议多看两遍,由于文章篇幅太长,实践操作的内容就放到下篇文章再来讲好了。文章源自JAVA秀-https://www.javaxiu.com/2902.html

推荐阅读:文章源自JAVA秀-https://www.javaxiu.com/2902.html

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:关注公众号并回复 java 领取,更多内容陆续奉上。
文章源自JAVA秀-https://www.javaxiu.com/2902.html

明天见(。・ω・。)ノ♡文章源自JAVA秀-https://www.javaxiu.com/2902.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定