1. Linux Virtual Server 简介

LVS官网
LVS:Linux Virtual Server,负载调度器,是一个虚拟的服务器集群系统,linux内核集成,该项目由章文嵩博士成立,(花名 正明), 阿里的四层 SLB(Server Load Balance) 就是基于 LVS + keepalived 实现。

1.1 LVS集群相关术语

  • VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer
  • RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
  • CIP:Client IP
  • VIP:Virtual serve IP VS外网的IP DIP:Director IP VS内网的IP
  • RIP:Real server IP

访问流程:CIP <--> VIP == DIP <--> RIP

1.2 LVS工作原理

LVS 集群采用IP负载均衡技术和基于内容请求分发技术。由于 LVS 是内核级功能,所以具有很好的吞吐率,将请求均衡地转移到不同的 RS 上执行,且调度器自动对后端服务器进行心跳检测,一旦发现 RS 故障会自动将其屏蔽,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
VS根据请求报文的目标VIP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选 RS。LVS 工作在 INPUT 链的位置,将发往 INPUT 的流量进行拦截“处理”。

2. LVS 的工作模式

2.1 NAT模式

具体工作流程参考下面的官方示意图:
VS-NAT.gif
当用户访问 LVS 群集时,请求数据包发往 VIP 地址到达 VS。负载均衡器检查数据包的目标地址和端口号,如果根据 VS 规则表能匹配到,则由调度算法从集群中选择合适的 RS,并且此连接会被添加到已建立连接的哈希表中。
然后,将数据包的目标 IP 地址和 PORT 重写为所选的 RS 服务器,并且将数据包转发到改服务器。当传入数据包属于此连接并且所选的服务器已经在哈希表中时,将重写并将数据包重写并转发到所选的服务器。
当回复数据包返回时,VS 将数据包的源 IP 和 PORT 重写为 VS 的源地址和端口。连接终止或超时后,将在哈希表中删除连接记录。
LVS 的 NAT 模式本质上是多目标 IP 的 DNAT,通过将请求报文中的目标地址和目标端口修改为 RS 的 RIP 和 PORT 实现转发。
报文传输具体过程如下图所示:
LVS-NAT报文传输过程.png

对于 NAT 模式的 LVS 集群,有以下几点需要注意:

  • RIP 和 DIP 应在同一个子网,RS 的网关要指向 DIP。
  • 请求报文和响应报文都必须经由 Director 转发,Director 易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标 PORT
  • VS 必须是 Linux 系统,RS 可以是任意 OS 系统

    2.2 DR 模式

    具体工作流程参考下面的官方示意图:
    VS-DRouting.gif
    LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部 进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变