LVS 负载均衡器与其操作接口 ipvsadm

说到负载均衡,我们最常用的就是 nginx,而 nginx 是七层的负载均衡器(基于应用层的信息进行负载均衡),虽然功能强大,但是性能开销等会稍大。在高性能场景,一般会使用四层负载均衡器(基于传输层的信息进行负载均衡)。

而 LVS(Linux Virtual Server,Linux 虚拟服务器)是四层负载均衡器的典型代表。LVS 的基本原理可以用一句话概述,通过修改 MAC 层、IP 层、TCP 层的数据包,实现一部分交换机和网关的功能,将流量转发至真正的服务器上。

想了解更多内容可参考 负载均衡与代理技术 - 深入高可用系统原理与设计

LVS(IPVS)早已被纳入 Linux 内核,所以所有 Linux 系统都具备变身为负载均衡器的能力。而我们平时要操作时,可以借助 ipvsadm 这个 LVS 在应用层的管理命令。

这里来个简单的入门教程。

先来两个概念:虚拟服务与真实服务器。

LVS 均衡请求负载工作示意图大致如下。LVS 对外(用户)会暴露一个虚拟服务,当用户访问这个虚拟服务时,LVS 将其请求转发至真实服务器。

                    ┌------> 真实服务器1
用户 ----->虚拟服务-(LVS)---> 真实服务器2
                    └------> 真实服务器3

管理虚拟服务

常用命令模板

ipvsadm -<A|E> -[t|u] <virtual-service> [-s <调度算法>]
ipvsadm -D -[t|u] <virtual-service>

管理虚拟服务 -<A|E|D>

  • -A --add-service:添加虚拟服务
  • -E --edit-service:编辑虚拟服务
  • -D --delete-service:删除虚拟服务

指定虚拟服务 -<t|u> <virtual-service>

  • -t --tcp-service:指定 TCP 虚拟服务,形如 <host[:port]>
  • -u --udp-service:指定 UDP 虚拟服务,形如 <host[:port]>

默认是 TCP

设置调度算法 -s <scheduler>

默认为 wlc(加权最少连接)。常用的调度算法:

  1. rr(轮询,Round Robin) 最简单的调度算法,将请求按顺序依次分配给后端服务器,不考虑服务器性能和连接数。
  2. wrr(加权轮询,Weighted Round Robin) 在轮询的基础上,根据服务器的性能(权重)进行分配,权重越高的服务器接收的请求越多。
  3. dh(目标地址散列,Destination Hashing) 通过散列算法,根据目标IP地址将请求固定地映射到某台服务器上。
  4. sh(源地址散列,Source Hashing) 根据客户端的源IP地址进行散列,将同一个客户端的所有请求始终发送到同一台服务器上,常用于防火墙集群以保证会话的唯一性。
  5. lc(最少连接,Least Connection) 将请求分配给当前连接数最少的服务器。
  6. wlc(加权最少连接,Weighted Least Connection) 在最少连接的基础上,考虑了服务器的性能(权重),将连接数和服务器权重结合起来进行调度,性能越高的服务器可以接受更多的连接。
  7. lblc(基于局部性的最少连接,Locality-Based Least Connections) 主要用于缓存等场景,根据客户端请求的目标IP地址,优先选择处理过该IP地址的服务器,如果服务器仍然可用。
  8. lblcr(带复制的基于局部性的最少连接) 一种更复杂的基于局部性的算法,它会记录目标IP到服务器的映射关系,以防止单点服务器过载。

LVS调度算法在生产环境中的选型:

  1. 一般的网络服务,如 http,mail,mysql 等常用的 LVS 调度算法为:rr、wrr、wlc
  2. lblc 和 lblcr 主要适用于 web cache 和 DB cache
  3. sh 和 dh 可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一

管理真实服务器

常用命令模板

ipvsadm -<a|e> -t <virtual-service> [-<r|u>] <server-address> [-<g|i|m>] [-w <weight>]
ipvsadm -d -t <virtual-service> [-<r|u>] <server-address>

管理真实服务器 -<a|e|d>

  • -a --add-server:添加真实服务器
  • -e --edit-server:编辑真实服务器
  • -d --delete-server:删除真实服务器

真实服务器地址 -r <server-address>

  • -r --real-server:指定真实服务器地址,形如 <host[:port]>

设置 LVS 工作模式 -<g|i|m>

  • -g --gatewaying:设置为直接路由模式(DR)
  • -i --ipip:设置为隧道模式(TUN)
  • -m --masquerading:设置为 NAT 模式(NAT)

默认是 DR 模式

设置权重 -w <weight>

  • -w --weight:用于指定服务器在加权算法中的权重

查看调度表

ipvsadm -ln
  • -l -L --list:查看调度表
  • -n --numeric:以数字形式展示主机和端口号

这里 -n 其实和 ss/netstat 的 -n 类似,不使用会用 hostname 以及 http 等服务名称展示规则,而不是 IP(若规则是 IP 的话) 和端口号。


至此,对 LVS 负载均衡规则(调度表)的简单“增删改查”操作都已经展示完毕。剩下的详细用法请 ipvsadm --helpman ipvsadm 查看,后者还有一些简单例子。

至于 LVS 与 Keepalived 的结合,请看下一篇。