主流负载均衡器LVS、Nginx、HAProxy介绍

一.简单介绍

1.1 LVS

LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器,LVS由用户空间的ipvsadm和内核空间的ipvs组成,ipvsadm用来定义规则,ipvs利用ipvsadm定义的规则工作。

1.2 Nginx

Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

1.3 HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡以及基于TCP和HTTP的应用程序代理。

二.工作原理介绍

2.1 LVS

2.1.1 LVS特点

通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器集群。它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。LVS主要特点有以下几个方面:
优势:

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

缺点:工作在四层,不支持七层规则修改,机制过于庞大,不适合小规模应用。

2.1.2 LVS常见的术语

| 名称 | 解释 |
| ---- | ---- | ---- |
| ipvsadm | 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等 |
| IPVS | 工作在内核上的netfilter INPUT HOOK之上的程序,可根据用户定义的集群实现请求转发 |
| VS | Virtual Server、虚拟服务|
| Director,Balancer| 负载均衡器,分发器 |
| RS | Real Server 后端请求处理服务器 |
| CIP | Client IP,客户端IP |
| VIP | Director Virtual IP,负载均衡器虚拟IP |
| DIP | Director IP,负载均衡器IP |
| RIP | Real Server IP,后端请求处理服务器IP|

2.1.3 LVS的工作模式

LVS常用的工作模式有:DR(直接路由)模式、TUN模式、以及NAT模式

2.1.4 工作原理

【此部分参考:https://blog.csdn.net/gui951753/article/details/80316565】

LVS工作原理:

  • 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
  • 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
  • LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
  • 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
  • 最后经由POSTROUTING链发往后端服务器。

2.2 Nginx

2.2.1 Nginx特点

优势:

  • 工作在7层网络之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构、它的正则规则比HAProxy更加强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远远多余LVS了,location使用灵活、应用场合广泛,工作在应用层。
  • Nginx对网络稳定性的依赖比较小,理论上能ping通就可以进行负载均衡,这个也是它的优势。相反LVS对网络依赖性比较大。
  • Nginx安装配置简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
  • Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
  • Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
  • Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
  • Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
  • Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。

缺点:
1.Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
2.对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决

2.2.2 Nginx工作原理

Nginx由内核和模块组成。Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。
handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。具体的Nginx处理流程:
1.客户端发送HTTP请求
2.Nginx基于配置文件中的位置选择一个合适的处理模块
3.负载均衡模块选择一台后端服务器 (如果有)
4.处理模块进行处理并把输出缓冲放到第一个过滤模块上
5.第一个过滤模块处理后输出给第二个过滤模块
6.然后第二个过滤模块又到第三个
7.依此类推,最后把响应发给客户端。

2.2.3 Nginx负载均衡策略

Nginx目前支持自带3种负载均衡策略:

  • 轮询(rr):按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。
  • 权重(weight):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream westos{
     server 192.168.1.1:80  weight=9;
     server 192.168.1.2:80  weight=1;
}
  • ip哈希(ip_hash):上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
# ip_hash: 来自同一个IP的请求会分发到相同的后端服务器
upstream westos{
     ip_hash;
     server 192.168.1.1:80;
     server 192.168.1.2:80;
}
  • fair:这是第三方的策略,按照后端服务器响应时间来分配请求,响应时间短的优先分配。
upstream backend{
	 fair;
     server 192.168.1.1:80;
     server 192.168.1.2:80;
}
  • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend{
     hash $request_uri; 
     hash_method crc32; 
     server 192.168.1.1:80;
     server 192.168.1.2:80;
}

2.3 HAProxy

2.3.1 HAProxy的特点

优点:

  • 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
  • 支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。能够补充Nginx的一些缺点。
  • HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
  • HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
  • HAProxy负载均衡策略非常多,比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)
  • 免费开源,稳定性也是非常好,可以与LVS相媲美;
  • 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警;

2.3.2 原理

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作

2.3.2 HAProxy负载均衡算法

  • roundrobin:简单的轮询
  • static-rr:权重轮询
  • leastconn:最少连接者优先
  • source:根据请求源IP,这个跟Nginx的ip_hash机制类似
  • ri:根据请求的URI
  • rl_param:表示根据请求的URI参数‘balance url_param’requires an URL parameter name;
  • hdr(name):根据HTTP请求头来锁定每一次HTTP请求
  • rdp-cookie(name):根据cookie来锁定并哈希每一次TCP请求
posted @ 2020-05-20 11:54  yuhaohao  阅读(383)  评论(0编辑  收藏  举报