LVS技术浅析

http://blog.sina.com.cn/u/2015038597

LVS技术浅析-WHY

 

LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器,早在2.4内核就已经合并入linux标准内核,并被全球各大互联网公司广泛使用;据我所知,国内百度/新浪/阿里/腾讯等都在使用LVS;下图是LVS在常用互联网应用架构中的位置:LVS处于最前端,用于将用户请求转发到后端的多台webserver上。

LVS技术浅析-WHY

LVS引入Virtual Server的概念,用户的请求由Virtual Server按一定负载均衡策略(如,round-robin)转发到多台后端webserver上,后端webserver被称为RealServer

注:当前,无论是LVS还是商业LB均采用了VirtualServer的概念。

LVS技术浅析-WHY

对于用户来说,其一直和Virtual Server通讯,不用关心后端有哪些RealServer;对于服务网站来说,其可以根据请求规模扩大/缩减RealServer数量,而不需要通知用户。 

       介绍到这,可能有人会问,在LVS出现以前,还有哪些LB技术?LVS比这些技术好在哪里?why LVS

       在这之前,普遍使用DNS技术来实现LoadBalance,例如,www.taobao.com这个域名在DNS中配置对应5ip地址(5apache server);DNS服务器一般会采用round-robin的策略返回ip地址给用户,从而实现流量在5apache server间的负载均衡。

1DNS技术介绍参见:http://en.wikipedia.org/wiki/Domain_Name_System

2:常用的DNS开源软件是BIND,参见:https://www.isc.org/software/bind

LVS技术浅析-WHY

       LVS相比,DNS有如下不足:

1.       一台apache server down后,DNS中删除相应ip,删除生效时间不可控;(Local DNS不一定严格遵守约定的TTL)

2.      负载均衡策略单一,只支持WRRweight-Round-Robin)策略;

3.      Apache Server间流量不均衡,因为每个Local DNS后端的用户数量是不同的,TTL也不同;


LVS技术浅析-配置管理1

本文将介绍部署LVS一个最简单的流程;
LVS本身是一个内核模块:ip_vs,位于内核目录net/netfilter/ipvs/下,官方网址:http://www.linuxvirtualserver.org/;
从2.4内核开始,linux kernel已经集成了ipvs模块;因此,当前我们的系统kernel都是支持LVS功能的,无需额外下载;

那么,我们如何操作内核模块ipvs呢?
LVS官方提供了一个应用程序ipvsadm,可用通过ipvsadm的一系列命令和内核ipvs打交道。

1.ipvsadm
ipvsadm程序可以从官网http://www.linuxvirtualserver.org/software/ipvs.html下载,最新版本为ipvsadm-1.26 ;
编译过程中,可能会遇到error,官网已经提供了解决方法:http://kb.linuxvirtualserver.org/wiki/Compiling_ipvsadm_on_different_Linux_distributions#Red_Hat_Enterprise_Linux_6;
ipvsadm安装完毕后,简单地配置一个LVS:
vip为10.220.1.8,端口80,调度算法为RR(round-robin);
2台realserver 192.168.1.10/11
转发模式为DR
LVS服务器上配置:

  • 添加1个vip

      ipvsadm -A -t 10.220.1.8:80 -s rr

  • 添加2台rs

      ipvsadm -a -t 10.220.1.8:80 -r 192.168.1.10:80 -g

      ipvsadm -a -t 10.220.1.8:80 -r 192.168.1.11:80 -g

  • 查看配置

      ipvsadm -ln

  • 绑定vip到接口网卡eth0

      ip addr add 10.220.1.8/32 dev eth0

RS服务器上配置:

  • 绑定vip到lo网络接口

      ip addr add 10.220.1.8/32 dev lo

      配置完毕,用ip addr list查看;

  • 防止vip mac冲突

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

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


LVS技术浅析-配置管理2

上篇《LVS技术浅析-配置管理1》主要介绍了采用ipvsadm命令配置LVS;
ipvsadm虽然可以完成LVS的所有配置,但要线上应用,还有一些不足;

  • LVS down了怎么办?

    LVS一旦down了,则所有流量都会损失;因此,我们需要做好LVS冗余;

  • RS down了怎么办?

    RS down掉后,LVS调度到该RS的流量就会损失;因此,我们需要对RS进行健康监测;

LVS管理软件-keepalived-很好的解决了上述问题,

  • LVS down?- 采用VRRP心跳协议,实现LVS主备冗余;
  • RS down? - 提供4/7层健康检测;

我们线上都采用该软件进行LVS配置管理;

