HAProxy使用方法以及和LVS区别

HAProxy简介

HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计

LVS 与 HAProxy 的核心区别及优劣势

工作层级与本质

LVS(Linux Virtual Server):是 Linux 内核级别的负载均衡器,仅工作在四层(传输层,如 TCP/UDP),基于 IP 和端口进行流量转发,不解析应用层协议(如 HTTP)。

HAProxy:是用户态的软件负载均衡器,支持四层(传输层)和七层(应用层,如 HTTP/HTTPS),可解析应用层协议内容(如 HTTP 头部、URL),实现更精细的转发。

性能与适用场景

LVS 优势
作为内核级工具,转发效率极高(几乎接近硬件负载均衡器),能承载百万级并发连接,适合超大规模流量场景(如电商秒杀、大型分布式服务入口)。
缺点:功能简单,不支持七层逻辑,配置和维护成本高(需结合其他工具完善功能)。

HAProxy 优势
功能丰富,支持七层精细化转发,健康检查能力强,配置灵活,适合中高流量且需要应用层逻辑的场景(如 Web 服务、API 网关)。
缺点:用户态软件,转发效率略低于 LVS(承载几十万并发无压力,超大规模场景可能成为瓶颈)。

总结:LVS转发效率更高但是没有后端检查需要其它工具完善功能,HAProxy转发效率略低于LVS但有后端检测,配置简单。

HAProxy 的四层与七层负载详解

 四层负载(TCP 模式)

工作原理:基于传输层协议(TCP/UDP)转发,仅关注 “源 IP: 端口” 和 “目标 IP: 端口”,不解析数据包内容(如 HTTP 请求的 URL、头部)。

转发逻辑:类似 LVS,通过预设的 IP + 端口规则将流量转发到后端服务器(如将访问10.0.0.1:80的流量转发到后端192.168.1.10:8080192.168.1.11:8080)。

适用场景:对性能要求高、无需应用层逻辑的服务,如数据库(MySQL)、SSH、邮件服务(SMTP)等。

 七层负载(HTTP/HTTPS 模式)

工作原理:基于应用层协议(HTTP/HTTPS)转发,会解析数据包的应用层内容(如 HTTP 的 Host、URI、Cookie、请求方法等),实现更智能的路由。

转发逻辑:可根据应用层信息定制规则,例如:将访问/static的静态资源请求转发到 CDN 或静态服务器;将访问/api的动态请求转发到应用服务器;根据 HTTP 头部的Host字段区分不同域名(如a.example.com转发到集群 A,b.example.com转发到集群 B)。

额外能力:支持 SSL 卸载(前端解密 HTTPS,后端用 HTTP 通信,减轻后端服务器压力)、会话保持(通过 Cookie 或 IP 绑定固定用户到某台服务器)、请求改写(Rewrite URL 或头部)等。

适用场景:Web 服务、API 网关等需要应用层逻辑的场景,如电商网站的动静分离、多域名路由等。

HAProxy的使用方法

HAProxy 的配置文件

haproxy.cfg由两大部分组成,分别是:

global:全局配置段 进程及安全配置相关的参数 性能调整相关参数 Debug参数

proxies:代理配置段 defaults:为frontend, backend, listen提供默认配置

frontend:前端,相当于nginx中的server {}

backend:后端,相当于nginx中的upstream {}

listen:同时拥有前端和后端配置,配置简单,生产推荐使用

使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用 listen

我们每次修改完配置文件之后要重启服务,影响比较大。我们可以借用一个工具来实现动态更新

socat 工具

对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等

范例:利用工具socat 对服务器动态权重调整

#修改配置文件

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg stats socket /var/lib/haproxy/stats mode 600 level admin

 #查看haproxy状态

