LVS 高可用的负载均衡实现介绍

发布时间: 更新时间: 总字数:3833 阅读时间:8m 作者: IP上海 分享 网址

LVS (Linux Virtual Server) 是一个基于 Linux 内核的高性能、高可用的负载均衡解决方案。它通过将客户端请求分发到后端一组真实服务器(Real Servers)来工作。

LVS 核心概念

  • Director Server (DS): 前端负载均衡器,接收外部请求并分发给 Real Server
    • 它拥有 VIP 和 DIP
  • Real Server (RS): 后端实际处理用户请求的服务器。它拥有 RIP
  • Virtual IP (VIP): Director Server 上对外提供服务的虚拟 IP 地址,客户端访问此 IP
  • Director IP (DIP): Director Server 用于与 Real Server 通信的 IP 地址(通常是内网 IP)
  • Real Server IP (RIP): Real Server 的 IP 地址
  • Client IP (CIP): 客户端的 IP 地址

LVS 工作模式

LVS 主要有三种工作模式:

  • NAT (Network Address Translation):
    • 原理: Director 接收请求,修改请求的目标 IP 为选定的 RS IP,并将响应包的源 IP 修改为 VIP 后再发给客户端
    • 优点: 配置简单,RS 可以是任意操作系统,不需要特殊配置
    • 缺点: Director 成为性能瓶颈,因为它需要处理进出的所有流量。RS 的网关必须指向 Director
  • DR (Direct Routing):
    • 原理: Director 接收请求,修改请求的目标 MAC 地址为选定的 RS MAC 地址,直接转发到同一物理网络的 RS;RS 处理完请求后,直接将响应包(源 IP 是 VIP)发给客户端,不经过 Director
    • 优点: 性能高,Director 只处理入站请求,不处理响应
    • 缺点: Director 和所有 RS 必须在同一个物理网络(VLAN)中;RS 需要特殊配置(在 lo 接口上配置 VIP 并抑制 ARP)
  • TUN (IP Tunneling):
    • 原理: Director 接收请求,将原始 IP 包封装在一个新的 IP 包中(源 IP 为 DIP,目标 IP 为 RIP),发送给选定的 RS;RS 收到后解封装,处理请求,然后直接将响应(源 IP 是 VIP)发给客户端
    • 优点: RS 可以不在同一物理网络,可以跨越 Internet
    • 缺点:
      • 有额外的 IP 隧道开销
      • RS 需要支持 IP 隧道
      • RS 同样需要特殊配置(在 tunl 接口上配置 VIP 并抑制 ARP)

LVS 调度算法

决定如何选择下一个 Real Server 来处理请求:

  • rr (Round Robin): 轮询,按顺序依次分配
  • wrr (Weighted Round Robin): 加权轮询,根据服务器权重分配,权重高的处理更多请求
  • lc (Least Connections): 最少连接,将新请求分配给当前活动连接数最少的 RS
  • wlc (Weighted Least Connections): 加权最少连接,考虑权重和连接数(常用)
  • lblc (Locality-Based Least Connections): 基于局部性的最少连接(主要用于 Cache 集群)
  • lblcr (Locality-Based Least Connections with Replication): 带复制的基于局部性的最少连接
  • sh (Source Hashing): 源地址哈希,将来自同一源 IP 的请求始终发给同一台 RS(实现会话保持的一种方式)
  • dh (Destination Hashing): 目标地址哈希

安装

sudo apt update && sudo apt install ipvsadm -y

$ man ipvsadm

# 用来管理一个虚拟服务对象(virtual service),这个格式的命令可以用来给这个虚拟服务指定后端服务器的均衡算法(algorithm),同时,你也可以通过这种格式的命令为这个虚拟服务配置长链接等参数。总之,这种格式是用来管理虚拟服务对象的。
ipvsadm COMMAND [protocol] service-address
	[scheduling-method] [persistence options]

# 用来在一个已存在的虚拟服务对象(virtual service)里管理其后端真实服务器(real server)。你可以通过这种格式来指定某个后端服务器的转发规则(packet-forwarding method)以及其权重(weight)。如果你不指定的话,就会用默认值。
ipvsadm command [protocol] service-address
	server-address [packet-forwarding-method] [weight options]

