Linux系统——LVS、Nginx、HAproxy区别

news/2024/5/13 8:16:32/文章来源:https://blog.csdn.net/G_D0120/article/details/136564204

目录

一、LVS

1.负载均衡机制

1.1负载均衡——NAT模式

1.2负载均衡——DR模式

1.3负载均衡——隧道模式

1.4负载均衡——总结

2.LVS调度算法

3.LVS优点

4.LVS缺点

二、Nginx

1.传统基于进程或线程的模型

2.Nginx架构设计

3.Nginx负载均衡

4.Nginx调度算法

5.Nginx优势

6.Nginx缺点

三、HAproxy

四、区别


一、LVS

LVS、Nginx、HAproxy三者是基于负载均衡处理所诞生的技术

那么什么是负载均衡?

大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应。

根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回。

LVS是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器,已经是 Linux 标准内核的一部分。采用IP负载均衡技术基于内容请求分发。 

调度器具有很好的吞吐率,将请求均衡得转移到不同的服务器上执行,且调度器可以自动屏蔽掉故障的服务器,从而将一组服务器构成一个高可用,高性能的服务器集群。 

1.负载均衡机制

  • LVS是四层负载均衡,也就是说在传输层上,LVS支持TCP/UDP。由于是四层负载均衡,所以相对于其他的高层负载均衡而言,对于DNS域名轮流解析应用层负载的调度客户端的调度等,它的效率是相对较高的。 
  • 四层负载均衡,主要通过报文的目标地址和端口。(七层负载均衡又称为"内容交换",主要是通过报文中真正有意义的应用层内容) 
  • LVS的转发主要通过修改IP地址(NAT模式,包括SNAT和DNAT),修改目标MAC(DR模式)来实现。 

1.1负载均衡——NAT模式

NAT(Network Address Translation)是一种外网和内网地址映射的技术。 

  • NAT模式下,网络数据包的进出都要经过LVS的处理。LVS需要作为RS(真实服务器的网关。 
  • 当包从Client到达LVS时,LVS做DNAT(目标地址转换),将D-IP(目的地址)改变为RS的IP。 
  • RS处理完成,将包返回的时候,S-IP(源地址)是RS,D-IP是Client的IP。 
  • 到达LVS做网关中转时,LVS会做SNAT(源地址转换),将包的S-IP改为VIP。

1.2负载均衡——DR模式

DR(直接路由)模式下需要LVS和RS绑定同一个集群(RS通过将VIP绑定在loopback实现)。 

  • 请求由LVS接受,返回的时候由RS直接返回给Client。 
  • 当包到LVS的时候,LVS将网络帧的MAC地址修改为某台RS的MAC,此包会被转发到对应的RS上面进行处理。 
  • 此时S-IP和D-IP都没有发生改变。 
  • RS收到LVS转发的包时,链路层发现MAC地址是自己的,网络层发现IP地址也是自己的,于是包被合法接受,RS不感知LVS。 
  • 当包返回时,RS直接返回给Client,不再经过LVS。

由于RS响应的数据包是直接返回给Client的,所以有效得避免了负载均衡服务器的带宽成为瓶颈。 

1.3负载均衡——隧道模式

隧道模式有点类似与VPN,使用网络分层的原理,在从客户端发来的数据包的基础上,封装一个新的IP头标记不完整,只有目的IP)发送给RS。 

RS收到后,先把DR发过来的数据包的头解开,还原数据包。处理完成后,直接返回给Client。

1.4负载均衡——总结

综上所述,DR模式具有更好的性能,也是目前大型网站比较通用的一种模式。 

2.LVS调度算法

1. 轮询调度 

2. 加权轮询调度 

3. 最小连接数调度 

4. 加权最小连接数调度 

5. 基于局部性的最少连接(LBLC) 

该算法主要用于Cache集群系统。 

该算法根据请求的D-IP找出该D-IP地址最近使用的服务器地址,如果此服务器可用,则发送给此服务器。如果不可用,则使用最小连接数算法选择一个服务器发送报文。 

6. 带复制的基于局部性的最少连接(LCLBR) 

它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。 

在LBLC算法里面,某些热门站点报文较多,可能服务器很快会达到饱和,然后切换到第二台又会很快达到饱和,然后后端服务器就一直在切换,造成资源不必要的浪费。 

LCLBR里面,单个服务器变成了一组服务器,就会有效避免这种情况。 

