首页 > 技术文章 > LVS集群

fangxinxin 2021-05-05 17:01 原文

LVS

LVS概念

简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统。

宗旨

  • 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
  • 很好的可伸缩性(Scalability)
  • 很好的可靠性(Reliability)
  • 很好的可管理性(Manageability)

运作流程

终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。

结构图:

相关名词

缩写 名称
调度器 director,dispatcher,balancer
RS Real Server(后端真实提供服务主机)
CIP Client IP(客户访问的IP)
VIP Director Virtual IP(提供外网访问的虚拟IP)
DIP Director IP(虚拟IP主机上的真实IP)
RIP Real Server IP(后端真实提供服务主机的IP)

管理工具

  • ipvsadm/ipvs(让用户定义规则)
  • ipvsadm:用户空间的命令行工具,用于管理集群服务(即规则的增删查改)

支持TCP,UDP,AH,EST,AH_EST,SCTP等诸多协议

LVS原理

LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,IPVS 是 LVS集群系统的核心软件,它的主要作用是:安装在 Director Server 上,同时在 Director Server上虚拟出一个IP 地址,用户必须通过这个虚拟的 IP 地址访问服务器。这个虚拟 IP 一般称为 LVS 的VIP,即 Virtual IP。访问的请求首先经过 VIP 到达负载调度器,然后由负载调度器从Real Server 列表中选取一个服务节点响应用户的请求。 在用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的 Real Server 节点,而 Real Server节点如何返回数据给用户,是 IPVS 实现的重点技术。

LVS工作模式

可伸缩网络结构都与需要一个前端负载调度器负责分配。
基于NAT(网络地址转换)的负载均衡技术:

  • VS/NAT路由转发模式(Virtual Server via Network Address Translation)
  • VS/TUN IP隧道模式(Virtual Server via IP Tunneling)
  • VS/DR直接路由模式(Virtual Server via Direct Routing)
  • VS/FULLNAT

1.NAT:路由转发模式

  • NAT(Network Address Translation)是一种外网和内网地址映射的技术。
  • 多目标的DNAT(iptables)转换;它通过修改请求报文的目标IP地址(同时可能会修改目标端口)挑选出某Real Server的RIP地址实现转发; 在LVS负载均衡调度器上请求先发送给PREROUTING-->INPUT,然后经由监听在INPUT上的LVS程序强制将请求转发给 POSTROUTING
  • NAT 模式下,网络报的进出都要经过 LVS 的处理。LVS 需要作为 RS 的网关。当包到达 LVS 时,LVS 做目标地址转换(DNAT),将目标 IP 改为 RS 的 IP。RS 接收到包以后,仿佛是客户端直接发给它的一样。
  • RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。

这时 RS 的包通过网关(LVS)中转,LVS 会做源地址转换(SNAT),将包的源地址改为 VIP,这样,这个包对客户端看起来就仿佛是 LVS 直接返回给它的。客户端无法感知到后端 RS 的存在。

注意

  • RS的RIP和Director的DIP必须在同一IP网络
  • RS和DIP应该使用私网地址,且RD的网关要指向DIP
  • 真实服务器的网关必须设置为LVS的ip地址。

2.DR:直接路由模式

  • 请求由 LVS 接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过 LVS
  • DR 模式下需要 LVS 和绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)。
  • 一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。
  • RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。
    而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。

DR 模式是性能最好的一种模式。

3.TUN:隧道模式

LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如图3所示。
其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

注意

  • TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址
  • TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内
  • TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了
  • TUNNEL 模式走的隧道模式,一般不用。
  • 需要设置lo接口的VIP不能在公网上出现

4.FULLNAT模式

引入:无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关

改进:相比NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:

  • 在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
  • 内网 IP 之间可以通过多个交换机跨 VLAN 通信。
  • 当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
  • LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。

Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。

fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次

LVS负载均衡的算法

  1. 轮叫调度 rr
    均等地对待每一台服务器,不管服务器上的实际连接数和系统负载

  2. 加权轮叫 wrr
    调度器可以自动问询真实服务器的负载情况,并动态调整权值

  3. 最少链接 lc
    动态地将网络请求调度到已建立的连接数最少的服务器上
    如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡

  4. 加权最少链接 wlc
    调度器可以自动问询真实服务器的负载情况,并动态调整权值
    带权重的谁不干活就给谁分配,机器配置好的权重高

  5. 基于局部性的最少连接调度算法 lblc
    这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

  6. 复杂的基于局部性最少的连接算法 lblcr
    记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

  7. 目标地址散列调度算法 dh
    该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

  8. 源地址散列调度算法 sh
    与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

  9. 最少期望延迟 sed
    不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙

  10. 永不排队 nq
    无需队列,如果有realserver的连接数为0就直接分配过去

推荐阅读