keepalived官网:http://www.keepalived.org/,最新版本为1.2.7;

2. keepalived

keepalived主要以配置文件的方式来管理LVS;

默认配置文件为 /etc/keepalived/keepalived.conf;

启动方式: keepalived -d -f /etc/keepalived/keepalived.conf;

接下来,我们详细介绍一下keepalived.conf的常用配置选项;

global_defs {
#这个一般不配置,用途不大
}

#下面配置LVS主备冗余

#主备冗余采用VRRP协议,是支持一主多从的协议;

#参见http://en.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol

vrrp_instance VI_1 { #主LVS配置
    state MASTER     #该LVS配置为主
    interface eth0   #VRRP心跳包从哪块网卡发出
    virtual_router_id 100 #相同VRID的LVS属于同一组,根据优先级选举出一个主
    priority 150          #VRRP优先级,值越大优先级越高,最大为255
    advert_int 1          #VRRP心跳包的发送周期,单位为s
    authentication {      #认证信息
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
   #VRRP心跳内容,VIP地址
        10.2.1.18
        10.2.1.19

    }
}
vrrp_instance VI_2 { #从LVS配置
    state BACKUP     #该LVS配置为从
    interface eth0   #VRRP心跳包从哪块网卡发出
    virtual_router_id 100 #同主
    preempt_delay 180     #主从切换的延时时间
    priority 100          #优先级值必须小于主
    advert_int 1          #同主
    authentication {      #同主
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    #同主
        10.2.1.18
        10.2.1.19

    }
}

#下面配置内核ip_vs信息和健康监测参数;

#如果几个vip对应相同的RS,则建议采用本group配置;这样可以减少健康检查次数virtual_server_group www {
    10.2.1.18 80    #vip和vport
    10.2.1.19 80
}
virtual_server group www {
    delay_loop 3    #RS健康监测周期,单位为s
    lb_algo wrr     #负载均衡调度算法
    lb_kind DR      #转发模式
    protocol TCP    #传输层协议

    real_server 192.168.10.10 80 { #rs ip和port
        weight 100                 #rs权值,可以根据权值分配rs间流量比例
        TCP_CHECK {                #4层健康监测,即TCP
            connect_timeout 7      #4层连接超时时间,单位为s
        }
    }
    real_server 192.168.10.11 80 { #rs ip和port
        weight 100                 #rs权值
        inhibit_on_failure         #rs down时,不删除,而是将weight置为0
        HTTP_GET {                 #7层健康监测,即HTTP   
          url {                   
             path /status.html     #http uri
             status_code 200       #正确http响应的code
          }
        connect_timeout 7          #4层连接超时时间,单位为s
        nb_get_retry 2             #http请求重试次数
        delay_before_retry 5       #http重试时间间隔,单位为s
       }
    }
}


LVS技术浅析-配置管理3

上一篇《配置管理2》,我们介绍了如何利用keepalived来部署LVS;
本文将介绍一些LVS配置的注意点,以及 性能相关的一些配置;
1. SH调度算法-尽量不要采用
   一些业务为了支持会话保持,选择SH调度算法,以实现 同一源ip的请求调度到同一台RS上;但 SH算法本省没有实现一致性hash,一旦一台RS down,当前所有连接都会断掉;如果配置了inhibit_on_failure,那就更悲剧了,调度到该RS上的流量会一直损失;
   实际线上使用时,如需 会话保持,建议配置 persistence_timeout参数,保证一段时间同一源ip的请求到同一RS上;
2. WLC调度算法-注意RS donw->up的影响
  WLC算法下,RS一旦出现down后up的情况,瞬间所有的新建连接都会调度到该RS上,可能会超过该RS处理请求的上限;
3. 关闭网卡LRO/GRO功能
  现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
  因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢;
  解决方法,关闭LRO/GRO功能,命令:
      ethtool -k eth0 查看LRO/GRO当前是否打开
      ethtool -K eth0 lro off 关闭GRO
      ethtool -K eth0 gro off 关闭GRO
4. 手动绑定网卡中断
  当前大多数网卡都是支持硬件多队列的,为了充分发挥多核的性能,需要手动将网卡中断(流量)分配到所有CPU核上去处理;
  查看网卡中断:
        cat /proc/interrupts
          54:  188324418       0     IR-PCI-MSI-edge      eth0-TxRx-0
              55:  167573416       0     IR-PCI-MSI-edge      eth0-TxRx-1
  绑定网卡中断到CPU核:
      echo  01 > /proc/irq/54/smp_affinity
          echo    02 > /proc/irq