配置

环境:

  • Director Server IP (DIP): 192.168.1.10
  • Real Server 1 IP (RIP1): 192.168.1.11
  • Real Server 2 IP (RIP2): 192.168.1.12
  • Virtual IP (VIP): 192.168.1.100 (必须与 DIP、RIP 在同一网段)
  • 服务端口: 80 (HTTP)

LVS-DR 模式

在 Director Server 上操作

安装 ipvsadm 工具:

Debian/Ubuntu:

sudo apt update && sudo apt install ipvsadm -y

CentOS/RHEL:

sudo yum install ipvsadm -y

加载 ip_vs 内核模块:

sudo modprobe ip_vs
# 可以检查是否加载成功
lsmod | grep ip_vs
# 建议加入开机自启
echo "ip_vs" | sudo tee /etc/modules-load.d/ipvs.conf

配置网络接口和 IP 地址:

  • 确保 Director 有 DIP (192.168.1.10)
  • 在 Director 上配置 VIP (192.168.1.100)。通常配置在一个别名接口或者 lo 接口上
    • 注意: 在 LVS-DR 模式下,不建议将 VIP 配置在 Director 的物理网卡上,因为这可能导致 ARP 问题。通常,我们依赖 ipvsadm 来处理 VIP,或者使用 keepalived 等工具来管理 VIP。如果手动配置,可以临时添加:
# 临时添加,重启失效
sudo ip addr add 192.168.1.100/32 dev eth0 label eth0:0  # eth0 是你的物理网卡名

# 或者添加到 lo 接口(更常见)
sudo ip addr add 192.168.1.100/32 dev lo

生产环境通常使用 keepalived 来管理 VIP 的漂移和配置。

启用 IP 转发 (如果需要,DR 模式通常不需要 Director 进行 IP 转发,但某些配置或特定场景可能需要):

# 临时启用
# sudo sysctl -w net.ipv4.ip_forward=1
# 永久启用,编辑 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件
# net.ipv4.ip_forward = 1
# 然后执行 sudo sysctl -p

注意: LVS-DR 模式主要依赖二层转发(修改 MAC 地址),理论上不需要 Director 开启 IP 转发。NAT 模式则必须开启。

  • 配置 LVS 规则 (ipvsadm):
# 清除现有规则 (如果需要)
sudo ipvsadm -C

# 添加一个 TCP 虚拟服务 (VIP:Port)
# -A: Add Virtual Service
# -t: TCP service
# <VIP>:<Port>: 虚拟服务的 IP 和端口
# -s <scheduler>: 指定调度算法 (例如 wlc)
sudo ipvsadm -A -t 192.168.1.100:80 -s wlc

# 添加 Real Server 到该虚拟服务
# -a: Add Real Server
# -t <VIP>:<Port>: 指定要加入的虚拟服务
# -r <RIP>:<Port>: Real Server 的 IP 和端口
# -g: Gatewaying mode (DR 模式)
# -w <weight>: (可选) 指定权重,默认为 1
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 1
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g -w 1

# 查看 LVS 配置状态
sudo ipvsadm -L -n --stats
  • 保存 LVS 配置 (使其在重启后生效):

  • Debian/Ubuntu: ipvsadm-save 服务通常会自动处理。检查 /etc/default/ipvsadm 配置。

  • CentOS/RHEL:

sudo service ipvsadm save
# 或者手动保存到文件
# sudo ipvsadm-save -n > /etc/sysconfig/ipvsadm
# 确保 ipvsadm 服务开机自启
# sudo systemctl enable ipvsadm

在 Real Server (RS1 和 RS2) 上操作

关键: Real Server 需要能够接收目标 IP 为 VIP 的数据包,并且在响应时不使用 VIP 作为源 IP 进行 ARP 查询。

配置 Loopback 接口 (lo) 并绑定 VIP:

每台 Real Server 上执行:

