Linux服务管理-LVS负载均衡

LVS负载均衡

1. lvs简介

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

lvs缺点:不具备健康状态检查功能,只是一个调度器而已

1.1 lvs组成结构

一般来说,LVS集群采用三层结构,其主要组成部分为:

  • 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
  • 服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
  • 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

其体系结构如图所示:

Linux服务管理-LVS负载均衡

1.2 lvs工作原理

(1)首先,客户端向调度器(Director Server)发起一个请求,调度器将这个请求发送至内核

(2)PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。

(3)当请求达到INPUT链上,调度器判断报文中的目标端口来确定这个访问是不是要访问集群服务(因为还有可能只是ssh想单纯的远程登录主机这个主机),如果是访问的集群服务,那么就会强制修改这个包的目标IP

(4)POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

2. lvs负载均衡方式

  • NAT:修改请求报文的目标IP,多目标IP的DNAT
  • TUN:在原请求IP报文之外新加一个IP首部
  • DR:操纵封装新的MAC地址
  • FULLNAT:修改请求报文的源和目标IP

2.1 NAT模式

2.1.1 VS/NAT模式架构图:

Linux服务管理-LVS负载均衡

2.1.2 工作流程:

  • 1.Client向Director server发送带有 [CIP-VIP] 的请求数据报文,PREROUTING 链接收数据报文发现目标ip是本机ip,随后将报文转发值INPUT链
  • 2.工作在INPUT链上的IPVS比对数据包请求的服务是否为集群服务,如果是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
  • 3.POSTROUTING根据选路发给后端realy server,realy server收到数据包发现目标ip是自己,然后向Director响应请求,此时响应报文中的源IP地址信息为 RIP,目标地址IP为CIP
  • 4.Director server在响应Client之前再将报文中ip信息源IP地址改为 VIP,目标IP仍为CIP

2.1.3 NAT模式特点

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为挑出的某个RS的RIP和PORT实现转发

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

2.2 TUN模式

2.2.1 VS/TUN模式架构图:

Linux服务管理-LVS负载均衡

2.2.2 工作流程:

  • 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

2.2.3 TUN模型特点

  • RIP、VIP、DIP全是公网地址
  • RS的网关不会也不可能指向DIP
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持端口映射,
  • RS的系统必须支持隧道

2.3 DR模式

2.3.1 VS/DR模式架构图:

Linux服务管理-LVS负载均衡

2.3.2 DR模式工作流程

  • 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

2.3.3 DR模式的特点

  • 保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS
  • RS的RIP可以使用私有地址,但也可以使用公网地址
  • RS和director必须在同一物理网络中
  • 请求报文有director调度,但响应报文不一定经由director
  • 不支持端口映射
  • RS可以支持大多数OS
  • RS的网关不能指向DIP

2.3.4 保证请求报文发送的解决方案

保证前端路由器将目标IP为VIP的请求报文发送给director,解决方案有以下三种:

  • 静态绑定
  • arptables
  • 修改RS主机内核的2个参数
    • arp_announce:是否接收并记录别人的通告以及是否通告自己的mac地址给别人
    • arp_ignore:是否响应arp请求

arp_announce有三个可选值,0,1,2,其意义如下:

  • 0(default,默认值为0):通告自己所拥有的所有地址

  • 1:尽量不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,但是是尽量不通告,有可能还是会通告的

    • 尽量避免不在该网络接口子网段的本地地址做出arp回应
    • 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用
    • 此时会检查来访IP是否为所有接口上的子网段内ip之一.如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理
  • 2:总是不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,绝对不会通告

    • 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址
    • 首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址
    • 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

rp_ignore有9个可选值,0,1,2,3,4,5,6,7,8,其意义如下:

  • 0(default,默认值为0):回应任何网络接口上对任何本地IP地址的arp查询请求

  • 1:请求报文从哪个接口进入的且请求的目标地址就是此接口配置的地址才予以响应,否则不响应

    • 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
  • 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

  • 3:不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应

  • 4-7:保留未使用

  • 8:不回应所有(本地地址)的arp查询

2.4 FULLNAT模式

2.4.1 FULLNAT模式架构图

Linux服务管理-LVS负载均衡

2.4.2 FULLNAT模式工作流程

  • 1.客户端将访问vip报文发送给LVS服务器;
  • 2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),源地址改为自己的ip地址(SNAT),发送给后端真实服务器;
  • 3.后端服务器在处理完之后要将响应的报文返回给lvs;
  • 4.LVS将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),发送给客户端。

注:fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。

2.4.3 FULLNAT模式特点

  • VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

  • RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

  • 请求和响应报文都经由Director

  • 支持端口映射

3. lvs调度器算法

3.1 静态方法

静态方法:仅根据算法本身进行调度

  • RR:round robin,轮调
  • WRR:weighted rr,加权的rr,根据一定的比例进行轮调,比如每次RS1给2个请求,RS2给1个请求
  • SH:source hash,源地址hash,实现session保持的机制,将来自于同一个IP的请求始终调度至同一RS,每个服务单独调度
  • DH:destination hash,目标地址hash,将对同一个目标(资源)的请求始终发往同一个RS

3.2 动态方法

动态方法:根据算法及各RS的当前负载状态进行调度,根据指定的算法算出overhead(负载),最终挑选出overhead值最小的则为被选中的RS

  • LC:Least Connection,最少连接数,算法如下:
    overhead = Active * 256 + Inactive
  • WLC:Weighted LC,加权的LC,算法如下:
    overhead=(Active*256+Inactive)/ weight
  • SED:Shortest Expection Delay,最短期望延迟,算法如下:
    overhead = (Active + 1) * 256 / weight
  • NQ:Nevel Queue,是SED算法的改进,根据SED算法每台主机第一次至少要均分配一次,然后再按SED算法来挑选
  • LBLC:Locality-Based LC,基于本地的最少连接数,即为动态的DH算法
    正向代理情形下的cache server调度
  • LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法

4. ipvsadm的用法

管理集群服务:

  • 添加或编辑调度器
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
  • 删除调度器
    ipvsadm -D -t|u|f service-address

常见的service-address:

  • tcp:-t ip:port
  • udp:-u ip:port
  • fwm:-f mark

-s scheduler:制定调度算法(默认为wlc)
-p [timeout]:定义持久连接,timeout不指定时默认为300秒

管理集群服务中的RS

  • 添加或编辑RS
    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
  • 删除RS
    ipvsadm -d -t|u|f service-address -r server-address
  • 显示lvs
    ipvsadm -L|l [options]

lvs-type:

  • -g:gateway,dr模式
  • -i:ipip,tun模式
  • -m:masquerade,nat模式
  • -w:设定权重,可为0到正无穷数值,设为0时不会被调度,默认为1
    权重值越大则表示性能越好,被调度的资源也会更多

清空和查看:

  • ipvsadm -C 清空
  • ipvsadm -L|l [options] 查看
    • options:
      • -n:numeric,基于数字格式显示地址和端口
      • -c:connection,显示当前ipvs连接
      • –stats:统计数据
      • –rate:输出速率信息
      • –exact:显示精确值,不做单位换算

保存和重载:

  • ipvsadm -R 重载
  • ipvsadm -S [-n] 保存

置零计数器:

  • ipvsadm -Z [-t|u|f service-address]