LVS

一、netfilter基本原理

LVS 是基于 Linux 内核中 netfilter 框架实现的负载均衡系统,所以要学习 LVS 之前必须要先简单了解 netfilter 基本工作原理。netfilter 其实很复杂也很重要,平时我们说的 Linux 防火墙就是 netfilter,不过我们平时操作的都是 iptables,iptables 只是用户控件编写和传递规则的工具而已,真正工作的是 netfilter。通过下图可以简单了解下 netfilter 的工作机制:

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

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

  • PREROUTING:刚刚进入网络层,还未进行路由查找的包,通过此处
  • INPUT:通过路由查找,确定发往本机的包,通过此处
  • FORWARD:经过路由查找,要转发的包,在 POSTROUTING之前
  • OUTPUT:从本机进程刚发的包,通过此处
  • POSTROUTING:进入网络层已经经过路由查找,确定转发,将要离开本设备的包,通过此处

当一个数据包进入网卡,经过链路层之后进入网络层就会到达 PREROUTING ,接着根据目标IP地址进行路由查找,如果目标IP是本机,数据包继续传递到 INPUT 上,经过协议栈后根据目标端口将数据送到响应的应用程序;应用程序处理请求后将响应数据包发送到 OUTPUT 上,最终通过 POSTROUTING 后发送出网卡。如果目标IP不是本机,而且服务器开启了forward 参数,就会将数据包传递送给 FORWARD 上,最后通过 POSTROUTING 后发送出网卡。

二、LVS基本原理

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

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

开源 LVS 版本有3中工作模式,每种模式的工作原理截然不同,各种模式有各自的优缺点,分别适合不同的应用场景,不过最终本质的功能都是能够实现均衡的流量调度和良好的扩展性。主要包括以下三种模式:

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

另外必要要说的模式是FULLNAT,这个模式在开源版本中是没有的,代码没有合并进入内核主线版本。后面单独介绍 FullNAT 模式。

三、DR 模式实现原理

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。
  • ② 数据包到达网卡后,经过链路层到达 PREROUTING 未知(刚进入网络层),查找路由发现目标 IP 是 LVS 的 VIP,就会递送到 INPUT 链上,此时数据包 MAC、IP、Port 都没有修改。
  • ③ 数据包到达 INPUT 链,INPUT 是 LVS 主要工作的位置。此时 LVS 会根据目的 IP 和 Port 来确认是否是 LVS 定义的服务,如果是定义过的 VIP 服务,就会根据配置的 Service 信息,从 RealServer 中选择一个作为后端服务器 RS1,然后以 RS1 作为目标查找 Out 方向的路由,确定下一跳信息以及数据包要通过哪个网卡发出。最后将数据包通过 INET_HOOK 到 OUTPUT 链上(Out 方向刚从四层进入网络层)。
  • ④ 数据包通过 POSTROUTING 链后,从网络层转到链路层,将目的 MAC 地址修改为 RealServer 服务器 MAC 地址,记为 RMAC;而源 MAC 地址修改为 LVS与 RS 同网段的 selfIP 对应的 MAC 地址,记为 DMAC。此时,数据包通过交换机转发给 RealServer 服务器。
  • ⑤ 请求数据包到达 RealServer 服务器后,链路层检查目的 MAC 是自己网卡地址。到了网络层,查找路由,目的 IP 是 VIP(lo 上配置 VIP),判定是本机主机的数据包。经过协议栈后拷贝至应用程序(比如这里是 nginx 服务器),nginx 响应请求后,产生响应数据包。以目的 VIP 为 dst 查找 Out 路由,确定下一跳信息和发送网卡设备信息,发送数据包。此时数据包源、目的 IP 分别是 VIP、CIP,而源 MAC 地址是 RS1 的RMAC,目的 MAC 地址是下一跳(路由器)的 MAC地址,记为 CMAC,然后数据包通过 RS1 相连的路由器转发给真正客户端。
1
从整个过程可以看出,DR模式LVS逻辑非常简单,数据包通过路由方式直接转发给RS,而且响应数据包时由RS服务器直接发送给客户端,不经过LVS。我们知道一般请求数据包会比较小,响应报文较大,经过LVS的数据包基本上都是小包,上述几条因素是LVS的DR模式性能强大的主要原因。

优缺点和使用场景

  • DR模式的优点
    1. 响应数据不经过lvs,性能高
    2. 对数据包修改小,信息保存完整(携带客户端源IP)
  • DR模式的缺点
    1. lvs与rs必须在同一个物理网络,不支持跨机房
    2. rs上必须配置lo和其他内核参数
    3. 不支持端口映射
  • DR模式的使用场景
    如果对性能要求非常高,可以首选DR模式,而且可以穿透客户端源IP地址。

