Lvs原理及简单实现

大纲:

一、集群概述

二、什么是Lvs(what)

三、为什么要用Lvs(why)

四、什么时候需要用Lvs(when)

五、什么地方需要用Lvs(where)

六、什么人来部署Lvs(who)

七、Lvs支持的三种模式与十种算法(Scheduler

八、如何部署LvsNAT模式?(How)

九、如何部署LvsDR模式?

 

一、集群简介:

  计算机集群(Cluster)技术可以通过网络连接把一组互相独立工作的计算机高度紧密的连接起来,从而高效可靠的共同完成协同任务。计算机集群技术常用于改进单台计算机的性能或可靠性,集群系统中单个计算机通常称之为节点(Node);在某种意义上,可以把集群看做是把多台计算机组合成一台超级计算机。

 

  常用的集群软硬件:

    1、开源集群软件:LvsKeepaliveHaproxyNginxApacheHeartbeatCorosync+Pacemaker等;

    2、商业集群硬件:F5ArrayNetscalerRadwareA10等;

 

  常用的计算机集群架构按功能和结构一般分为三类:

    1LB:负载均衡(Load Balancing

    2HA:高可用(High-Availablity

    3HP:高性能(High-Perfomance

 

  负载均衡集群按OSI模型划分常见的有:

    1、四层负载均衡:

    四层负载均衡就是基于IP+端口的负载均衡;通过发布网络层的IP地址(VIP),然后加上传输层的端口号,来决定哪些流量要来做负载均衡;此种负载均衡器不理解应用协议(如:httphttpsftpMysql等),常见实例:LVSF5(全称:F5-BIG-IP-GTM 全球流量管理器)等;

    注:NginxHAProxy仅能模拟四层负载,并不是真正意义上的实现;

    2、七层负载均衡:

    七层的负载均衡就是基于虚拟的URL等应用层的信息的负载均衡,在四层负载均衡的基础上,(没有四层是绝对不可能有七层的),在考虑应用层的特性,比如同一个Web服务器的负载均衡,除了根据VIP+80端口辨别是否需要处理的流量,还可以根据应用层的URL、浏览器的类别、语言等来决定是否要进行负载均衡;从技术原来上来看,七层负载均衡对设备的要求更高,其性能也必然低于四层负载均衡,但所能实现的功能却要比四层负载均衡强大的多;常见实例:HAProxyNginxArray

 

wKioL1fJB9ixPm0KAAH0LnomAsE911.png

 

二、什么是Lvswhat)?

  负载均衡集群技术为企业提供了一种更为实用,性价比更高的系统架构解决方案,它能把多个客户的集中访问请求尽可能的分摊到集群系统的多个后端节点上,从而分担流量请求,以实现负载均衡效果;而LVSLinux VirtualServer)就是一款用软件方式实现Linux系统高可用的Layer 4 Load Balancing Cluster(四层负载均衡集群)技术。它诞生于1998年五月,是由原阿里巴巴集团的章文嵩博士创建的中国首批开源项目之一。Lvs稳定高效,其性能基本能达到F560%左右,且具有很好的可伸缩性(Scalability)、可靠性(Reliability)、可管理性(Manageability),是门户级站点(门户级通常指日千万PV量以上)极具性价比的解决方案,仅从淘宝这种资源访问量规模如此之巨的电商站点,便能一窥Lvs的威能。

 

  LVSCluster一般由三个层级结构组成:

    1、负载均衡层(Load Balancing

     正常至少由两台DirecterServer(负载均衡调度服务器)作为主备组成,处于LVS Cluster的最前端,是用户请求的唯一入口(Single Entry Point)。用于调度用户请求发送至Server Pool中相应的一组服务器中。

    2、服务器池层(Server Pool

     由多台Real Server组成,处于中间层,是一组真正用于回复用户请求的服务器。   

    3、共享储存层(Shared Storage

     Shared storageServer pool提供一个共享存储区,让Real Server拥有相同的内容,提供相同的服务。

 

wKioL1fI-ErDi03eAAIVPaH-YUc737.png

三、为什么要用Lvs?(why

  1、抗负载能力强,工作在OSI模型的第四层(传输层),仅作分发请求之用;

  2、工作稳定,自身有完整的双机热备方案,如LVS+KeepalivedLVS+Heartbeat

  3、应用范围广泛,基本上可以对所有的应用做负载均衡,如TCPUDPHttp、数据库、聊天室等等;

  4、配置性较低,通常配置完后不会再对配置做变更,因为没有什么好改的...从而大大降低了人为故障;

  5、无流量,因其只做请求分发之用,而流量并不从它本身出去,从而保证了均衡器IO的性能不会受到大流量的影响,这个特性也决定了它在软负载均衡里的性能是最强的,说它是软件级负载均衡的无冕之王亦不为过;

 

四、什么时候需要用Lvs?(when

  1、站点达到门户级(日访问千万PV以上);

  2、服务器很多,可惜性能无法满足现有业务,可以部署Lvs集群系统更好的整合资源,从而提升性能;

  3、随着业务量的扩展,为了能让应用更加稳定高效,获取更强的性能,更好的冗余能力;

 

五、什么地方需要用Lvs?(where

  1、仅作兴趣测试,家里一台电脑,虚拟机也能部署;

  2IDCInternet Data Center:互联网数据中心)机房,当然,为了提升高可用性,有条件最好还是部署下异地容灾;

  3、普通企业机房(IDC标准未达标),除非仅作线下测试之用,否则个人觉得当务之急不是部署Lvs,而是赶紧把正式服搬到云环境或做异地容灾吧;

 

六、什么人来部署Lvswho

 Linux运维工程师/架构师;

 

七、Lvs支持的三种模式与十种算法(scheduler):

  Lvs支持的三种模式:

  1NATNetwork Address Translation):网络地址转换

 

wKiom1fJCBSC_at7AAD02TGwoPA967.png

 

  NAT模式下,所有进出数据流都必须经由LVS负载均衡调度器,进入的时候使用DNAT(目标地址转换)转换VIPRIP发送给RealServer;出去的时候用SNAT(源地址转换)转换RIPVIP发送给用户;一般商用F5等设备,都采用NAT模式,因为NAT模式可以防止DDOS***,该***防御功能依赖于进出数据都通过LVS调度器;

 

  2TUNIP Tunneling):IP隧道技术

 

wKiom1fJCFyjsNEOAAEQJ8wpXvI849.png   

 

  这个是进的流量经过LVS调度器,出去的时候不经过了。Tunnel是在原来IP头部再新增封装一个IP。据说,腾讯采用IP隧道的模式;TUNNEL模式的最大问题是每个数据包都需要增加一个IP头部,如果收到的数据包是已经达到以太网帧最大长度1.5KIP头就添不进去。这时候常用做法是会回一个因MTU(最大传输单元:MaximumTransmission Unit)导致目的不可达的ICMP(网际控制信息协议InternetControl Message Protocol)包给客户端,客户端如果支持PMTU的话,就会把大包分成小包发过来。

  解决上述问题的一个办法是:交换机开启巨帧。另一个方法是将后端服务器上的MSS改小,我一个IP头是20个字节,默认MSS(最大报文段长度:MaximumSegment Size)1460,将其改成1440可不可以?可以,大部分用户可以正常支持,但是总会存在百万份之几,它不支持的标准MSS协商协议,你即使将MSS调的很小,但是客户端还是会发一个大包出来。所以,该技术用的人最少;

  3DRDirect Routing):直接路由

 

wKioL1fJCJvS6vswAADxoqZ3jSM299.png

 

  DR的性能是所有模式中最高的,它只需要修改目的MAC;但部署上必须要求LVS和后端服务器在同一个VLAN中。(虚拟局域网:Virtual Local Area NetworkDR非常适合小规模网络,比如,阿里的CDN都是用的DR模式,几十台服务器的规模,特别适合DR这种高效的模式;因此,如果你业务规模比较小的话,建议采用DR

 

  Lvs支持的十种算法:

  静态算法:仅根据算法本身进行调度,注重起点公平;

  1RRRound Robin):轮询

  RR算法将请求依次轮流分发给给RSRealServer,真实应用服务器),算法优点是其简洁性,无需记录当前所有连接的状态,但不适用于RS性能差异过大的场景;

  2WRRWeighted RR),加权轮询

  WRR算法根据RS的性能与业务的不同场景,在RR算法上,给每台RS加上权值,使权值高的RS能够处理更多请求;

  3SHSource Hashing):源地址哈希;实现会话保持;

  一般情况下,服务器为了保持与客户端的http连接持久性,会向客户端发送一个cookie标签,用于标明客户端的动作,比如向购物车添加的物品等。但当下次链接被DSDirector Server)分配到其它RS上时,那么之前的cookie就失效了,自然就无法保持http的持久性。虽然RS之间可以通过广播和组播同步Session,但这样非常占用网络资源;如果使用Memcached保持会话,万一Memcached宕机,那么所有的会话就没用了。但是如果开始就在DS上使用SH算法,就能建立一个使用键值方式的Session表,客户端IP是键,内部RS是值,这样就能保证所有的会话一直发往同一台RS,实现Session保持;但依旧存在问题,如果有一台RS故障,将有一部分用户收到影响,造成损失;

  4DHDestination Hashing):目标地址哈希

  DH算法将发往同一个目标地址的请求,始终转发至第一次挑中的RS

  动态算法:主要根据每RS当前的负载状态进行调度,注重结果公平;

  5LCLeast Connections):最少连接

  LC算法将请求分配到当前连接数最少的RS,每多一个连接,其连接数加1,反之减1

  公式:Overhead =activeconns*256+inactiveconns(谁的值小,请求发给谁)

  6WLCWeighted LC):加权最少连接

  WLC算法在LC算法上能够自定义每台RS的权值,使其适用于不同性能与业务的服务器,在得出每台RS的最少连接数下除以其权值,取得数最小的分发请求;

  公式:Overhead = activeconns*256+inactiveconns/weight(谁的值小,请求发给谁)

  7SEDShortest Expection Delay):最短期望延迟

  这里不再计算非活动链接数了,但是当有当量连接时,依然需要考虑非活动连接数。而且只有当性能好的服务器有一大堆请求时,性能差的依然没有接受请求。

  公式:Overhead=(activeconns+1)*256/weight

  8NQNever Queue):永不排队,一开始就各自分配一个连接

  9LBLCLocality-Based Least connections):基于本地的最少连接;动态的DH算法;

  10LBLCRLBLC with Replication):带复制的本地最少连接

 