7. 目标地址散列 

8. 源地址散列 

3.LVS优点

  • 抗负载能力强,由于工作在传输层上,只做分发,无流量产生,所以它在所有的负载均衡里面性能是最强的,对内存和CPU的消耗也比较低。 
  • 配置性较低,减少人为出错的概率,但是也相应减少了人为自主性。 
  • 工作稳定,自身有完整的双机热备方案,如:LVS + Keepalived 
  • 无流量,保证IO不会受到影响。 

4.LVS缺点

  • 软件本身不支持正则表达式处理,不能做动静分离。 
  • 网站应用比较庞大的时候,LVS/DR+Keepalive实施较为复杂。

二、Nginx

Nginx是一个很强大的高性能Web和反向代理服务器,最大的优势在于高负载情况下对内存和CPU的低消耗;在高并发的情况下,Nginx是Apache服务器不错的替代品。 

1.传统基于进程或线程的模型

传统基于进程或线程的模型(如Apache)在处理并发时会为每一个连接建立一个单独的进程或线程。这种方法会在网络传输或者I/O操作上阻塞。 

对于应用来讲,在内存和CPU的使用上效率都是非常低的。 而且,生成一个单独的进程/线程还需要为其准备新的运行环境(主要包括分配堆栈内存),以及上下文执行环境。 

创建这些都消耗额外的CPU时间,这最终也会因为线程上下文来回切换导致性能非常差。 

2.Nginx架构设计

Nginx的架构设计是采用模块化的,基于事件驱动异步单线程且非阻塞。 

Nginx大量使用多路复用事件通知,nginx启动之后,会在系统中以 daemon(守护进程) 的方式在后台运行,包括一个master进程和多个worker进程。 

所有的进程都是单线程的,进程间通信主要通过共享内存的方式。 

多个连接,是通过worker进程中高效回环(run-loop)机制来处理的。对于每个worker进程来说,每秒钟可以处理上千个请求和连接。 

3.Nginx负载均衡

Nginx 负载均衡主要针对七层的http和https,当然,四层Nginx后来也支持了(1.9.0版本增加stream模块,用来实现四层协议)。 

Nginx主要是通过反向代理的方式进行负载均衡的,所谓反向代理(Reverse Proxy),指的是以代理服务器来接收 Client 请求,然后将请求转发到内部服务器,并将内部服务器处理完成的结果返回给 Client ,对外,代理服务器就是真正的服务器,内部服务器外部不感知。 

4.Nginx调度算法

  • 轮询·default 
  • weight (权重) 
  • ip_hash (可用于解决会话保持的问题) 
  • fair·第三方 (按后端服务器的响应时间来分配请求,响应时间短的优先分配) 
  • url_hash·第三方 (相同的url定位到相同的服务器) 

5.Nginx优势

  • 跨平台,配置简单 
  • 非阻塞,高并发(官方测试可以支撑5万并发数) 
  • 事件驱动,通信机制采用 epoll 模型,支持更大的并发连接 
  • 内存消耗小。(3万并发数下,10个Nginx进程只需要150M内存) 
  • 内置的健康检查功能。 (一台后端服务器宕机了,不会影响前端访问) 
  • 节省带宽。 (支持GZIP压缩,可以添加浏览器缓存的header) 
  • 稳定性高。 (反向代理,宕机的概率很小) 

6.Nginx缺点

  • 对后端服务器的健康检查,只支持通过端口检测,不支持url检测。 
  • 不支持Session的直接保持。(通过ip_hash可解决) 

三、HAproxy

Haproxy提供高可用性,负载均衡以及基于TCP和HTTP的代理。 特别适用于那些负载特大的Web站点,这些站点通常需要会话保持或七层处理。 

Haproxy支持四层和七层两种负载模式。 

Haproxy有一些Nginx不具有的优点,比如支持Session的保持Cookie的引导;同时支持通过获取指定的URL来检测后端服务器的状态。 

Haproxy和LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲,比Nginx有更好的负载均衡速度,在并发处理上也优于Nginx。 

Haproxy支持的负载均衡策略也比较多:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)。

四、区别

比较HAproxyNginxLVS
优点

支持session保持,Cookie引导。 

可通过url检测后端服务器健康状态。 

也可做MySQL、Email等负载均衡。 

支持通过指定的URL对后端服务器健康检查。

http、https、Emai协议功能较好,处理相应请求快。 