/55/smp_affinity

    关闭系统自动中断平衡:
      service irqbalance stop
  如果网卡硬件不支持多队列,那就采用google提供的软多队列RPS;
  配置方法同硬中断绑定;
  查看软队列:
        cat  /sys/class/net/eth0/queues/rx-0/
rps_cpus
     cat  /sys/class/net/eth0/queues/rx-1/rps_cpus
  绑定软队列到CPU核:
     echo 01 > /sys/class/net/eth0/queues/rx-0/rps_cpus
        echo  02 > /sys/class/net/eth0/queues/rx-1/
rps_cpus
5. 修改LVS内核配置,提高性能
   LVS内核默认配置 连接hash表大小为4K,16把hash桶锁;如果应用的并发连接数>4w,则上述配置会无法满足性能需求;
   调大连接hash表:
       在内核源码根目录下,修改文件 vim .config - CONFIG_IP_VS_TAB_BITS=20;
   增大hash桶锁个数:
       ipvs源码目录下,修改文件vim ip_vs_conn.c - #define CT_LOCKARRAY_BITS  8;
6. BIOS中关闭超线程
   关闭超线程 也是基于性能考虑;


LVS技术浅析-proc参数

 

根据前文的介绍,可以通过ipvsadm命令和LVS内核打交道;
除此之外,我们还可以通过proc参数,来 配置全局参数 和 获取统计信息;

  • 配置全局参数,位于目录/proc/sys/net/ipv4/vs/下;
  • 获取统计信息,位于目录/proc/net/下;

下面介绍一下几个常用的proc参数;

1. /proc/net/ip_vs

     获取当前LVS内核 配置,包括VS和RS相关信息;同ipvsadm -ln;
IP Virtual Server version 1.2.1 (size=1048576) - 这里size是指连接hash表大小;
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP   0ADC0108:0050 rr                                                   - vs信息,vip和vport 16进制,调度算法rr;
   -> C0A8010B:0050           Route     1           0                   0     - rs信息,rip和rport 16进制,权值为1,
   -> C0A8010A:0050           Route     1           0                   0     - ActiveConn是指established状态的连接个数;
                                                                                                           - InActConn是指非established状态的连接个数;
2./proc/net/ip_vs_conn
   获取所有连接信息,建议不要用该命令,因为连接数很多时,CPU开销会很大;
Pro FromIP     FPrt ToIP         TPrt DestIP     DPrt State             Expires
- 用户ip和port     vs ip和port   rs ip和port   tcp状态机状态   连接超时剩余的时间
3./proc/net/ip_vs_stats
   获取 连接/数据包/字节数 的全局统计信息;
   第一行是 累计值;
   第二行是 速率,统计周期为2s;
     Total Incoming Outgoing                 Incoming                 Outgoing
     Conns   Packets   Packets                       Bytes                       Bytes
             0               0               0                               0                               0

  Conns/s     Pkts/s     Pkts/s                   Bytes/s                   Bytes/s
             0               0               0                               0                               0
4./proc/sys/net/ipv4/vs/expire_nodest_conn
   默认值为0,当LVS转发数据包,发现目的RS无效(删除)时,会丢弃该数据包,但不删除相应 连接;这样设计的考虑是,RS恢复时,如果Client和RS socket还没有超时,则 可以继续通讯;
   如果将该参数置1,则马上释放相应 连接;
   个人建议采用默认值,配置为0;
5. /proc/sys/net/ipv4/vs/expire_quiescent_template
   默认值为0,当RS的weight值=0(如,健康检测失败,应用程序将RS weight置0)时,会话保持的新建连接 还会继续调度到该RS上;
   如果配置为1,则马上将 会话保持的连接模板 置为无效,重新调度新的RS;
   如果有会话保持的业务,建议该值 配置为1;
6. /proc/sys/net/ipv4/vs/nat_icmp_send
   默认值为0;
   如果置为1,当LVS收到RS发送出来的数据包,但没有找到相应连接时,则发送目的不可达(端口不可达)的ICMP给RS;
   建议采用默认值,为0;
7. /proc/sys/net/ipv4/vs/sync_threshold
   默认值为 3   50;
   这个参数和连接同步相关,LVS收到3个包后,开始启动同步;之后,每收到50个包,启动一次同步;
   可以根据LVS的流量,可以调整连接同步的频率,从而控制同步的系统开销;
8.  /proc/sys/net/ipv4/vs/下其它参数
  用于“内存不足时释放连接”,但当前服务器内存很大,这些参数已经无用;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值