八、LVS-NAT模式的简单实现:(How

1NAT模式特性:

  1)集群节点跟DSDirector ServerLvs负载均衡调度器)必须工作在同一个IP的网络中;

  2RIP通常是私有地址,仅用于各集群节点间的的通信

  3DS位于clientRealServer之间,并负责处理进出的所有通道。

  4RealServer必须将默认网关指向DS(将RIP网关设置为DIP);

  5DS支持端口映射;

  6Realserver可以使用任何类型的操作系统(os

  7)较大规模应用场景中,DirectorServer易成为系统瓶颈

 

2、过程解析:

   DS(负载均衡调度器)收到用户请求报文,根据调度算法,使用目标地址转换(DNAT转换VIPRIP

发送给Real ServerRS处理完请求将回执报文经由默认网关(NAT模式下,RS默认网关指向DS的内网IP

发送给用户(CIP),DS收到报文后使用源地址转换(SNAT转换RIPVIP)发送给请求用户,Lvs完成NAT模式调度。

 

 

3、注意事项:

  1NAT模式报文进出都要经由DS处理,需要打开路由转发功能。

  ~]#echo 1 > /proc/sys/net/ipv4/ip_forward #临时开启

  2RealServer服务器Gateway(网关)必须指向DS服务器

  3)使用ipvsadm命令配置的规则要写成脚本,设为开机启动,否则重启后规则失效

  4)服务器集群应当注意保持各服务器的时间同步。可配置chronyntp时间同步服务器,系统支持的话可以优先考虑chrony这种轻量级的时间同步工具。

 

