简介

  • LVS(Linux Virtual Server)Linux虚拟服务,是一个开源的软件项目,在linux2.4版本中内置了LVS,可以看出LVS的影响力非常大
  • LVS可以实现高可伸缩的、高可用的网络服务,也就是说Linux集成它之后,所有基于Linux内核的服务器原生即可实现集群
  • 优点:
    • 性能强:一方面是集成到内核里面的,对硬件资源的调度非常直接,另外是4层本身只做分发,这活本身也够简单,所以速度快,稳定性强(不容易出bug)
    • 低成本,没啥好说,典型的软件优化替代硬件
    • 配置简单,支持多做算法,支持多种工作模型,另外由于是在4层工作所以基本可以对所有应用进行负载均衡
  • 不足:不支持7层规则修改,也就是没有7层那么多的功能,机制过于庞大,不适合小规模应用,比如说DPVS(基于LVS)一台设备基本可以到达百万级别的CPS(每秒建立连接数),一般也没有这么大的需求,可以选择七层的负载均衡达到更灵活的功能配置;所以其实这里提到的不足都不是LVS的缺陷,只是某些场景不适合使用LVS而已

核心组件

LVS的管理工具和内核模块ipvsadm/ipvs

  • ipvsadm:命令行工具,用于管理集群服务,比如统计集群的相关状态信息,重启服务等
  • ipvs:工作与内核上的netfilter INPUT钩子之上的程序,可根据用户定义的集群实现请求转发

相关术语

  • VS:virtual server即虚拟服务
  • Director-分发器、Balancer-负载均衡器
  • RS:real server后端真正处理请求的服务器
  • CIP:client IP
  • VIP:Director Virtual IP负载均衡器虚拟IP,即客户端统一访问的IP
  • DIP:Director IP负载均衡器IP
  • RIP:real server IP

内核工作流程

image-20230601163304403

四种工作模式

NAT模式

用地址转换实现虚拟服务器,外界看到的是LVS的VIP,LVS会根据配置的转发规则对数据包的目标IP做修改,以实现数据转发,优点是节省IP地址,缺点是效率低,因为返回给客户端的流量经过转换器

image-20230601163154404

  • 用户请求到达LVS,报文会到内核空间的PREROUTING,此时报文源IP为CIP,目标IP为VIP
  • 当PREROUTING发现数据包的目标IP是本机,则将数据包转发到INPUT链,通过IPVS对比转发规则,如果有匹配的规则,就按规则修改数据包的目标IP为RIP,再通过PREROUTING链将数据包发送给RS
  • RS处理请求,生成响应报文发回给LVS,此时报文源IP为RIP,目标IP为CIP
  • LVS通过FORWORD将源IP修改为VIP,并转发给客户端

DR模式

DR 和 REAL SERVER 都使用同一个 IP 对外服务。但只有 DR 对 ARP 请求进行响应,所有 REAL SERVER 对本身这个 IP 的 ARP 请求保持静默。也就是说,网关会把这个服务 IP 的请求全部定向给 DR,而 DR 收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的 MAC 地址改成 REAL SERVER 的 MAC 并发给这台REAL SERVER。这时 REAL SERVER 收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于 DR 要对二层包头进行改换,所以 DR 和 REAL SERVER 之间必须在一个广播域,也可以简单的理解为在同一台交 换机上。

image-20230601122933251

  • 用户请求到达LVS,报文会到内核空间的PREROUTING,此时报文源IP为CIP,目标IP为VIP
  • 当PREROUTING发现数据包的目标IP是本机,则将数据包转发到INPUT链,通过IPVS对比转发规则,如果有匹配的规则,就按规则修改数据包的源MAC地址修改为LVS的MAC地址,将目标MAC地址修改为RS的MAC地址,此时源IP和目标IP不会被修改
  • 由于LVS和TS在一个广播域内,PREROUTING链通过二层转发将数据包发送给RS
  • RS接到请求后进行处理,响应报文通过lo接口传送给eth0网卡然后向外发出,此时源IP地址为VIP,目标IP为CIP
  • 响应报文送达客户端

TUN模式

对NAT模式的优化,在NAT模式下请求和响应的报文都需要LVS机器进行修改,吃CPU资源,TUN模式不直接修改请求报文的源IP和目标IP,而是在请求报文首部再封装一层IP报文,增加一个源地址为DIP,目标地址为RIP,这层封装只是为了让报文能被转发给对应的RS,RS拿到数据包后拆开LVS封装的报文,拿到真实的目标地址发现是自己lo接口上的VIP,则会处理请求,这个时候由于RS是知道CIP的,所以直接通过eth0网卡发送给客户端即可,不需要再转发LVS进行地址转换

image-20230601163015454

full-nat模式

对NAT模型的改进,使得RS与LVS可以处于不同网络

  • RIP和DIP可以使用私有网络
  • RIP和DIP可以不在同一个网络中,且RIP的网关可以不指向DIP
  • 支持端口映射

持久连接

一些连续的请求场景需要同一个RS进行连续的响应,LVS实现了持久连接机制,让同一用户的HTTP请求在超时时间内都重定向到同一个RS进行响应,超时时间可以设定,还可以通过设定端口的姻亲关系来绑定同一用户对不同端口的请求由同一RS响应

调度算法

静态算法

  • RR(Round Robin)轮询:按请求顺序轮流转发给RS
  • WRR(Weight RR)加权轮询:调度器自动询问RS的负载情况,来动态调整其权值,来分配请求
  • DH(Destination Hash):目标地址散列
  • SH(Source Hash):源地址散列

动态算法

  • LC(Least connections)最少连接:将请求分配给已建立连接最少的RS,在RS性能接近时合理
  • WLC(Weight LC)加权最少连接(默认算法):不清楚和WRR的区别
  • SED(Shortest Expected Delay)最短期望延迟
  • NQ(Never Queue)无需队列:如果RS连接数为0,直接分配
  • LBLC(locality-Based Least Connections)基于局部性的最少链接:离客户端近且未超负载的RS进行响应
  • LBLCR(Locality-Based Least Connections with Replication)带复制的基于局部性最少连接