首页 > 代码库 > Lvs原理及简单实现

Lvs原理及简单实现

Lvs原理及简单实现

大纲:

一、集群概述

二、什么是Lvs?(what)

三、为什么要用Lvs?(why)

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

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

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

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

八、如何部署Lvs之NAT模式?(How)

九、如何部署Lvs之DR模式?


一、集群简介:

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


  常用的集群软硬件:

    1、开源集群软件:Lvs、Keepalive、Haproxy、Nginx、Apache、Heartbeat、Corosync+Pacemaker等;

    2、商业集群硬件:F5、Array、Netscaler、Radware、A10等;


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

    1、LB:负载均衡(Load Balancing)

    2、HA:高可用(High-Availablity)

    3、HP:高性能(High-Perfomance)


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

    1、四层负载均衡:

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

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

    2、七层负载均衡:

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


技术分享


二、什么是Lvs(what)?

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


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

    1、负载均衡层(Load Balancing)

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

    2、服务器池层(Server Pool)

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

    3、共享储存层(Shared Storage)

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


技术分享

三、为什么要用Lvs?(why)

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

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

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

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

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


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

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

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

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


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

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

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

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


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

  Linux运维工程师/架构师;


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

  Lvs支持的三种模式:

  1、NAT(Network Address Translation):网络地址转换


技术分享


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


  2、TUN(IP Tunneling):IP隧道技术


技术分享   


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

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

  3、DR(Direct Routing):直接路由


技术分享


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


  Lvs支持的十种算法:

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

  1、RR(Round Robin):轮询

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

  2、WRR(Weighted RR),加权轮询

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

  3、SH(Source Hashing):源地址哈希;实现会话保持;

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

  4、DH(Destination Hashing):目标地址哈希

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

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

  5、LC(Least Connections):最少连接

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

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

  6、WLC(Weighted LC):加权最少连接

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

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

  7、SED(Shortest Expection Delay):最短期望延迟

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

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

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

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

  10、LBLCR(LBLC with Replication):带复制的本地最少连接


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

1、NAT模式特性:
  1)集群节点跟DS(Director Server,Lvs负载均衡调度器)必须工作在同一个IP的网络中;
  2)RIP通常是私有地址,仅用于各集群节点间的的通信
  3)DS位于client和RealServer之间,并负责处理进出的所有通道。
  4)RealServer必须将默认网关指向DS(将RIP网关设置为DIP);
  5)DS支持端口映射;
  6)Realserver可以使用任何类型的操作系统(os)
  7)较大规模应用场景中,DirectorServer易成为系统瓶颈

2、过程解析:
    DS(负载均衡调度器)收到用户请求报文,根据调度算法,使用目标地址转换(DNAT转换VIP为RIP)
发送给Real Server,RS处理完请求将回执报文经由默认网关(NAT模式下,RS默认网关指向DS的内网IP)
发送给用户(CIP),DS收到报文后使用源地址转换(SNAT转换RIP为VIP)发送给请求用户,Lvs完成NAT模式调度。


3、注意事项:
  1)NAT模式报文进出都要经由DS处理,需要打开路由转发功能。
  ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #临时开启
  2)RealServer服务器Gateway(网关)必须指向DS服务器
  3)使用ipvsadm命令配置的规则要写成脚本,设为开机启动,否则重启后规则失效
  4)服务器集群应当注意保持各服务器的时间同步。可配置chrony或ntp时间同步服务器,系统支持的话可以优先考虑chrony这种轻量级的时间同步工具。

4、基本信息
  虚拟平台:VMware ESXI6.0;
  系统版本: CentOS Linux release 7.2.1511 (Core)
  内核版本: 3.10.0-327.el7.x86_64
  Lvs-DS:VIP:172.16.39.23 DIP:192.168.107.150 #DS服务器使用双网卡,外网请求经过DS调度至内网主机
  RealServer1:RIP:192.168.107.151 gw:192.168.107.150
  RealServer2:RIP:192.168.107.152 gw:192.168.107.150

5、RealServer服务器配置	
  1)、RS确认默认网关以设置为DIP
  ~]# ip route
  default via 192.168.107.150 dev eno16777736  proto static  metric 100 
  2)RS1|2:两台RS服务器上安装http服务
  ~]# yum install httpd -y
  3)RS2上更改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 

6、Lvs-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端口映射功能,把DR的80端口映射到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模式的简单实现:

1、DR模式特性:
  1)各集群节点跟DS必须在同一个物理网络中;
  2)RIP可以使用公网地址,实现便携的远程管理和监控;
  3)DS仅负责处理入站请求,响应报文则有RealServer直接发往客户端
  4)RealServer不能将网关指向DIP,而是直接指向前端网关;
  5)DS不支持端口映射
  6)大多数操作系统能够用在RealServer
  7)DS能够处理更多的RealServer

2、过程解析:
    DS(负载均衡调度器)收到用户请求报文,根据调度算法,使用Mac地址转换(把VIP的Mac转换为RS的Mac),
    将请求报文发送给RealServer,RS处理完请求后,回执报文不再经由DS,而是直接发送给用户(CIP),Lvs完成DR模式调度。

3、注意事项:
  1)因DR模式LVS的RealServer不在经由DR返回用户,而是直接通过路由返回用户,所以DR与RS要配置相同的VIP地址,且需要禁止RS上VIP的ARP广播。
  #将DR的VIP设置成物理网卡的辅助IP,设完ping测试
  ~]# ifconfig eno16777736:1 172.16.39.12 netmask 255.255.255.255 broadcast 172.16.39.12
  #将RS的VIP设置到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)服务器群集应当注意保持各服务器的时间同步,可配置chrony或ntp时间同步服务器,系统支持的话可以优先考虑chrony这种轻量级的时间同步工具。

4、基本信息
    虚拟平台:VMware ESXI6.0;
  系统版本: CentOS Linux release 7.2.1511 (Core)
  内核版本: 3.10.0-327.el7.x86_64
    Lvs Director Server DIP:172.16.39.201 VIP:172.16.39.180 #VIP绑定在DIP所在物理网卡上
    RealServer1:RIP:172.16.39.202 gw:172.16.0.1 VIP:172.16.39.180  #VIP绑定在lo口上
    RealServer2:RIP:172.16.39.203 gw:172.16.0.1 VIP:172.16.39.180  #VIP绑定在lo口上 			

5、RealServer配置
    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 broadcast 172.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

6、Lvs负载均衡调度服务器配置:Director Server
    1)临时禁用内网网卡
    ~]# ip link set eno33554960 down 
    2)绑定VIP到物理网卡的辅助接口上
    ~]# ifconfig eno16777728:1 172.16.39.180/32 netmask 255.255.255.255 broadcast 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
    5)Firewall Mark;为VIP:172.16.39.180的80端口打上防火墙标记,基于标记定义规则
    ~]# 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
    6)lvs persistence:(持久连接):-p,附加在调度算法之上的会话绑定机制;只在一段时间内有效。
    ~]# ipvsadm -E -f 8 -s wrr -p 
    7)多端口防火墙标记,为VIP的23端口定义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>



参考:

   Lvs官方站点:http://www.linuxvirtualserver.or

   吴佳明(普空):http://blog.sina.com.cn/s/blog_620c47630102v2iz.html

   

本文出自 “Linux运维” 博客,请务必保留此出处http://allenyang.blog.51cto.com/10991027/1845548

Lvs原理及简单实现