四、NAT 模式实现原理

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

实现原理与过程

  • ① 用户请求数据包经过层层网络,到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP。
  • ② 经过网卡进入网络层 PREROUTING 位置,根据目的的IP查找路由,确认是本机IP,将数据包转发到 INPUT 上,此时源、目的的IP都未发生变化。
  • ③ 到达lvs后,通过目的的IP和目的port查找是否为LVS服务。若是IPVS服务,则会选择一个RS作为后端服务器,将数据包的目的IP修改为RIP,并以RIP为目的IP查找路由信息,确定下一跳和出口信息,将数据包转发至output上。
  • ④ 修改后的数据包经过 POSTROUTING 和链路层处理后,到达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和目的port查找服务和连接表,将源IP改为VIP,通过路由查找,确定下一跳和出口信息,将数据包发送至网关,经过复杂的网络到达用户客户端,最红完成了一次请求和响应的交互。
1
NAT模式双向流量都经过LVS,因此NAT模式性能会存在一定的瓶颈。不过与其他模式区别的事,NAT支持端口映射,且支持Windows操作系统。

优缺点和使用场景

  • NAT模式的优点
    1. 能够支持windows操作系统
    2. 支持端口映射。如果rs端口与vport不一致,lvs除了修改目的ip,也会修改dport以支持端口映射
  • NAT模式的缺点
    1. 后端rs需要配置网关
    2. 双向流量对lvs负载压力比较大
  • NAT模式的使用场景
    windows系统,使用lvs,必须选择lvs模式。

五、Tunnel 模式实现原理

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

实现原理与过程

  • ① 用户请求数据包经过层层网络,到达lvs网卡,此时数据包源IP是cip,目的IP是VIP。
  • ② 经过网卡进入网络层 PREROUTIONG 位置,根据目的ip查找路由,确认是本机IP,将数据包转发到INPUT链上,到达lvs,此时源、目的ip
    都未发生变化。
  • ③ 到达lvs后,通过目的ip和目的port查找是否为IPVS服务。若是IPVS服务,则会选择一个rs作为后端服务器,以rip为目的ip查找路由信息,确定下一跳、dev等信息,然后IP头部前边额外增加一个IP头(以dip为源,rip为目的ip),将数据包转发至OUTPUT 上。
  • ④ 数据包根据路由信息最终经过lvs网卡,发送至路由器网关,通过网络到达后端服务器。
  • ⑤ 后端服务器收到数据包后,ipip模块将Tunnel头部卸载,正常看到源ip是cip,目的ip是vip,由于在tunl0上配置vip,路由查找后判定为本机ip,送往应用程序。应用程序nginx正常响应数据后以vip为源ip,cip为目的ip的数据包发送至网卡,最终到达客户。
1
Tunnel模式具备DR模式的高性能,又支持跨机房访问,听起来比较完美。不过国内运营商有一定特色型,比如RS的响应数据包的源IP为VIP,VIP与后端服务器可能存在跨运营商的情况,有可能被运营商的策略封掉。

优缺点和使用场景

  • Tunnel模式的优点
    1. 单臂模式,对lvs负载压力小
    2. 对数据包修改脚下,信息保存完整
    3. 可跨机房(国内实现有难度)
  • Tunnel模式的缺点
    1. 需要在后端服务器安装配置ipip模块
    2. 需要在后端服务器tunl0配置vip
    3. 隧道头部的加入可能导致分片,影响服务器性能
    4. 隧道头部IP地址固定,后端服务器网卡hash可能不均
    5. 不支持端口映射
  • Tunnel模式的使用场景
    理论上,如果对转发性能要求很高,且有跨机房需求,Tunnel可能是较好的选择。

六、涉及的概念术语

1
2
3
4
5
6
7
8
CIP:Client IP,表示的是客户端 IP 地址。
VIP:Virtual IP,表示负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
RIP:RealServer IP,表示负载均衡后端的真实服务器 IP 地址。
DIP:Director IP,表示负载均衡与后端服务器通信的 IP 地址。
CMAC:客户端的 MAC 地址,准确的应该是 LVS 连接的路由器的 MAC 地址。
VMAC:负载均衡 LVS 的 VIP 对应的 MAC 地址。
DMAC:负载均衡 LVS 的 DIP 对应的 MAC 地址。
RMAC:后端真实服务器的 RIP 地址对应的 MAC 地址。
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • © 2020 ChpiTer
  • Powered by Hexo Theme Ayer

请我喝杯咖啡吧~

支付宝
微信