LVS及DR模式原理

✅文字很长,但都说的是人话,无晦涩难懂的字眼。
✅作者水平有限,有问题请评论区指教,勿喷。

LVS是什么

LVS: 是Linux Virtual Server的简写,也就是Linux 虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。官方网站 :http://www.linuxvirtualserver.org

它是纯 4 层负载均衡,运行在内核态,性能是软件负载均衡中最高的

Nginx :支持 4 层 / 7 层负载均衡,支持 HTTP、E-mail 协议;
LVS :纯 4 层负载均衡,运行在内核态,性能是软件负载均衡中最高的;
HAproxy :是 7 层负载均衡软件,支持 7 层规则的设置,性能也不错;

LVS组成

LVS 由两部分程序组成,包括 ipvs 和 ipvsadm。

  1. **ipvs(ip virtual server):**LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。
  2. **ipvsadm:**ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于
    netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那 ipvsadm 就是类似 iptables 工具的地位。
    ipvsadm作用:
    • 主要用于多服务器的负载均衡;
    • 工作在网络层,可实现高性能,高可用的服务器集群技术;
    • 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器;
    • 易用,配置简单,有多种负载均衡的方法;
    • 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果;
    • 可扩展性好;

LVS概念术语

  • 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 地址。

DR工作原理(长文警告)

在这里插入图片描述

  • 0:当客户端请求主页,经过 DNS 解析到 IP (目的ip)后,向页面服务器(RealServer)发送请求数据,数据包首先要经过路由器路由,这时候路由器是有一个网络(R0IP)与我们的客户端同网段,因此数据包的源ip就是客户机ip(CIP),源MAC是客户机MAC(CMAC),目的IP依然是我们DNS给的IP(VIP),目的MAC就是路由器eth0上的MAC(R0MAC)
  • 1:路由器经过ARP广播发现有一个LVS的IP是VIP,我们发现有还有两台真实提供服务的服务器lo网卡上也绑定了VIP,但是实际上是修改了内核参数,不会响应ARP的,因此路由器只会发现LVS。此时路由器要对外发送数据包了,通过eth1网卡发送,源IP,目的IP不变,源MAC变为R1MAC,目的MAC则为LVS的VIP绑定的网卡MAC(VMAC)
  • 2:此时进入LVS内部,首先经过数据链路层到达 PREROUTING 位置(刚进入网络层),查找路由发现目的 IP 是LVS 的 VIP(确实是找自己的),就会递送到 INPUT 链上(否则直接走FORWARD),此时数据包 MAC、IP、Port 都没有修改。
  • 3:数据包到达 INPUT 链(INPUT 是 LVS 主要工作的位置,也就是不用再进入应用层了,直接在内核层就处理好了)。此时 LVS 会根据目的 IP 和 Port 来确认是否是 LVS 定义的服务,如果是定义过的 VIP 服务,就会根据配置的 Service 信息,从RealServer 中选择一个作为后端服务器RealServer( RS1/RS2……),假设选择以 RS1 作为目标查找 Out方向的路由,确定一下跳信息以及数据包要通过哪个网卡(DIP绑定的网卡)发出。最后将数据包通过 INET_HOOK 到 OUTPUT
    链上(Out 方向刚从四层进入网络层)。
  • 4:数据包通过 POSTROUTING 链后,从网络层转到链路层,将目的 MAC 地址修改为 刚选中的RealServer 服务器 MAC 地址,记为 RS1MAC;而源 MAC 地址修改为 LVS 与 RS 同网段的 selfIP 对应的 MAC 地址,记为DMAC。此时,数据包通过交换机转发给了 RealServer 服务器(注:为了简单图中没有画交换机)。
  • 5:请求数据包到达 RealServer 服务器后,链路层检查目的 MAC 是自己网卡地址(R1MAC)。到了网络层,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主机的数据包,经过协议栈后拷贝至应用程序(比如这里是nginx 服务器),nginx响应请求后,产生响应数据包。以目的 VIP 为 dst 查找 Out 路由,确定下一跳信息和发送网卡设备信息,发送数据包。此时数据包源IP为VIP,源 MAC地址是 RS1 的 RS1MAC,目的 IP 为CIP,目的 MAC 是下一跳(路由器)的 MAC 地址,记为 R1MAC。然后数据包通过 RS 相连的路由器转发给真正客户端(这里就不再原路返回了,直接从R1服务器发出去)。
  • 6:这里是实际上就是路由器僵数据包转发到内部的实际发起请求的主机上了。此时源IP为VIP,源MAC为R0MAC,目的IP为CIP,目的MAC为CMAC。至此,一次请求与服务应答完成。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