2026-04-08 19:40:00 +08:00

154 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LVS 负载均衡原理
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有 nginx、lvs、haproxy商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。
## 负载均衡 LVS 基本介绍
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 [http://www.linuxvirtualserver.org](http://www.linuxvirtualserver.org/) 。现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目LVS 架构从逻辑上可分为 `负载均衡层``服务层``共享存储层`
## LVS 的基本工作原理
![lvs-1](./assets/lvs-1.png)
1. 当用户向负载均衡调度器Director Server发起请求调度器将请求发往至内核空间。
2. PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP将数据包发往 INPUT 链。
3. IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链。
4. POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
## LVS 的组成
LVS 由 2 部分程序组成,包括 `ipvs``ipvsadm`
- ipvs(ip virtual server):一段代码工作在内核空间,叫 ipvs是真正生效实现调度的代码。
- ipvsadm另外一段是工作在用户空间叫 ipvsadm负责为 ipvs 内核框架编写规则定义谁是集群服务而谁是后端真实的服务器Real Server
## LVS 相关术语
- DSDirector Server。指的是前端负载均衡器节点。
- RSReal Server。后端真实的工作服务器。
- VIP向外部直接面向用户请求作为用户请求的目标的 IP 地址。
- DIPDirector Server IP主要用于和内部主机通讯的 IP 地址。
- RIPReal Server IP后端服务器的 IP 地址。
- CIPClient IP访问客户端的 IP 地址。
## LVS NAT 模式的原理和特点
[![lvs-2](https://github.com/xgfone/snippet/raw/master/snippet/docs/architecture/ha-lb/_static/lvs-2.png)](https://github.com/xgfone/snippet/blob/master/snippet/docs/architecture/ha-lb/_static/lvs-2.png)
1. 当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP目标 IP 为 VIP。
2. PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链。
3. IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP然后将数据包发至 POSTROUTING 链。 此时报文的源 IP 为 CIP目标 IP 为 RIP。
4. POSTROUTING 链通过选路,将数据包发送给 Real Server。
5. Real Server 比对发现目标为自己的 IP开始构建响应报文发回给 Director Server。 此时报文的源 IP 为 RIP目标 IP 为 CIP。
6. Director Server 在响应客户端前,此时会将源 IP 地址修改为自己的 VIP 地址,然后响应给客户端。 此时报文的源 IP 为 VIP目标 IP 为 CIP。
#### LVS NAT 特点
**优点**
- RS 应该使用私有地址RS 的网关必须指向 DIP。
- DIP 和 RIP 必须在同一个网段内。
- 请求和响应报文都需要经过 Director Server高负载场景中Director Server 易成为性能瓶颈。
- 支持端口映射。
- RS 可以使用任意操作系统。
**缺陷**
- 对 Director Server 压力会比较大,请求和响应都需经过 Director Server。
## LVS DR 模式的原理和特点
[![lvs-3](https://github.com/xgfone/snippet/raw/master/snippet/docs/architecture/ha-lb/_static/lvs-3.png)](https://github.com/xgfone/snippet/blob/master/snippet/docs/architecture/ha-lb/_static/lvs-3.png)
1. 当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP目标 IP 为 VIP。
2. PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链。
3. IPVS 比对数据包请求的服务是否为集群服务,若是,将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址,将目标 MAC 地址修改 RIP 的 MAC 地址,然后将数据包发至 POSTROUTING 链。 此时的源 IP 和目的 IP 均未修改,仅修改了源 MAC 地址为 DIP 的 MAC 地址,目标 MAC 地址为 RIP 的 MAC 地址。
4. 由于 DS 和 RS 在同一个网络中所以是通过二层来传输。POSTROUTING 链检查目标 MAC 地址为 RIP 的 MAC 地址,那么此时数据包将会发至 Real Server。
5. RS 发现请求报文的 MAC 地址是自己的 MAC 地址,就接收此报文。处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。 此时的源 IP 地址为 VIP目标 IP 为 CIP。
6. 响应报文最终送达至客户端。
#### LVS DR 特点
**优点**
- 保证前端路由将目标地址为 VIP 报文统统发给 Director Server而不是 RS。
- RS 可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对 RIP 进行直接访问。
- RS 跟 Director Server 必须在同一个物理网络中。
- 所有的请求报文经由 Director Server但响应报文必须不能经过 Director Server。
- 不支持地址转换,也不支持端口映射。
- RS 可以是大多数常见的操作系统。
- RS 的网关绝不允许指向 DIP因为我们不允许他经过 Director Server
- RS 上的 lo 接口配置 VIP 的 IP 地址。
**缺陷**
- RS 和 DS 必须在同一机房中。
**LVS DR 问题的解决方案**
- 在前端路由器做静态地址路由绑定,将对于 VIP 的地址仅路由到 Director Server。但用户未必有路由操作权限因为有可能是运营商提供的所以这个方法未必实用。
- arptables在 arp 的层次上实现在 ARP 解析时做防火墙规则,过滤 RS 响应 ARP 请求。这是由 iptables 提供的。
- 修改 RS 上内核参数(`arp_ignore``arp_announce`)将 RS 上的 VIP 配置在 lo 接口的别名上,并限制其不能响应对 VIP 地址解析请求。
## LVS Tun 模式的原理和特点
[![lvs-4](https://github.com/xgfone/snippet/raw/master/snippet/docs/architecture/ha-lb/_static/lvs-4.png)](https://github.com/xgfone/snippet/blob/master/snippet/docs/architecture/ha-lb/_static/lvs-4.png)
1. 当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP目标 IP 为 VIP。
2. PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链。
3. IPVS 比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层 IP 报文,封装源 IP 为 DIP目标 IP 为 RIP。然后发至 POSTROUTING 链。 此时源 IP 为 DIP目标 IP 为 RIP。
4. POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS因为在外层封装多了一层 IP 首部,所以可以理解为此时通过隧道传输)。 此时源 IP 为 DIP目标 IP 为 RIP。
5. RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP那么此时 RS 开始处理此请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递。 此时的源 IP 地址为 VIP目标 IP 为 CIP。
6. 响应报文最终送达至客户端。
#### LVS Tun 特点
- RIP、VIP、DIP 全是公网地址。
- RS 的网关不会也不可能指向 DIP。
- 所有的请求报文经由 Director Server但响应报文必须不能进过 Director Server。
- 不支持端口映射。
- RS 的系统必须支持隧道。
## LVS FullNAT 模式的原理
LVS FullNAT 模式几乎和 LVS NAT 模式相同,不同之处即是:引入 Local Address内网 IP 地址。CIP->VIP 转换换为 LIP->RIP而 LIP 和 RIP 均为 IDC 内网 IP因此可以跨 VLAN 通讯。
IN/OUT 的数据流全部经过 LVS为了保证带宽建议采用万兆10G网卡。
## NAT、FullNAT、DR、Tunnel 对比
[![lvs-6](https://github.com/xgfone/snippet/raw/master/snippet/docs/architecture/ha-lb/_static/lvs-6.png)](https://github.com/xgfone/snippet/blob/master/snippet/docs/architecture/ha-lb/_static/lvs-6.png)
## LVS 八种调度算法
### 轮询调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
### 加权轮询 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 100。主要是对 rr 算法的一种优化和补充LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器 A 的权值为 1服务器 B 的权值为 2则调度到服务器 B 的请求会是服务器 A 的 2 倍。权值越高的服务器,处理的请求越多。
### 最小链接数 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。
### 加权最小链接数 wlc
这个算法比 lc 多了一个权重的概念。
### 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
### 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
### 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
### 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。