二层负载均衡LVS DR模式

LVS DR模式通过修改数据包中的源MAC地址改为LVS所在的IP的MAC地址,将目的MAC地址修改为真实IP的MAC地址,由于这个过程只经过内核,不通过用户空间,所以这个模式的负载均衡效率很高。

0x00 原理

  • 术语:
名称 缩写 说明
Client IP CIP 客户端IP地址
Virtual IP Address VIP 客户请求服务的IP地址
Director Server DS 负载均衡节点
Director Server IP DIP 负载均衡节点IP
Real Server RS 后端工作节点
Real Server IP RIP 后端工作节点IP
  • 原理图

LVSDR原理

  1. 客户端通过VIP访问到负载均衡器,到达内核空间。
  2. PREROUTING 链接收到客户端请求判断客户端的目的IP是否为本机IP(VIP),确定后将数据包转发到INPUT链。
  3. 在INPUT链中,通过ipvsadm 模块会拦截这些流量,并根据调度算法决定转发到哪个后端 Real Server,修改数据包中的源MAC地址改为LVS所在的IP的MAC地址,将目的MAC地址修改为真实IP的MAC地址。后将数据包发到POSTROUTING链。
  4. POSTROUTING链接收数据包后判断目标地址是否存在后端服务器中,将数据包转发给后端服务器。

0x01 部署步骤

环境

  • 4台服务器(Ubuntu 22.04.3)在同一局域网内
  • 1台作为LoadBlancer
  • 3台作为后端的业务服务器(Worker1-3)
    • LVS : 192.168.50.126
    • Worker1: 192.168.50.119
    • Worker2: 192.168.50.116
    • Worker3: 192.168.50.48
    • Client: 192.168.50.128

LVS上的操作

  • VIP 需要和RealServer IP在同一VLAN内

  • 在主网卡上绑定一个VIP

    1
    ip addr add 192.168.50.201/24 dev eth0
  • 配置IPVS规则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 清空现有规则(可选)
    ipvsadm -C

    # 添加 VIP 和负载均衡算法(例如轮询)
    sudo ipvsadm -A -t 192.168.50.201:80 -s rr

    # 添加后端服务器(临时添加,永久保存执行ipvsadm save)
    sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.50.48:80 -g
    sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.50.116:80 -g
    sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.50.119:80 -g

    # 开启IP转发(临时修改,永久修改在/etc/sysctl.conf中修改)
    sudo echo "1" > /proc/sys/net/ipv4/ip_forward

RS上的操作

1
2
3
4
5
6
7
# 给RS的lo网卡绑定VIP
ip addr add 192.168.50.201/24 dev lo
sudo nano /etc/sysctl.conf
添加以下内容(临时修改,永久修改在/etc/sysctl.conf中修改),防止ARP冲突

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

LVS-DR 常见的负载均衡算法

  • 轮询(Round Robin,RR)算法:
    将请求依次分配给不同的后端服务器,保证每个服务器都能够分担相同的负载。
    特点:简单、易于实现,适用于后端服务器性能相近的情况。
  • 加权轮询(Weighted Round Robin,WRR)算法:
    根据预设的权重值,按照比例分配请求。权重高的服务器将获得更多的请求。
    特点:可以根据服务器的处理能力进行灵活配置,实现负载均衡。
  • 最少连接(Least Connections,LC)算法:
    将请求分配给当前活动连接数最少的服务器。
    特点:适用于连接数较多的场景,可以有效地平衡负载。
  • 加权最少连接(Weighted Least Connections,WLC)算法:
    将 LC 算法与 WRR 算法结合,根据服务器的权重值和当前活动连接数来分配请求。
    特点:综合考虑了服务器的处理能力和当前负载情况。
  • 基于局部性(Locality-Based)算法:
    试图将来自同一客户端的请求始终分发到同一台服务器上,以提高缓存命中率。
    特点:适用于有状态的应用,可以提高性能。
  • 带复制(Replication)算法:
    将每个请求同时发送给多台服务器,然后根据第一台返回结果的服务器来响应客户端。
    特点:提高了系统的可用性,但增加了网络负载。

0x02 测试

1
2
3
4
5
6
root@k8s:~$ curl http://192.168.50.201/
Worker1
root@k8s:~$ curl http://192.168.50.201/
Worker2
root@k8s:~$ curl http://192.168.50.201/
Worker3
  • 通过日志查看来源IP是客户端IP,可见只修改了MAC地址
  • 在业务环境中这种负载均衡方式是后端直接返回数据给客户端,所以需要后端服务器拥有公网,

0x03 思考

  • LVS 与 RS已经在一个局域网为什么不能直接使用LVS的真实IP作为入口。

    • VIP是为了给数据一个入口然后对数据包进行处理,如果使用真实IP的话,用户数据与其他数据无法区分,所以VIP就是给用户访问的单独的入口。
  • 为什么需要在RS的lo上绑定VIP

    • DR模式只会修改数据包的源MAC地址和目的MAC地址,所以经过LVS转发后的数据包目的地址依然是VIP,所以要在RS上绑定VIP让数据包可以到达RS。
  • RS的VIP可以绑定在其他网卡上吗

    • 理论可以,但是可能会造成ARP冲突,VIP绑定在lo上,lo不会对外进行广播持有VIP,不会造成冲突。
作者

HXD

发布于

2024-01-19

更新于

2024-11-21

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.