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(加权最少连接)。常用的调度算法:
- rr(轮询,Round Robin) 最简单的调度算法,将请求按顺序依次分配给后端服务器,不考虑服务器性能和连接数。
- wrr(加权轮询,Weighted Round Robin) 在轮询的基础上,根据服务器的性能(权重)进行分配,权重越高的服务器接收的请求越多。
- dh(目标地址散列,Destination Hashing) 通过散列算法,根据目标IP地址将请求固定地映射到某台服务器上。
- sh(源地址散列,Source Hashing) 根据客户端的源IP地址进行散列,将同一个客户端的所有请求始终发送到同一台服务器上,常用于防火墙集群以保证会话的唯一性。
- lc(最少连接,Least Connection) 将请求分配给当前连接数最少的服务器。
- wlc(加权最少连接,Weighted Least Connection) 在最少连接的基础上,考虑了服务器的性能(权重),将连接数和服务器权重结合起来进行调度,性能越高的服务器可以接受更多的连接。
- lblc(基于局部性的最少连接,Locality-Based Least Connections) 主要用于缓存等场景,根据客户端请求的目标IP地址,优先选择处理过该IP地址的服务器,如果服务器仍然可用。
- lblcr(带复制的基于局部性的最少连接) 一种更复杂的基于局部性的算法,它会记录目标IP到服务器的映射关系,以防止单点服务器过载。
LVS调度算法在生产环境中的选型:
- 一般的网络服务,如 http,mail,mysql 等常用的 LVS 调度算法为:rr、wrr、wlc
- lblc 和 lblcr 主要适用于 web cache 和 DB cache
- 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 --help
或 man ipvsadm
查看,后者还有一些简单例子。
至于 LVS 与 Keepalived 的结合,请看下一篇。