什么是 LVS?

LVS 是 Linux Virtual Server 的简写,也就是 Linux 虚拟服务器,是一个虚拟的服务器集群系统,本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

官方网站:http://www.linuxvirtualserver.org,LVS 实际上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了高效的解决方法,现在 LVS 已经是 Linux 内核标准的一部分。

使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,具有良好的可靠性、可扩展性和可操作性,从而以低廉的成本实现最优的性能。

LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储层。

需要注意的是: LVS不支持正则

为什么要用 LVS

那为什么还需要用 LVS 呢?随着 Internet 的爆炸性增长以及日常生活中的日益重要的作用,Internet 上的流量速度增长,以每年 100% 以上的速度增长。

服务器上的工作负载压力也迅速增加,因此服务器在短时间内将会过载,尤其是对于受欢迎的网站而言。

为了克服服务器的过载压力问题,有两种解决方案:

•      一种是:单服务器解决方案,即将服务器升级到性能更高的服务器,但是当请求增加时,将很快过载,因此必须再次对其进行升级,升级过程复杂且成本高;

•      另一个是:多服务器解决方案,即在服务器集群上构建可扩展的网络服务系统。当负载增加时,可以简单地在群集中添加新服务器或更多服务器以满足不断增长的需求,而商用服务器具有最高的性能/成本比。因此,构建用于网络服务的服务器群集系统更具可伸缩性,并且更具成本效益。

构建服务器集群的方法如下:

基于 DNS 的负载均衡集群:DNS 负载均衡可能是构建网络服务群集的最简单方法。

使用域名系统通过将域名解析为服务器的不同 IP 地址来将请求分发到不同的服务器。

当 DNS 请求到达 DNS 服务器以解析域名时,DNS 服务器将基于调度策略发出服务器 IP 地址之一,然后来自客户端的请求使用相同的本地缓存名称服务器将在指定的名称解析生存时间(TTL)中发送到同一服务器。

但是,由于客户端和分层 DNS 系统的缓存特性,很容易导致服务器之间的动态负载不平衡,因此服务器很难处理其峰值负载。在 DNS 服务器上不能很好地选择名称映射的 TTL 值。

如果值较小,DNS 流量很高,而 DNS 服务器将成为瓶颈;如果值较大,则动态负载不平衡将变得更糟。

即使 TTL 值设置为零,调度粒度也是针对每个主机的,不同用户的访问模式可能会导致动态负载不平衡,因为有些人可能从站点中拉出很多页面,而另一些人可能只浏览了几页然后转到远。

而且,它不是那么可靠,当服务器节点发生故障时,将名称映射到 IP 地址的客户端会发现服务器已关闭。

基于分派器的负载平衡集群:分派器,也称为负载平衡器,可用于在群集中的服务器之

间分配负载,以便服务器的并行服务可以在单个 IP 地址上显示为虚拟服务,并且最终用户可以像单个服务器一样进行交互不知道群集中的所有服务器。

与基于 DNS 的负载平衡相比,调度程序可以按精细的粒度(例如每个连接)调度请求,以实现服务器之间的更好负载平衡。一台或多台服务器发生故障时,可以掩盖故障。

服务器管理变得越来越容易,管理员可以随时使一台或多台服务器投入使用或退出服务,而这不会中断最终用户的服务。

负载均衡可以分为两个级别,即应用程序级别和 IP 级别。例如,反向代理和 pWEB是用于构建可伸缩 Web 服务器的应用程序级负载平衡方法。

他们将 HTTP 请求转发到群集中的其他 Web 服务器,获取结果,然后将其返回给客户端。

由于在应用程序级别处理 HTTP 请求和答复的开销很高,我相信当服务器节点数增加到 5 个或更多时,应用程序级别的负载均衡器将成为新的瓶颈,这取决于每个服务器的吞吐量服务器。

LVS和nginx都可以做负载均衡,那么他们又什么区别呢?

LVS比nginx具有更强的抗负载能力,性能更高,对内存和cpu资源消耗低

lvs工作在网络,具体流量由操作系统内核进行处理,nginx工作在应用层,可针对http应用实施一些分流策略

lvs安装配置比较复杂点,网络依赖性较大,稳定性高,lvs不支持正则表达式,不能实现动静分离操作,

lvs使用的协议范围广, Nginx 仅支持 HTTP、HTTPS、Email 协议,适用范围小。

工作过程:

1.终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给lvs调度,调度器根据自己预设的算法决定将该请求发送给后端的某台web服务器.

2.终端用户访问lvs调度器虽然会被转发到后端真实的服务器,但如果真实的服务器链接的是相同的存储,提供的服务也是相同的服务,最终用户不管访问那台服务器,得到的服务内容都是一样的,,整个集群对用户而言都是透明的.

3.最后根据lvs工作模式不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,lvs的工作模式分为: nat模式, tun模式,以及dr模式

LVS的组成及作用:

lvs由两部分的程序组成:

ipvs(ip virtual server):LVS是基于内核态的Netfilter 框架实现的IPVS功能,工作在内核态,用户配置vip等相关信息并传递到IPVS就需要用到ipvsadm工具.

ipvsadm: 是lvs用户态的配套工具,可以实现vip和rs的增删改查功能,是基于Netlink或者raw socket方式与内核lvs进行通信的, 如果 LVS 类比于 Netfilter,那 ipvsadm 就是类似 iptables 工具的地位。

LVS 负载均衡的基本原理

因为lvs是基于Linux内核中Netfilter框架实现的负载均衡系统.所以这里先说一下netfilter的原理:

Netfilter 其实很复杂也很重要,平时说的 Linux 防火墙就是 Netfilter,不过我们操作的还是 iptables,iptables 和 Netfilter 是 Linux 防火墙组合工具,是一起来完成系统防护工作的。

