LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。该项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
  LVS是实现系统扩展的较好的一种方法,它基于软件实现,在人力财力方面节省了很多。

LVS的特性:
   高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
   稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
   成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
   配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
   支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
   支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
   应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
缺点:工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。

lvs集群一些术语:
   VS: Virtual Server,负责调度
   director,balancer 负载均衡器
   RS: Real Server,后端请求处理器,负责真正提供服务
   DIP:director ip ,负载均衡器IP
   VIP:virtual IP 负载均衡器虚拟IP
   L4:四层路由器或交换机
   CIP:client ip 用户端IP

LVS 原理 和 keepalived_服务器


工作原理:客户端将请求发送到LVS上,LVS根据请求报文的目标和目标协议以及端口将其调度转发到某目标RS上,其RS是根据调度算法来进行挑选的。这样可以均衡负载达到高效率工作。

【LVS负载均衡的工作模式】

1、NAT

LVS 原理 和 keepalived_服务器_02


  本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和port实现转发

  (1)RIP和DIP必须在同一个IP网络中,且应该使用私网地址;RS的网关要指向DIP。

  (2)请求报文和响应报文都必须经由director转发,director容易成为系统瓶颈

  (3)支持端口映射,可修改请求报文的目标port

  (4)VS必须是Linux系统,RS可以是任意OS系统

2、DR:direct routing
  直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标Mac是某挑选出的RS的RIP所在接口的Mac地址;源IP/port,以及目标IP/port均保持不变。
  首先要确保director和各RS都配置有VIP
  (1)确保前端路由器将目标IP为VIP的请求报文发往director
  (2)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由director
  (3)RS和director要在同一物理网络
  (4)请求报文要经由director,但响应报文不经由director,而由RS直接发往client
  (5) 不支持端口映射(端口不能修改)
  (6)RS可使用大多数OS系统。

3、tun
  隧道方式 。转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP为DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
  (1)DIP,VIP,RIP都应该是公网地址
  (2)RS的网关不能也不可能指向DIP
  (3)请求报文要经由director,但响应不能经由director
  (4)不支持端口映射
  (5)RS的OS须支持隧道功能

4、full-nat
通过同时修改请求报文的源IP地址和目标IP地址进行转发
   CIP –> DIP
   VIP –> RIP
(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
(2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但director还要将其发往client
(3)请求和响应报文都经由director
(4)支持端口映射。
此类型kernel默认不支持。

【LVS负载均衡的调度算法】

  ipvs scheduler,根据其调度时是否考虑各RS当前的负载状态分为静态和动态方法。
静态:仅根据算法自身进行调度
RR:roundrobin 轮询
  调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等的对待每一台服务器,而不管服务器上实际的连接数和系统负载。
WRR:加权轮询
  调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态的调整其权值。
  SH:原地址哈希;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定。
  DH:目标地址哈希;将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型应用场景是正向代理缓存场景中的负载均衡,如:宽带运营商。

动态:主要根据每RS当前的负载状态及调度算法进行调度。overhead=value较小的RS将被调度。
  LC:least connections 适用于长连接应用
  Overhead=activeconns*256+inactiveconns
  WLC:Weighted LC,默认调度方法
  Overhead=(activeconns*256+inactiveconns)/weight
  SED:Shortest Expection Delay,初始连接高权重优先,最短延迟调度
  Overhead=(activeconns+1)*256/weight
  NQ: Never Queue(永不排队),第一轮均匀分配,后续SED
  LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
  LBLCR:LBLC with Replication,带复制功能的LBLC
解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

【实验】基于NAT模式的LVS实现

实验环境:

LVS 原理 和 keepalived_LVS 原理 和 keepalived_03

1、首先负载均衡器需要有两个地址,VIP和DIP。这里我们将172网段作为公网地址,192网段作为私网地址。

LVS 原理 和 keepalived_负载均衡_04

2、设置负载均衡器需要使用一个工具:ipvsadm

LVS 原理 和 keepalived_服务器_05

3、
简单看一下ipvsadm的一些选项

选项

注释

-a –add-server

在服务器表中添加一条新的真实主机记录

-r –real-server

真实服务器地址

-m –masquerading

指定LVS工作模式为NAT模式

-w –weight

真实服务器的权值

-g –gatewaying

指定LVS工作模式为直接路由器模式,(DR模式)

-i –ip

指定LVS的工作模式为隧道模式

-p

会话保持时间,定义流量转到同一个realserver的会话存留时间

-s –scheduler

使用的调度算法

-E –edit-service

编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D –delete-service

删除内核虚拟服务器表中的一条虚拟服务器记录。

-C –clear

清除内核虚拟服务器表中的所有记录。

-R –restore

恢复虚拟服务器规则

-S –save

保存虚拟服务器规则,输出为-R 选项可读的格式

-e –edit-server

编辑一条虚拟服务器记录中的某条真实服务器记录

-d –delete-server

删除一条虚拟服务器记录中的某条真实服务器记录

-L-l –list

显示内核虚拟服务器表

–numeric, -n:

以数字形式输出地址和端口号

–exact:

扩展信息,精确值

–connection,-c:

当前IPVS连接输出

–stats:

统计信息

–rate :

输出速率信息

-Z –zero

虚拟服务表计数器清零(清空当前的连接数量等)

在负载均衡器上设置规则,

设置本机为负载均衡器并且添加后台两个real server记录:

LVS 原理 和 keepalived_负载均衡_06

因为这里是实验环境,需要开启虚拟机的路由转发功能:

LVS 原理 和 keepalived_负载均衡_07


LVS 原理 和 keepalived_LVS 原理 和 keepalived_08

4、将两台real server 的网关地址指向DIP

LVS 原理 和 keepalived_DR模式_09


LVS 原理 和 keepalived_服务器_10

LVS 原理 和 keepalived_负载均衡_11


LVS 原理 和 keepalived_LVS 原理 和 keepalived_12

5、客户端进行测试访问。由于我们之前设置的两台realserver的权重不同,故访问调度也不同,可以从图中明显看出来:

LVS 原理 和 keepalived_DR模式_13