# 临时配置 VIP 到 lo 接口
sudo ip addr add 192.168.1.100/32 dev lo scope host
# 或者使用 ifconfig (较旧的方法)
# sudo ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 broadcast 192.168.1.100 up

# 使配置永久生效,需要修改网络配置文件
# 例如在 /etc/network/interfaces (Debian/Ubuntu) 或 /etc/sysconfig/network-scripts/ (CentOS/RHEL) 中添加 lo 的配置。
# 或者使用 systemd-networkd / netplan 等现代网络管理工具。

抑制 ARP 响应 (ARP Problem):

Real Server 收到目的 IP 为 VIP 的包时,不能响应对 VIP 的 ARP 请求,也不能将 VIP 作为源 IP 向外发送 ARP 请求。 修改内核参数:

# 临时设置
sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.conf.lo.arp_ignore=1  # 确保 lo 接口也设置
sudo sysctl -w net.ipv4.conf.all.arp_announce=2
sudo sysctl -w net.ipv4.conf.lo.arp_announce=2 # 确保 lo 接口也设置

# 永久设置,编辑 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件,添加或修改以下行:
# net.ipv4.conf.all.arp_ignore = 1
# net.ipv4.conf.lo.arp_ignore = 1
# net.ipv4.conf.all.arp_announce = 2
# net.ipv4.conf.lo.arp_announce = 2
# 然后执行 sudo sysctl -p 使其生效
  • arp_ignore=1: 只响应目的 IP 是接口本地 IP 地址的 ARP 请求。
  • arp_announce=2: 总是使用接口自身的 IP 地址作为 ARP 请求的源 IP,避免使用 VIP。

确保 Web 服务 (或其他服务) 正在运行:

确保 RS1 (192.168.1.11) 和 RS2 (192.168.1.12) 上的 Web 服务器(如 Nginx 或 Apache)正在监听 80 端口并正常工作。

测试

现在,从网络中的另一台客户端机器(不是 Director 或 Real Server)尝试访问 VIP:

curl http://192.168.1.100
# 或者在浏览器中访问 http://192.168.1.100

刷新几次,你应该能看到请求被分发到不同的 Real Server(可以通过查看 Web 服务器日志或返回不同内容来验证)。在 Director 上使用 sudo ipvsadm -L -n --stats 可以看到连接数的变化。

使用 Keepalived 实现高可用和简化配置

手动配置 ipvsadm 和 Real Server 的 ARP 抑制比较繁琐,且没有健康检查和 Director 的高可用性 (HA)。Keepalived 是一个常用的解决方案,它可以:

  • 管理 VIP: 在主 Director 故障时,自动将 VIP 漂移到备用 Director。
  • 健康检查: 定期检查 Real Server 的健康状况,自动从 LVS 池中移除故障的 RS,并在其恢复后加回。
  • 集成 LVS 配置:keepalived.conf 中直接定义 LVS 规则,无需手动运行 ipvsadm 命令。

配置 keepalived 会涉及 virtual_serverreal_server 块,以及 vrrp_instance 块来管理 VIP 和 Director 的主备状态。这通常是生产环境部署 LVS 的推荐方式。

注意事项

  • 防火墙:
    • Director 需要允许客户端访问 VIP:Port。
    • Director 可能需要允许与 RIP 的通信(取决于健康检查方式)。
    • Real Server 需要允许来自 Director(或任何源,取决于网络)访问服务端口。
    • 在 LVS-DR 模式下,Real Server 的防火墙不需要特别处理 VIP,因为响应直接发往客户端。
  • 网络拓扑: LVS-DR 要求 Director 和所有 Real Server 位于同一个二层网络(广播域)。
  • Real Server 配置: ARP 抑制是 LVS-DR 成功的关键,配置错误会导致无法访问或访问不稳定。
  • 会话保持: 如果应用需要同一客户端的连续请求都发往同一台 RS,可以使用 -p <timeout> 参数启用持久连接(基于源 IP 的隐式会话保持),或者使用 sh 调度算法。

NAT

Director 服务器配置

$ cat /etc/sysctl.conf
net.ipv4.ip_forward = 1

$ sudo sysctl -p

sudo ip addr add 192.168.1.200/24 dev eth0 label eth0:0