Web能力强,配置简单,支持缓存功能、适用动静分离,低内存消耗。 

支持WebSocket协议。 

支持强大的正则匹配规则 。

通过vrrp转发(仅分发)效率高,流量通过内核处理,没有流量产生。(理论)

相当稳定可靠。 

缺点一般不做Web服务器的Cache。

不支持session直接保持,但可通过ip_hash解决。 

只能通过端口对后端服务器健康检查。

不支持正则,不能做动静分离,配置略复杂,需要IP略多。 

没有后端主机健康状态检查。

支持算法

目标uri hash(uri) 

url参数 (url_params) 

请求头信息调度(hdr(name)) 

cookie (rdp-cookie)

最小响应时间 

自定义hash内容(hash key [consistent])

url hash 

最短时间和最少连接

最短期望延迟(Shortest Expected Delay) 

不排队(Never Queue) 

基于局部性的最少连接(LBLC) 

带复制的基于局部性最少链接(LCLBR)

官网www.haproxy.comnginx.orgwww.linuxvirtualserver.org
虚拟主机支持支持不支持
适用性四层,七层(常用)四层,七层(常用)四层
量级七层重量级,四层轻量级七层重量级,四层轻量级四层重量级
常用热备Keepalived+其它Keepalived+其它Keepalived+其它

HAProxy对于后端服务器会一直做健康检测(就算请求没过来的时候也会做健康检查) 

后端机器故障发生在请求还没到来的时候,haproxy会将这台故障机切掉,但如果后端机器故障发生在请求到达期间,那么前端访问会有异常。 

也就是说HAProxy会把请求转到后端的这台故障机上,并经过多次探测后才会把这台机器切掉,并把请求发给其他正常的后端机,这势必会造成一小段时间内前端访问失败。 

Nginx对于后端的服务器不会一直做健康检测

后端机器发生故障,在请求过来的时候,分发还是会正常进行分发,只是请求不到数据的时候,它会再转向好的后端机器进行请求,直到请求正常为止。 

也就是说Nginx请求转到后端一台不成功的机器的话,还会再转向另外一台服务器,这对前端访问没有什么影响。 

因此,如果有用HAProxy做为前端负载均衡的话 ,如果后端服务器要维护,在高并发的情况,肯定是会影响用户的。 

但如果是Nginx做为前端负载均衡的话,只要并发撑得住,后端切掉几台不会影响到用户。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_998991.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 测试使用基本组件结构

JMeter简介 Apache组织开发的开源免费压测工具纯Java程序,跨平台性强源程序可以从网上下载高扩展性可对服务器、网络或对象模拟巨大的负载,进行压力测试可以用于接口测试支持分布式、多节点部署 JMeter安装 下载位置 官网https://jmeter.apache.org/ …

Java中SpringBoot四大核心组件是什么

一、Spring Boot Starter 1.1 Starter的应用示例 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.mybatis.sprin…

深度学习与人类的智能交互:迈向自然与高效的人机新纪元

引言 随着科技的飞速发展&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正日益展现出其在模拟人类认知和感知过程中的强大能力。本文旨在探讨深度学习如何日益逼近人类智能的边界&#xff0c;并通过模拟人类的感知系统&#xff0c;使机器能更深入地理解和解…

高级语言讲义2016计专(仅高级语言部分)

1.斐波那契序列的第n项可以表示成以下形式&#xff0c;编写一个非递归函数&#xff0c;返回该数列的第n项的数值 #include <stdio.h>int func(int n) {if(n1||n2)return 1;int p1,q1,num;for(int i3; i<n; i) {numpq;qp;pnum;}return num; } 2.在MXN的二维数组A中&am…

瑞_23种设计模式_模板方法模式

文章目录 1 模板方法模式&#xff08;Template Pattern&#xff09; ★ 钩子函数1.1 介绍1.2 概述1.3 模板方法模式的结构1.4 模板方法模式的优缺点1.5 模板方法模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;InputStre…

【测试工具系列】压测用Jmeter还是LoadRunner?还是其他?

说起JMeter&#xff0c;估计很多测试人员都耳熟能详。它小巧、开源&#xff0c;还能支持多种协议的接口和性能测试&#xff0c;所以在测试圈儿里很受欢迎&#xff0c;也是测试人员常用的工具&#xff0c;但是在企业级性能场景下可能会有性能瓶颈&#xff0c;更适合测试自己使用…

