LVS 负载均衡

LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。

  • 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
  • 很好的可伸缩性(Scalability)
  • 很好的可靠性(Reliability)
  • 很好的可管理性(Manageability)
  • 开源,免费
  • 在网上能找到一些相关技术资源
  • 具有软件负载均衡的一些优点

可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术

LVS技术

  • 技术简介

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

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

A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

  • 调度器

调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。

对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。

LVS的八种调度算法

  1. 轮叫调度 rr :这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
  2.  加权轮叫 wrr :这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
  3. 最少链接 lc :这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
  4. 加权最少链接 wlc :这个算法比 lc 多了一个权重的概念。
  5. 基于局部性的最少连接调度算法 lblc:这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
  6. 复杂的基于局部性最少的连接算法 lblcr :记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
  7. 目标地址散列调度算法 dh :该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
  8. 源地址散列调度算法 sh :与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
  • 分布式锁管理器

此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。

负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。

  • 监视器

Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。

  • LVS 由2部分程序组成, ipvs 和 ipvsadm。

    ipvs(ip virtual server):工作在内核空间,叫ipvs,是真正生效实现调度的代码。
    pvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器(Real Server)

  • DS:Director Server。指的是前端负载均衡器节点。
  • RS:Real Server。后端真实的工作服务器。
  • VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,访问客户端的IP地址。

LVS 三种工作模式的解析

  • 基于NAT的LVS模式负载均衡

      NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。VS/NAT工作模式拓扑结构如图2所示,LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。

       第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

第二步,用户将请求发送至124.126.147.168,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。

第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。

  • 基于TUN的LVS负载均衡

       在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如图3所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

  • 基于DR的LVS负载均衡

在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。


  • 下面开始搭建基于 DR 模式 的 LVS 负载均衡
  • 试验环境简介
  • VIP 172.16.1.168
  • Director Server CentOS 7.5 :  (eth0 192.168.1.2  eth1 172.16.1.1  vip eth1:0 172.16.1.168)

  • Real server1 CentOS 7.5 : (eth0 172.16.1.4  vip lo:0 172.16.1.168)

  • Real server2 CentOS 7.5 : (eth0 172.16.1.5  vip lo:0 172.16.1.168)


  • 首先在  Director 上使用 yum 方式安装 ipvsadm
  • 在 CentOS 7 中 LVS 默认已经被编译进内核中,主要分为两部分ipvs和ipvsadm,ipvs是LVS软件核心,是运行在LB上的,基于ip层的负载均衡;ipvsadm 是用户空间(DR)集群管理工具。
  • 查看内核是否加载 LVS 模块
  • lsmod | grep ip_vs
  • 安装 ipvsadm
  • yum install -y ipvsadm
  • 要想起到负载均衡效果,所有请求报文必须发往 LVS 服务器(DS),然后 DS 根据指定算法分发到后端服务器上(RS),因此DS必须配置VIP地址,VIP是与公网client通信地址,这样DS才能接受到请求报文进行分发。
  • 在LVS 服务器上添加一个地址为 VIP 的虚拟网卡eth1:0
  • ifconfig eth1:0 172.16.1.168 netmask 255.255.255.255 up
  • 添加 IPVS 规则
  • ipvsadm -A -t 172.16.1.168:80 -s wrr
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.4:80 -g -w 1
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.5:80 -g -w 1
    ipvsadm-save -n > /etc/sysconfig/ipvsadm
    -A -t server1.2:http -s wrr
    -a -t server1.2:http -r 172.16.1.4:http -g -w 1
    -a -t server1.2:http -r 172.16.1.5:http -g -w 1
    systemctl start ipvsadm
  • 确认无误启动 LVS 服务
  • PS:规则文件会保存在 /etc/sysconfig/ipvsadm 文件中


  • 接着分别在  Real server (Rs)端设置
  • 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求

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

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

将ARP请求的源IP设置为eth0上的IP,也就是RIP

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

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

  • 永久生效方式,编辑 /etc/sysctl.conf 在末尾添加
  • 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
  • 必须完成以上设置,然后添加IP地址为 VIP 的虚拟网卡lo:0
  • ifconfig lo:0 172.16.1.168 netmask 255.255.255.255 up
  • 添加一条路由,目标IP为VIP的数据包使用lo接口发送,这样响应报文的源IP就会为VIP

  • route add -host 172.16.1.168 dev lo:0

  • 使用 yum 方式安装 nginx
  • yum -y install nginx
  • echo "<html><h1> 172.16.1.4 </h1></html>" > /usr/share/nginx/html/index.html 
  • systemctl start nginx

  • 两台 RS 都要做相同的设置

  • 打开浏览器 输入 http://172.16.1.168,手动刷新查看结果(一直按住F5可以看到变化)


  • Linux 内核参数arp_ignore和arp_announce作用说明

    arp_ignore - INTEGER
    0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;
    1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;
    2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;
    3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
    4-7:保留
    8:不应答所有本地IP
    arp_announce - INTEGER
    0:默认值,允许使用本机上所有接口的IP作ARP通告。
    1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。
    2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章