sudo ipvsadm -C

# -A: 添加一个虚拟服务 (Add a virtual service)
# -t 192.168.1.200:80: 指定虚拟服务的 TCP 地址和端口
# -s rr: 指定调度算法为轮询 (Round Robin)。其他常用算法有 wrr (加权轮询), lc (最少连接), wlc (加权最少连接) 等
sudo ipvsadm -A -t 192.168.1.200:80 -s rr

# 添加 Real Server 1 (10.0.0.11),使用 NAT 模式 (-m),权重为 1 (-w 1)
# -a: 添加一个真实服务器到虚拟服务 (Add a real server to a virtual service)
# -r 10.0.0.11:80: 指定真实服务器的 IP 地址和端口
# -m: 指定转发模式为 NAT (Masquerading)
# -w 1: 指定真实服务器的权重
sudo ipvsadm -a -t 192.168.1.200:80 -r 10.0.0.11:80 -m -w 1

# 添加 Real Server 2 (10.0.0.12),使用 NAT 模式 (-m),权重为 1 (-w 1)
sudo ipvsadm -a -t 192.168.1.200:80 -r 10.0.0.12:80 -m -w 1

# 查看 LVS 配置
$ sudo ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.200:80 rr
  -> 10.0.0.11:80                 Masq    1      0          0
  -> 10.0.0.12:80                 Masq    1      0          0

# 配置 NAT 转发规则 (使用 iptables)
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

# 或者更精确地,只对从 Real Server 响应给客户端的流量进行 SNAT:
# 允许 Director 内网 IP (DIP) 访问外网(如果需要)
# sudo iptables -t nat -A POSTROUTING -s 10.0.0.1/32 -o eth0 -j MASQUERADE

# 针对 Real Server 的响应流量进行 SNAT,确保响应包的源 IP 是 VIP
# 注意:在 LVS NAT 模式下,ipvsadm 自身会处理大部分 NAT 逻辑。
# 关键在于 Real Server 的网关必须指向 Director 的内网 IP。
# iptables 主要用于确保 Director 本身可以访问外网以及处理其他可能的防火墙规则。
# 通常,对于 LVS NAT 模式,ipvsadm 会处理目标地址转换 (DNAT) 和源地址转换 (SNAT)。
# 上述的 MASQUERADE 规则主要是为了让内网的 Real Server 可以通过 Director 访问外网(如果它们需要的话),
# 而不是直接用于 LVS 的核心 NAT 转换。

# 对于 LVS NAT 模式,更重要的可能是防火墙规则,确保流量可以进入 VIP 并被 LVS 处理。
# 例如,允许到 VIP:80 的流量:
sudo iptables -A INPUT -d 192.168.1.200 -p tcp --dport 80 -j ACCEPT

# Debian/Ubuntu 保存 iptables 规则
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload

LVS vs haproxy

LVS 提供了高吞吐量、低延迟的第 4 层负载均衡,适合作为入口层处理海量连接。HAProxy 提供了功能丰富、灵活的第 7 层负载均衡,适合处理复杂的应用层请求。

特性/功能 LVS HAProxy
工作层 第 4 层(传输层) 第 4 层和第 7 层(应用层)
性能 极高,尤其在 DR 模式下,因为只转发数据包 相对较低,因为需要解析应用层协议
功能复杂性 简单,主要进行 IP 包转发 复杂,支持 SSL 终结、会话保持、内容路由等
适用场景 高并发、大数据量传输、简单 TCP/UDP 服务 HTTP/HTTPS 应用,需要智能路由和会话管理
配置难度 相对复杂,尤其在网络拓扑方面 相对容易,配置灵活
健康检查 简单的心跳和端口检查 支持更丰富的应用层健康检查
SSL/TLS 不处理,需要后端服务器处理 可以进行 SSL/TLS 终结
会话保持 较弱,依赖后端服务器的 IP 地址 强,支持基于 Cookie 等多种方式实现会话保持

参考

  1. http://www.linuxvirtualserver.org/
  2. https://zhuanlan.zhihu.com/p/627514565
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数