4、基本信息

  虚拟平台:VMware ESXI6.0

  系统版本: CentOS Linux release 7.2.1511(Core)

  内核版本: 3.10.0-327.el7.x86_64

 Lvs-DSVIP172.16.39.23 DIP192.168.107.150 #DS服务器使用双网卡,外网请求经过DS调度至内网主机

 RealServer1RIP192.168.107.151gw192.168.107.150

 RealServer2RIP192.168.107.152gw192.168.107.150

 

5RealServer服务器配置 

  1)、RS确认默认网关以设置为DIP

  ~]#ip route

 default via 192.168.107.150 dev eno16777736  proto static metric 100

  2RS1|2:两台RS服务器上安装http服务

  ~]#yum install httpd -y

  3RS2上更改web服务80端口为8080测试NAT模式端口映射功能

  RS2~]# vim /etc/httpd/conf/httpd.conf

   Listen 8080

    4)为两台RealServer主机创建测试页

  RS1~]# echo "RealServer1" > /var/www/html/index.html

  RS2~]# echo "RealServer2" > /var/www/html/index.html

    5)启动服务

  ~]#systemctl start httpd

 

6Lvs-DS服务器配置

  1)安装LVS调度算法配置工具:ipvsadm

  ~]#yum install ipvsadm -y

    2)测试用,临时开启路由转发功能,想要永久保存,应写入配置文件

  ~]#echo 1 > /proc/sys/net/ipv4/ip_forward

    3)定义调度规则

  ~]#ipvsadm -A -t 172.16.39.23:80 -s rr #-A=增加群集规则,-t=VIP-s=调度算法

  ~]#ipvsadm -a -t 172.16.39.23:80 -r 192.168.107.151:80 -m -w 1 #-a=增加RealServer规则,-r=RSIP-m=NAT模式,-w=权重

  ~]#ipvsadm -a -t 172.16.39.23:80 -r 192.168.107.152:8080 -m -w 2 #使用lvs端口映射功能,把DR80端口映射到RS2上的8080端口

    4)测试效果

  ~]#for i in {1..10};do curl 172.16.39.23/;done

 RealServer1

 RealServer2

 RealServer1

 RealServer2

    5)修改LVS集群规则

  ~]#ipvsadm -E -t 172.16.39.23:80 -s wrr #-E 修改群集规则为加权轮询

  ~]#ipvsadm -e -t 172.16.39.23:80 -s 192.168.107.151:80 -m -w 3 #-e 修改RS规则

  ~]#ipvsadm -Ln

 TCP  172.16.39.23:80 wrr

  ~]#for i in {1..10};do curl 172.16.39.23/;done

 RealServer1

 RealServer2

 RealServer2

  ...

  ~]#ipvsadm -Ln --stats #显示连接统计数据

  ~]#ipvsadm -Ln --rate  #显示速率

 