iptables 是位于用户空间,而 Netfilter 是位于内核空间。iptables 只是用户空间编写和传递规则的工具而已,真正工作的还是 Netfilter。

两者的区别: netfilter是内核态的Linux防火墙机制,它作为一个通用,抽象的框架,提供了一整套hook函数管理机制,提供数据包过滤,网络地址装换,基于协议类型的连接追踪等功能,可在数据包流经过程汇总,根据规则设置若干关卡,来执行操作.

它共设置了 5 个点,包括:

•      prerouting:在对数据包做路由选择之前,将应用此链中的规则。

•      input:当收到访问防火墙本机地址的数据包时,将应用此链中的规则。

•      forward:当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则。

•      output:当防火墙本机向外发送数据包时,将应用此链中的规则。

•      postrouting:在对数据包做路由选择之后,将应用此链中的规则。

iptable 是用户层的工具,提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。

 lvs的基本原理:

 

这里的lvs是基于netfilter框架,调用内核进行工作,工作在input链上,在input链上注册

ip_vs_in HOOK 函数,进行 IPVS 相关主流程。

详细原理概述:

  1. 当客户端访问目标网站时,用户访问请求通过网络,最终通过交换机进入lvs服务器网卡进入内核空间层.
  2. 进入prerouting链后通过查找路由,确认访问的vip是本机ip的话,数据包则会进入到input链中.
  3. 因为ipvs工作input链上,他会根据访问的vip和目标端口进行请求是否为ipvs服务,通过,则会调用注册的ipvs hook函数,进行ipvs流程,并强制修改数据包的相关数据,并将数据包发往postrouting链中.
  4. postrouting链收到数据包后,将根据目标的ip地址服务器,通过路由选路,将数据包最终发送至后端真实服务器中.

LVS 负载均衡的三种工作模式

集群的负载调度技术,可基于ip,端口,内容等进行分发,其中基于ip的负载均衡效率是最高的.

基于ip的负载均衡模式,常见的有三种: 常见的有地址转换(NAT)、IP 隧道(TUN)和直接路由(DR)三种工作模式.

NAT 模式

地址转换:Network Address Translation,简称:NAT 模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,作为客户机的访问入口,也是各节点回应客户机的访问出口,服务器节点使用私有 IP 地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。

 

NAT 实现原理过程如下:

①客户端发出的请求数据包经过网络到达 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。

②然后进入 PREROUTING 链中,根据目的 IP 查找路由,确定是否为本机 IP 地址,随后将数据包转发至 INPUT 链中,源 IP 和 目的 IP 不变。

3. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP

4. POSTROUTING链通过选路,将数据包发送给Real Server

5. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP

6. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为Cip,返回给客户端.

该模式的特征:

rs应该和dip应该使用私网地址,且rs的网关要指向dip;

请求和响应报文都要经路由director转发,极高负载的场景中,director可能称为系统瓶颈,因为需要在这里对目标ip进行装换.

支持端口映射.

rs可以使用任意的操作系统

rs的rip和director的dip必须同一ip网络

缺陷:对Director Server压力会比较大,请求和响应都需经过director server,director往往会成为系统的性能瓶颈

TUN 模式

IP 隧道:IP Tunnel,简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。

实现原理:

在原有的ip报文外在封装多一层的ip首部,内部ip首部(原地址为cip,目标ip为vip),外层ip首部原地址为dip,.目标地址为rip

 

①客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。

②进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。

③到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。

④数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。

⑤后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。

模式特征:

dip,viprip都应该是公网地址,

rs的网关不能,也不可能指向dip

请求报文需要经过dirctor,但响应报文不能进过dr

不支持端口映射

rs的os得支持隧道功能

调度器将只能处理用户的报文请求,集群系统的吞吐量大大提高,对realserver的地域位置没有要求.

TUN 模式的优点:

•      单臂模式,LVS 负载压力小。

•      数据包修改小,信息完整性高。

•      可跨机房。

TUN 模式的缺点:

•      不支持端口映射。

•      需在 RS 后端服务器安装模块及配置 VIP。

•      隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀。

•      隧道头部的加入可能会导致分片,最终会影响服务器性能。

TUN 模式的使用场景:

如对转发性要求较高且具有跨机房需求的,可选择 TUN 模式。

DR模式

直接路由:Direct Routing,简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。

 

DR 实现原理过程如下:

①当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器。

这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。

②数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。

③数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。

如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。

④数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。

⑤数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。

此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。

模式特征

确保前端路由器将目标ip为vip的请求报文发往director;

在前端网关做静态绑定.在rs上使用arptables/( arptables,linux命令,用于过滤arp包。

基本思路和iptables一样,不过,arptables处理arp协议有关的包,这些包在iptables中并不会处理·arptables可用于灵活的arp管理,如果善于运用的话,不失为一个优秀的arp防火墙.既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击)

在rs上修改内核参数以限制arp通告及应答级别修改rs上内核参数,将rs上的vip配置在lo接口上的别名上,并限制其不能响应对vip地址解析请求.

RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,

以确保响应报文不会经由Director;

(3) RS跟Director要在同一个物理网络;

(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;

(5) 不支持端口映射;

缺陷:

rs和ds必须同一机房中,因为它是由二层协议进行转发的,根据mac地址来进行匹配寻址

DR 模式的优点:

•      响应数据不经过 LVS,性能高。

•      对数据包修改小,信息完整性好。

DR 模式的缺点:

•      LVS 与 RS 必须在同一个物理网络。

•      RS 上必须配置 lo 和其他内核参数。

•      不支持端口映射。

DR 模式的使用场景:

对性能要求高的,可首选 DR 模式,还可透传客户端源 IP 地址。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