[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats

#查看集群状态

[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats

#查看集群权重

[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stat

#设置权重

[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats

#下线后端服务器

[root@haproxy ~]# echo "disable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats

#上线后端服务器

[root@haproxy ~]# echo "enable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats

针对多进程处理方法

如果开启多进程那么我们在对进程的sock文件进行操作时其对进程的操作时随机的

如果需要指定操作进程那么需要用多soct文件方式来完成

这样每个进程就会有单独的sock文件来进行单独管理

haproxy的算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法

balance参数可以配置在listen或backend选项中

HAProxy的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

static-rr:基于权重的轮询调度

不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值) 不支持端服务器慢启动 其后端主机数量没有限制,相当于LVS中的 wrr

慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没 问题后在给一部分

first:

根据服务器在列表中的位置,自上而下进行调度 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务 其会忽略服务器的权重设置 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

动态算法

基于后端服务器状态进行调度适当调整, 新请求将优先调度至当前负载较低的服务器 权重可以在haproxy运行时动态调整无需重启

roundrobin:

1. 基于权重的轮询动态调度算法, 2. 支持权重的运行时调整,不同于lvs中的rr轮训模式, 3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数), 4. 其每个后端backend中最多支持4095个real server, 5. 支持对real server权重动态调整, 6. roundrobin为默认调度算法,此算法使用广泛

动态调整权重

[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio /var/lib/haproxy/haproxy.sock

leastconn:

leastconn加权的最少连接的动态 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接) 比较适合长连接的场景使用,比如:MySQL等场景。

各算法使用场景

first static-rr roundrobin leastconn source #使用较少 #做了session共享的web集群 #数据库 #基于客户端公网IP的会话保持 Uri--------------->http url_param--------->http hdr 五.高级功能及配置 介绍HAProxy高级配置及实用案例 #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯 #可以实现session保持 #基于客户端请求报文头部做下一步处理

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

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

相关文章

超越“小作文”:大模型指令设计的进阶之路——优化知识信噪比

文章摘要:你是否认为,给大模型的指令(Prompt)写得越详细越好?真的是信息越多,模型就越懂你吗?本文将深入探讨一个反直覺的觀點:初級的指令設計專注於資訊的堆砌,而高階的…

elasticsearch-集成prometheus监控(k8s)

一. 简介: 关于elasticsearch的简介和部署,可以参考单独的文章elasticsearch基础概念与集群部署-CSDN博客,这里就不细说了。这里只讲讲如何在k8s中部署export并基于prometheus做es的指标采集。 二. 实现方式: 首先我们需要先部署…

贪心算法(Greedy Algorithm)详解

一、什么是贪心算法? 贪心算法是一种算法设计范式,指在解决问题时,依赖于每次选择最优的局部解,以期最终得到全局最优解。贪心算法的关键特点是: 局部最优选择:每个阶段选择当前看起来最好的选择&#xff0…

电梯的构造|保养|维修视频全集_电梯安全与故障救援(课程下载)

课程下载:https://download.csdn.net/download/m0_66047725/91699586 电梯原理与维修视频教程 相关简介: 电梯现在运用的非常广泛,比如大型商场,建筑工地,特别是现在建造的很多高楼、商品房,基本都是安装了电梯。电梯维保不力是导致电梯运行中安全事故频发的主要原…

Traefik网关DNS解析超时问题优化

1、背景 在生产环境使用 Traefik 网关时出现了偶发的 DNS 解析超时导致网关与后端服务建立连接异常的情况。通过调用链埋点数据观察发现,该部署环境中 Traefik 的 DNS 解析性能较差,耗时通常在 4ms 以上(正常应该是 1ms 以内) 初…

从0到1掌握 Spring Security(第三篇):三种认证方式,按配置一键切换

> 本文是Spring Security系列第三篇,将带你实现内存、JDBC和自定义三种认证方式的无缝切换,只需修改配置文件即可完成认证策略变更! ## 一、为什么需要多种认证方式? 在软件开发的不同阶段,我们需要不同的认证策略: - **开发阶段**:使用内存认证,快速配置测试账号…

阿里云国际站云防火墙:如何利用阿里云云防火墙实现细粒度的访问控制?

利用阿里云云防火墙实现细粒度的访问控制,可以从分层策略、精确匹配、动态调整三个方面着手,让不同业务、用户和资源的访问权限清晰可控。一、明确控制目标业务隔离:不同业务系统、部门或环境(生产/测试)之间互不干扰。…

rom定制系列------小米cc9机型 原生安卓15系统 双版线刷root 定制修改功能项

小米 9 Lite/CC9 机型代码;pyxis.搭载骁龙710处理器.适用于以下型号的小米机型:M1904F3BG, M1904F3BC. 刷写前提; 需要当前机型已经解锁bl的状态下进入fast模式刷写。此机型可以正常官方解锁与强解bl锁。效果都是一样的。在fast模式下装好联机驱动。使用官方平台刷…

解读60页全面认识大数据基础知识培训【附全文阅读】

该培训课件适用于对大数据知识感兴趣的初学者、企业管理人员、相关技术从业者等。内容围绕大数据展开,先介绍其基本概念,包括定义、数据级别、来源、类型、价值挖掘等,还阐述了 5 个 “V” 特征及与传统数据的区别。接着讲述大数据的发展演进,涵盖国际国内发展历程、发展阶…

Prompt engineering(PE) —— prompt 优化如何进行?

从新手到高手:Prompt最佳实践全解析 一、引言:开启 Prompt 的神秘大门在这个人工智能飞速发展的时代,AI 已经悄然融入我们生活的方方面面。你是否有过这样的经历: 当你对着智能音箱询问 “明天天气如何” 时,它能迅速给…

云服务器的优缺点都有哪些?

云服务器作为一种有着高度灵活性的服务器类型,能够根据用户的需求来调整资源,有着很强的优势,但是云服务器还是有着一定的缺点的,本文就来共同探讨一下云服务器的优缺点都有哪些吧!首先,云服务器能根据业务…

宋红康 JVM 笔记 Day05|运行时数据区内部结构、JVM中的线程说明、程序计数器

一、今日视频区间 P39-P43 二、一句话总结 运行时数据区内部结构;JVM中的线程说明;程序计数器(PC寄存器); 三、关键图/命令 3.1 运行时数据区内部结构3.2 JVM中的线程说明3.3 程序计数器(PC寄存器&#xff…

Java增强for循环(小白友好版)

前言&#xff1a;为什么需要增强for循环&#xff1f;作为Java初学者&#xff0c;你或许已经学会使用传统for循环来遍历数组或集合&#xff1a;for (int i 0; i < array.length; i) {System.out.println(array[i]); }这种写法需要手动维护索引变量i&#xff0c;对于集合还需…

【OLAP】trino安装和基本使用

目录 ​一、概述 1.1Trino不是什么 1.2Trino是什么 二、Trino特点 三、Trino架构 3.1架构和服务节点 3.2Trino数据模型 四、Trino安装部署 4.1配置JDK 4.2单机版&#xff08;Coordinator和Worker同进程&#xff09; 4.2.1启动服务 4.2.2下载客户端 五、配置HTTPS&…

如何写出更清晰易读的布尔逻辑判断?

列编码技巧和规范&#xff0c;来降低逻辑的“认知负荷”。成功的实践&#xff0c;必须系统性地涵盖五大关键策略&#xff1a;采用有意义的变量名进行封装、将复杂的判断拆解为独立的函数、优先使用“肯定式”而非“否定式”逻辑、利用括号明确运算的优先级、以及运用德摩根定律…

新手向:Java方向讲解

从诺基亚塞班到阿里双11&#xff0c;从安卓应用到华尔街交易&#xff0c;Java用一行System.out.println()征服了数字世界1998年&#xff0c;诺基亚在塞班系统上首次采用Java ME技术&#xff0c;让手机具备了运行应用程序的能力&#xff0c;开启了移动互联网的序幕。当时的Java开…

视觉图像界面设计【QT-creator高级编程 - 01】图像显如何保证跟随主窗口变化,且保留必要的设定窗口

前言&#xff1a;问题&#xff0c;显示图像的时候&#xff0c;按最大窗口&#xff0c;图片窗口不跟着变大&#xff0c;还有&#xff0c;右边那些设置控件都没有动解决&#xff1a;步骤1&#xff1a;1️⃣ 让 graphicsView 自动占满在 Qt Creator 中选中 graphicsView_7 / 12 / …

pair之于vector、queue(vector<pair<int,int>>)

1、vector&#xff1c;pair&#xff1c;int,int&#xff1e;&#xff1e; 和 Map 的异同点map&#xff1a;会对插入的元素按键Key&#xff0c;自动排序&#xff0c;而且键Key不允许重复&#xff1b;vector&#xff1a;的这种用法不会自动排序&#xff0c;而且允许重复。2、queu…

从合规到卓越:全星QMS如何成为制造企业的质量战略引擎

从合规到卓越&#xff1a;全星质量管理QMS软件系统如何成为制造企业的质量战略引擎 全星质量管理QMS软件系统凭借其高度定制化、智能化、全流程覆盖等核心优势&#xff0c;已在汽车制造、电子、医疗、航空航天等多个高端制造领域实现领先性应用&#xff0c;显著提升了企业的质…

按键及消抖

方法一&#xff1a;延时阻塞key.c:#include "key.h" #include "delay.h"//初始化GPIO void key_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟//调用GPIO初始化函数…