<End>

 

九、LVS-DR模式的简单实现:

1DR模式特性:

  1)各集群节点跟DS必须在同一个物理网络中;

 2)RIP可以使用公网地址,实现便携的远程管理和监控;

 3)DS仅负责处理入站请求,响应报文则有RealServer直接发往客户端

 4)RealServer不能将网关指向DIP,而是直接指向前端网关;

 5)DS不支持端口映射

  6)大多数操作系统能够用在RealServer

 7)DS能够处理更多的RealServer

 

2、过程解析:

   DS(负载均衡调度器)收到用户请求报文,根据调度算法,使用Mac地址转换(把VIPMac转换为RSMac),

    将请求报文发送给RealServerRS处理完请求后,回执报文不再经由DS,而是直接发送给用户(CIP),Lvs完成DR模式调度。

 

3、注意事项:

  1)DR模式LVSRealServer不在经由DR返回用户,而是直接通过路由返回用户,所以DRRS要配置相同的VIP地址,且需要禁止RSVIPARP广播。

  #DRVIP设置成物理网卡的辅助IP,设完ping测试

  ~]#ifconfig eno16777736:1 172.16.39.12 netmask 255.255.255.255 broadcast172.16.39.12

  #RSVIP设置到lo口,并设置为只对自己广播,且从内核参数项修改禁止arp广播

  ~]#ifconfig lo:0 172.16.39.12 netmask 255.255.255.255 broadcast 172.16.39.12 up

 2)RealServer服务器GateWay绝对不能指向DR,设置为局域网内的默认路由网关即可

  3)使用ipvsadm命令配置的规则要写成脚本,设为开机启动,否则重启后规则失效

  4)服务器群集应当注意保持各服务器的时间同步,可配置chronyntp时间同步服务器,系统支持的话可以优先考虑chrony这种轻量级的时间同步工具。

 

