工作模式

前言

  • LVS是内核里的一个功能,而不是一个软件,因为集成在内核中,所以性能非常优秀,最高可以达到百万级并发响应

LVS集群中的术语

  • VS:Virtual Server LVS本身

  • RS:Real Server 后端真正提供服务的服务器

    • lvs:Real Server
    • nginx:upstream server
    • haproxy:backend server
  • CIP:Client IP 客户端IP

  • VIP:Virtual serve IP LVS外网的IP

  • DIP:Director IP LVS内网的IP

  • RIP:Real server IP 后端真正提供服务的服务器IP

  • 访问流程:CIP <–> VIP == DIP <–> RIP

LVS的四种工作模型

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
  • lvs-dr:操纵封装新的MAC地址
  • lvs-tun:在原请求IP报文之外新加一个IP首部
  • lvs-fullnat:修改请求报文的源和目标IP(内核默认不支持,需要编译做二次开发)

LVS的核心缺点

  • LVS自身没有对后端服务器的健康性检查功能,不过可以配合keepalived来实现对后端server的健康性检查

LVS-DR 模式

DR模式 概述

  • 下面图中的Director就是LVS

img

Direct Routing 直接路由,应用最广泛,生产中的主流模型,也是LVS的默认模式

特点

  • LVS和各RS都配置有VIP
  • 请求报文要经由LVS,但响应报文不经由LVS,而由RS直接发往Client
  • 不支持端口映射(端口不能修败)
  • RS可使用大多数OS系统
  • 生产中通常LVS和RS都使用私网地址,然后在防火墙上配置公网地址,用户访问的防火墙的VIP,最后由防火墙做DNAT转换 转发到LVS上

优点

  • 最大优点是响应报文直接由 RS 响应给 client

缺点

  • Real Server 和 LVS Server 间不能使用路由器,因为 LVS Server 要将client端的请求报文转发到 Real Server 并且要通过ARP广播来获取 Real Server 的MAC地址 再将目标MAC改为 Real Server 的MAC地址,而路由器会阻断广播报文,所以 Real Server 和 LVS Server 不能距离太远,且只能使用交换机相连

DR模式 工作原理

  • 首先RS会绑定一个和LVS相同的VIP,并且RS会通过修改内核参数的方式不对ARP广播做出响应,从而避免地址冲突
  1. 客户端访问LVS,源IP为客户端的IP,目标IP为LVS的VIP,发送给LVS
  2. LVS收到客户端的请求报文后,会根据调度算法选出一台RS,然后将目标的MAC地址改为RS的MAC,发送给RS
  3. RS处理完毕后,会将目标IP改为客户端的IP,因为本身具有VIP,所以将报文直接发送给客户端

DR模式 注意事项

  • Real Server 和 LVS Server 要在同一个物理网络
  • Real Server 的网关不能指向 LVS server,以确保响应报文不会经由 LVS server
  • Real Server 和 LVS Server 间不能使用路由器

DR模式 解决RS VIP ARP广播响应

方法一 修改内核参数(常用)

官方文档:https://docs.kernel.org/networking/ip-sysctl.html?highlight=arp_announce

  • 在RS上修改内核参数以限制arp通告及应答级别

  • 只需在lo网卡设置,因为其他网卡还需和LVS进行通信,但设置lo网卡外还需设置all

  • arp_ignore

    • 0:默认值,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址应答。
    • 1:当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应
  • arp_announce

    • 定义不同的限制级别,用于从接口上发送的 ARP 请求中的 IP 数据包中宣布本地源 IP 地址
    • 0:默认值,使用在任何接口上配置的任何本地地址
    • 2:始终为此目标使用最佳本地地址。在这种模式下,我们忽略IP数据包中的源地址,并尝试选择我们喜欢与目标主机对话的本地地址。这样的本地地址是通过在输出接口上的所有子网(包括目标IP地址)上查找主IP地址来选择的。如果找不到合适的本地地址,我们会选择传出接口或所有其他接口上的第一个本地地址,希望我们的请求会得到回复,有时甚至不管我们宣布的源IP地址如何。
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

方法二

  • 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

方法三

  • 在前端网关做静态绑定VIP和Director的MAC地址(缺点是如果LVS服务器宕机,需修改前端网关IP地址和mac地址的绑定关系才能实现恢复)

LVS-TUN 模式

img

TUN模式特点:

  • DIP, VIP, RIP可以是公网地址
  • RS的网关一般不能指向DIP
  • 请求报文要经由Director,但响应不经由Director
  • 不支持端口映射
  • RS的OS须支持隧道功能

LVS-NAT 模式

  • NAT(Network Address Translation)即网络地址转换
img

本质是多目标IP的DNAT(每次可以选择不同的目标 也就是RS 做调度,而非同一个目标),通过将请求报文中的目标地址和目标端口修改为某挑出的RS同的RIP和PORT实现转发

NAT模式的特点

  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标PORT
  • VS必须是Linux系统,RS可以是任意OS系统

NAT模式 工作原理

  1. 客户端访问LVS,源IP为客户端的IP,目标IP为LVS的VIP,发送给LVS
  2. LVS收到客户端的请求报文后,会根据调度算法选出一台RS,然后源IP还是客户端的IP,但会将目标IP改为RS的IP,发送给RS
  3. RS处理完毕后,会将目标IP改为客户端的IP,源IP为RS的IP,发送给LVS
  4. 最后LVS将源IP改为自己的IP,目标IP还是客户端的IP,再发送给客户端

LVS-FULLNAT 模式

此类型kernel默认不支持

LVS工作模式总结和比较

NAT TUN DR
Server any Tunneling Non-arp device
server network private LAN/WAN LAN
server number low (10~20) High (100) High (100)
server gateway load balancer own router Own router

lvs-nat与lvs-fullnat:

  • 请求和响应报文都经由Director
  • lvs-nat:RIP的网关要指向DIP
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:

  • 请求报文要经由Director,但响应报文由RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信