Grafana二次开发环境搭建

1 Grafana环境搭建 1.1 搭建后端服务 下载windows安装版文件grafana.com 1&#xff09;选择版本号&#xff1a;此处我选的8.3.3版本 2&#xff09;安装完成后&#xff0c;请记住安装目录 &#xff0c;我的是在 D:\software\Gragana833 安装完成后会自动运行, 3&#xff09;此…

2024年软考重大改革

中国计算机技术职业资格网 考试日期 考试级别 考试资格名称 5月25日至28日 高级 系统分析师 系统架构设计师 信息系统项目管理师 中级 软件设计师 网络工程师 软件评测师 电子商务设计师 嵌入式系统设计师 数据库系统工程师 信息系统管理工程师 初级 程序员 …

MySQL之体系结构和基础管理

前言 本文以linux系统的MySQL为例详细介绍MySQL的体系结构&#xff0c;因为在实际生产环境中MySQL的运行环境都是linux系统。同时介绍MySQL的基础管理&#xff0c;包括用户管理和权限管理等。 MySQL体系结构 MySQL客户端/服务器工作模型 MySQL是C/S架构&#xff0c;工作模型…

物联网,智慧城市的数字化转型引擎

随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动智慧城市建设的关键力量。物联网技术通过连接各种设备和系统&#xff0c;实现数据的实时采集、传输和处理&#xff0c;为城市的智能化管理提供了强大的支持。在数字化转型的浪潮中&#xff0c;物联网…

VUE_nuxt启动只能通过localhost访问,ip访问不到:问题解决

修改项目根目录下的 package.json "config": {"nuxt": {"host": "0.0.0.0","port": "3000"} } 这样项目启动后就可以通过ip进行访问了

AutoDev 自定义 Agent:快速接入内部 AI Agent,构建 IDE 即 AI 辅助研发中心

在开源 AI IDE 插件 AutoDev 的 #51 issue 中&#xff0c;我们设计了 AutoDev 的 AI Agent 能力&#xff0c;半年后我们终于交付了这个功能。 在 AutoDev 1.7.0 中&#xff0c;你将可以接入内部的 AI Agent&#xff0c;并将其无缝与现有的 AI 辅助能力结合在一起。 本文将使用 …

使用awk和正则表达式过滤文本或字符串 - 详细指南和示例

当我们在 Linux 中运行某些命令来读取或编辑字符串或文件中的文本时&#xff0c;我们经常尝试将输出过滤到感兴趣的特定部分。这就是使用正则表达式派上用场的地方。 什么是正则表达式&#xff1f; 正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式最重要的事情之…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

Python编程实验六:面向对象应用

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握类的定义与对象的创建、类的继承与方法的覆盖&#xff1b; &#xff08;2…

接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天&#xff01;&#xff01; ———————————————————————————— 学习笔记 接收端 recvfrom #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, si…

一文学会搭建 cli 脚手架工具

文章目录 设置工具命令package.json bin 字段注释&#xff1a;#!/usr/bin/env node设置环境变量 接收命令选项参数process 实现commander 命令行交互&#xff1a;inquirer下载项目模板&#xff1a;download-git-repo执行额外命令&#xff1a;自动安装依赖child_processexeca 体…

Mybatis-Plus——05,乐观锁(新注解)

乐观锁&#xff08;新注解&#xff09; 一、数据库添加一个字段二、实体类添加version注解三、注册乐观锁插件四、测试一下4.1成功的乐观锁4.2失败的乐观锁————————创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 乐观锁实现方…

Flask python开发篇: 写一个简单的接口

第一步&#xff1a;新建flask项目 参考使用pycharm新建一个项目 打开pycharm&#xff0c;根据下面图中箭头顺序&#xff0c;新建一个flask的项目&#xff1b; 第二步&#xff1a;运行项目&#xff0c; 安装成功以后&#xff0c;会有个app.py文件&#xff0c;打开以后&#…

Kali Linux 2024.1

Kali Linux 2024.1刚刚发布&#xff0c;标志着这个备受欢迎的安全重点Linux发行版在今年的首次重大更新。以其先进的渗透测试和安全审计功能而闻名&#xff0c;它是安全专业人员和爱好者的首选工具。 Kali 2024.1 亮点 本次发布由 Linux 内核 6.6 提供支持&#xff0c;突出了…