4、基本信息

    虚拟平台:VMware ESXI6.0

  系统版本: CentOS Linux release 7.2.1511(Core)

  内核版本: 3.10.0-327.el7.x86_64

   Lvs Director Server DIP172.16.39.201 VIP172.16.39.180 #VIP绑定在DIP所在物理网卡上

   RealServer1RIP172.16.39.202gw172.16.0.1VIP172.16.39.180  #VIP绑定在lo口上

   RealServer2RIP172.16.39.203gw172.16.0.1VIP172.16.39.180  #VIP绑定在lo口上           

 

5RealServer配置

   1) 确认RIP与默认网关与基本信息相匹配;

   ~]# ip route

   default via 172.16.0.1 dev eno16777736 proto static  metric 100

   172.16.0.0/16 dev eno16777736 proto kernel  scope link  src 172.16.39.202  metric 100

   2) RS1|2:两台RS服务器上安装http服务

   ~]# yum install httpd -y

   3) LVS-DR模式不支持端口映射,先前实验的端口需要改回来

   RS2 ~]# vim /etc/httpd/conf/httpd.conf

   Listen 80

   4) 为两台RealServer主机创建测试页

   RS1 ~]# echo "RealServer1" > /var/www/html/index.html

   RS2 ~]# echo "RealServer2" > /var/www/html/index.html

   ~]# systemctl start httpd

   5) 设置VIP地址

   ~]# ifconfig lo:0 172.16.39.180 netmask 255.255.255.255 broadcast172.16.39.180 up

   ~]# tree /proc/sys/net/ipv4/

   6) 写一个脚本,其功能具备修改还原内核参数,禁止VIP发出ARP广播;

   ~]# vim set-kernel-arp.sh

   #!/bin/bash

    #

   vip=172.16.39.180

   mask=255.255.255.255

 

   case $1 in

   start)

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

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

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

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

       ifconfig lo:0 $vip netmask $mask broadcast $vip up

           ;;

   stop)

       ifconfig lo:0 down

     echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

     echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

           ;;

   *)

      echo "Usage:$(basename $0):(start|stop)"

           ;;

   esac

    

   7) 脚本授权与启动

   ~]# chmod 750 set-kernel-arp.sh

   ~]# sh set-kernel-arp.sh start

    8 查看是否生效

   ~]# ifconfig lo:0

 

6Lvs负载均衡调度服务器配置:DirectorServer

    1)临时禁用内网网卡

   ~]# ip link set eno33554960 down

    2)绑定VIP到物理网卡的辅助接口上

   ~]# ifconfig eno16777728:1 172.16.39.180/32 netmask 255.255.255.255broadcast 172.16.39.180

   3)配置Lvs负载均衡调度规则(-g=LVS-DR模式)

   ~]# ipvsadm -A -t 172.16.39.180:80 -s wrr

   ~]# ipvsadm -a -t 172.16.39.180:80 -r 172.16.39.202 -g -w 1

   ~]# ipvsadm -a -t 172.16.39.180:80 -r 172.16.39.203 -g -w 2

    4)客户端测试正常,DS调度器以WRR加权轮询的静态算法调度RS主机

   [root@Client ~]# for i in {1..10};do curl 172.16.39.180/;done

    5Firewall Mark;为VIP172.16.39.18080端口打上防火墙标记,基于标记定义规则

   ~]# iptables -t mangle -A PREROUTING -d 172.16.39.180 -p tcp --dport 80-j MARK --set-mark 6

   ~]# iptables -t mangle -vnL

   ~]# ipvsadm -A -f 6 -s rr #-f=MARK

    ~]#ipvsadm -a -f 6 -r 172.16.39.151 -g

   ~]# ipvsadm -a -f 6 -r 172.16.39.152 -g

    6lvs persistence:(持久连接):-p,附加在调度算法之上的会话绑定机制;只在一段时间内有效。

   ~]# ipvsadm -E -f 8 -s wrr -p

    7)多端口防火墙标记,为VIP23端口定义mangle规则,打上标记,使22端口能匹配基于防火墙标记的规则

   ~]# iptables -t mangle -A PREROUTING -d 172.16.39.180 -p tcp --dport 23-j MARK --set-mark 6

    8)客户端多次连接telnet测试,确认Firewall Mark下的persistence生效。

   [root@Client ~]# telnet 172.16.39.180

 

<End>