lvs是什么?

   lvs即linux virtual server,是LB(load balance)集群调度器的一种实现方法,是一种layer4 router,它能够根据目标地址、端口及调度方法,做出转发至哪一个后端的决策。

   通常来讲,lvs由ipvs和ipvsadm两部分组成,ipvs工作于内核中,是lvs的核心组件,ipvsadm用于编、修改、保存规则。

   ipvs工作于内核中,查看某redhat系列的系统是否支持此功能的方法是查看内核的编译参数。

lvs基础知识及lvs-nat模型的简单模拟_第1张图片

如果没有ipvs相关的项目,则需要为内核打补丁,才能使该系统支持ipvs功能。redhat系列的系统上,2.6以上版本的内核,已经把此功能收录进去了。



  lvs中常用的术语

   Host:

Director:调度器

Real Server: RS,后端提供服务的主机

   IP:

        Client: CIP

Director Virtual IP: VIP(VIP也即客户端访问服务器时所使用的IP)

Directory IP: DIP

Real Server IP: RIP


  调度方法

lvs的调度方法一共有十种。

静态方法:

RR:round-robin,轮询,来自客户端的请求会平均的分配给后端的每一台RS。


WRR:weightedround-robin,加权轮询,每一个RS会被分配一个权重,权重越大,表示承载能力越强,Director会根据权重分配相应比例的请求给RS。

 

SH:Source iphashing,源地址哈希,来自某一ip的请求会被定向至某一台RS。

         某地址第一次访问时,director会把源地址抽取出来,并使用调度算法(RR或WRR)本身挑选RS,并把RS和源地址的对应关系记录下来(保存于director内部的哈希表中),之后客户端的访问会先根据哈希表挑选RS。

会话绑定:session stick,SH是实现会话绑定的一种方案。

DH:Destination iphashing,目标地址哈希。客户端访问某一固定URL时,director会选择某一固定的RS。


动态方法

LC:leastconnection

Overhead,当前RS的负载状态,数值小表示负载低。

overhead=Active*256+inactive

Director会分配请求给Overhead小的RS。

 

WLC:weightedleastconnection

 overhead=(active*256+inactive)/weighted

没有显式指定调度方法时的默认调度方法。

 

SED:shortedexpection delay

Over=(Active+1)*256/weight

是对WLC的改进。

 

NQ:Neverqueue

每一个RS先分一个,之后的连接再根据SED算法进行调度

 

LBLC:local-Baseleast connection

可以理解为动态方式的DH,

尽量保证用户访问同一个地址的时候都定向至同一RS(跟缓存有关),当该RS压力过大时,会调度至其它的RS

 

LBLCR:replicatedLBLC

带复制的LBLC,当某一RS负载过大,请求被调度至其它RS时,跟Destination 相关的缓存同时也会被复制。

 

   ipvsadm

   ipvsadm是ipvs的规则编写工具。管理集群服务,管理集群服务中的RS,查看ipvs规则,

   管理集群服务

     创建或修改

      ipvsadm -A|E -t|u|f service-address [-s scheduler]

      -t:对于tcp承载的某协议服务。

      -u:承载的应用层协议为基于UDP协议提供服务的协议。

      -f:f表示Fire wall之意,承载的应用层协议为基于TCP或UDP协议提供服务的协议,但此类报文会经由iptables/netfilter打标记,即为防火墙标记。主要用于把两个不同端口的服务定义为一个。

      -s:指明调度方法。

例如:ipvsadm -A -t 172.16.7.1:80 -s rr
      ipvsadm -E -t 172.16.7.1:80 -s wlc

    删除:

     ipvsadm -D -t|u|f service-address

ipvsadm -D -t 172.16.7.1:80

    管理集群服务中的RS

  ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

    -r:指明RS,server-address格式一般为“IP[:PORT]”;注意,只支持端口映射的lvs类型中才应该显式定义此处端口

   [-g|i|m]:指明lvs类型

    -g:表示dr类型

    -i:表示tun类型

    -m:表示nat类型

  当此选项省略是表示使用dr类型

     -w:指明权重

ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.2 -m -w 3

   删除集群服务中的某一主机

ipvsadm -d -t 172.16.7.1:80 -r 192.168.7.2

   清空所有集群服务的定义

ipvsadm -C

 保存集群服务及RS的相关定义

   ipvsadm -S > /etc/sysconfig/ipvsadm

   ipvsadm-save > /etc/sysconfig/ipvsadm

  service ipvsadm save

   ipvsadm的配置文件/etc/sysconfig/ipvsadm.conf中定义了ipvs的规则保存于/etc/sysconfig/ipvsadm中。

  

  恢复规则

 ipvsadm -R < /etc/sysconfig/ipvsadm

 ipvsadm-restore < /etc/sysconfig/ipvsadm

 service ipvsadm start


 查看规则

  ipvsadm -L|l [options]

    -c:列出当前所有connection

    ipvsadm -Ln -c

lvs基础知识及lvs-nat模型的简单模拟_第2张图片

  --stats:列出统计数据

  --rate: cps每秒钟的连接数,InPPS,入栈的报文数,OutPPS,出栈的报文数

lvs基础知识及lvs-nat模型的简单模拟_第3张图片

-n:数字格式显示IP及端口


ipvsadm -Z:清空计数器


 lvs的类型

   lvs-nat

lvs基础知识及lvs-nat模型的简单模拟_第4张图片

    其中Director需要有两块网卡,VIP为公网地址,负责接收客户端发来的请求,DIP应该为私网地址,负责与RS通信,RIP1、RIP2、DIP应该在同一网段,RS1、RS2的网关需要指向DIP。

     当client向director的VIP发出请求时,director会根据调度法则将请求报文的目标IP地址修改为后端某一个RS的IP,报文经由director的另外一块网卡(DIP)传送给RS,RS接收并处理后,响应报文的源地址为RIP,目标地址为CIP,因为RS的网关指向DIP,报文会通过DIP传输给director,此时,director会修改报文的报文的源地址为VIP,然后响应给client

    连接并配置好主机后,在director这台主机执行

cat /proc/sys/net/ipv4/ip_forward

确认director主机已开启路由转发功能(可以通过编辑/etc/sysctl.conf文件来修改此参数)

wKioL1VhmFShd8onAABYKIfgE54570.jpg

ipvsadm -A -t 172.16.7.1:80 -s rr
ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.3 -m -w 2
ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.2 -m -w 1