haproxy简介与用法
一、负载均衡
1.1、概念:
负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。至于为什么使用它,可参照我之前的博客lvs用法简介中。
1.2、算法:
加权轮询(WRR)算法:为每台分配一个权重,权重表示相对于其他服务器,自身能处理连接的能力。权重为n表示SLB为下一服务器分配流量之前,要为这台服务器分配n条新连接。
加权最小连接(WLC)算法:SLB会将新连接分配给活动连接数最少的真实服务器。为每台真实服务器分配权重m,服务器处理活动连接的能力等于m除以所有服务器权重之和。SLB会将新连接分配给活动连接数远少于其能力范围的真实服务器。
使用加权最小连接(WLC)算法时,SLB使用一种慢启动的方式来控制对新加真实服务器的访问。“慢启动”限制了新连接的建立频率并允许逐渐增加,以此来防范服务器的的过载。
二、haproxy用法
2.1、环境搭建
新建三个虚拟机
Webserver1和2以及haproxy基于rhel9
Hadproxy设置为172.25.254.100,server分别为10和20
分别echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
2.2、全局参数
两个主机中
在主机haproxy中下载yum install haproxy -y
接着在vim /etc/haproxy/haproxy.cfg

接着vim ~/.vimrc
Set ts=4 ai sw=4
先写前两行,然后#掉
然后重启systemctl restart nginx.service
这里使用的是xshell所以直接创建新的本地链接。

接着vim /etc/haproxy/haproxy.cfg中将global后面的#注释全部删掉

log是日志,chroot是运行目录,maxconn指的是最大连接数,user是运行用户,group指的是运行组。nbproc 设置进程数,cpu更改使用核心。
然后再次重启haproxy
pstree -p | grep haproxy可以查看进程

接着vim /etc/haproxy/haproxy.cfg

运行后注释掉上述变量
Cat /proc/33101/status | grep -i thread
接着Vim /etc/rsyslog.conf
2.3、更改日志
在 vim /etc/haproxy/haproxy.cfg中查看日志名

接着 vim /etc/rsyslog.conf


相当于把udp打开
使用如下命令查看

2.4、proxies
global参数

proxies参数
| 参数 | 类型 | 作用 |
| default[] | proxies | 默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name |
| frontend | proxies | 前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集 群。 |
| backend | proxies | 后端服务器组,等于nginx的upstream和LVS中的RS服务器 |
| listen | proxies | 将frontend和backend合并在一起配置,相对于frontend和backend 配置更简洁,生产常用 |
紧接着vim /etc/httpd/conf/httpd.conf
添加Listen 8080

接着vim /etc/haproxy/haproxy.cfg

2.5、socat
同样是vim /etc/httpd/conf/httpd.conf
配置
listen webclusterbind *:80 mode http balance roundrobinserver web1 172.25.254.10:80server web2 172.25.254.20:80
vim /etc/haproxy/haproxy.cfg 添加如图所示haproxy如何热处理

三、haproxy的哈希圆算法
3.1、概念
HAProxy通过固定参数 balance 指明对后端服务器的调度算法
balance参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换。
3.2、静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
3.2.1、static-rr:基于权重的轮询调度
- 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
- 不支持端服务器慢启动
- 其后端主机数量没有限制,相当于LVS中的 wr
3.2.2、first
-
根据服务器在列表中的位置,自上而下进行调度
-
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
-
其会忽略服务器的权重设置
-
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
4、动态算法
基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启
有两种:roundrobin leastconn
4.1.1 roundrobin动态算法
基于权重的轮询动态调度算法,
支持权重的运行时调整,不同于lvs中的rr轮训模式,
HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
其每个后端backend中最多支持4095个real server,
支持对real server权重动态调整,
roundrobin为默认调度算法,此算法使用广泛
4.1.2、一致性哈希(哈希圆)
1、后端服务器哈希环点keyA=hash(后端服务器虚拟ip)%(2^32)
2、客户机哈希环点key1=hash(client_ip)%(2^32) 得到的值在[0---4294967295]之间,
3、将keyA和key1都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器


四、基于cookie会话保持
4.1概念、意义
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。
vim etc/haproxy/haproxy.cfg配置

配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [
preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]name:
insert:
#cookie 的 key名称,用于实现持久连接
#插入新的cookie,默认不插入cookieindirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache:
#当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,
#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

五、haproxy的状态页面监控
通过web界面,显示当前HAProxy的运行状态
stats enable
stats hide-version
stats refresh <delay>
stats uri <prefix>
#基于默认的参数启用stats page#将状态页中haproxy版本隐藏
#设定自动刷新时间间隔,默认不自动刷新
#自定义stats page uri,默认值:/haproxy?stats
stats auth <user>:<passwd> #认证时的账号和密码,可定义多个用户,每行指定一个用户
#默认:no authenticationstats admin { if | unless } <cond> #启用stats page中的管理功能

使用curl -A “handsomeyang” 172.25.254.100/index.html 测试

六、ACL
6.1概念
访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃


6.2ACL配置选项
#用acl来定义或声明一个aclacl
acl
名称
<aclname> <criterion> [flags]
[operator]
匹配规范
匹配模式
[<value>]
具体操作符 操作对象类型
最后测试
[root@haproxy ~]# curl www.handsomeyang.org
webserver1 - 172.25.254.10
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20相关文章:
haproxy简介与用法
一、负载均衡 1.1、概念: 负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统…...
Geoscene Pro的三维
一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中,两个场景可以自由切换。 (1)全局场景有固定的坐标系GCS(WGS84、CGCS2000),并在全球比例尺下展示(全球范围)。可以…...
论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023
1. 论文背景 密集子图发现(Densest Subgraph Discovery)是图挖掘领域的一个基础研究方向,并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域,密集子图的发现对理解复杂网络结构和行为具有重要…...
前端框架(三件套)
学习网站 HTML 系列教程(有广告) HTML(超文本标记语言) | MDN (mozilla.org)(英文不太友好) 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...
MemoryCache 缓存 实用
MemoryCache 缓存 实用,相关逻辑代码里已详细注释, 在Java中创建一个单例模式(Singleton Pattern)的MyMemoryCache类,可以采用多种方法,其中最常见的是使用“饿汉式”和“懒汉式”(线程安全和非线程安全&am…...
Java设计模式(命令模式)
定义 将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 角色 抽象命令类(Command):声明用于执行请求的execute方法,通…...
什么是 CI/CD?
什么是 CI/CD? CI/CD(Continuous Integration/Continuous Deployment)是一种软件开发实践,旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量,使团队能够更快地响应市场变化和…...
【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发
使用要求 1、用的是google里面的扩展打包成crx文件,所以在使用之前你需要确保自己电脑上有google浏览器,而且google浏览器版本需要在124之上。(要注意一下,就是电脑只能有一个Chrome浏览器) 2、在win10上用vscode开发…...
【苍穹外卖JAVA项目】第2天:新增员工
在EmployeeMapper.java中插入数据:一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息,用post请求方式,可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象(DTO):封装前端提交过…...
队列的实现及循环队列
一、队列的概念及结构 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO(Fist In First Out)。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的一端称为…...
docker部署zookeeper和kafka
docker部署zookeeper和kafka zookeeperkafkakafka-eagle zookeeper firewall-cmd --zonepublic --add-port2181/tcp --permanent firewall-cmd --reload docker pull zookeeper:3.4.14 docker run -d --name zk -p 2181:2181 zookeeper:3.4.14mkdir -p /root/zookeeper/data m…...
(13)zabbix的监控-1
前言:在上一次的基础上,完成实验。 1、添加一个空模板,方便 2、添加空模板到主机192.168.121.50 client-one里面模板是空的 4、在主机添加监控项和图形 5、自定义监控项,在客户端定义 [rootclient1 ~]# vim /etc/zabbix/zabbix_…...
Redis相关面试题(二)
一、Bit中不同命令使用的场景 二、什么是缓存击穿,缓存穿透,缓存雪崩? 缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况 缓存穿透…...
Docker Compose与私有仓库
Docker Compose与私有仓库 docker-compose -v 查看版本信息 Docker Compose的应用 创建APACHE容器 vim docker-compose.yaml yaml文件缩进严格;冒号后有内容需要加空格,冒号后无内容一般不加空格 冒号后的内容中若包含路径‘/’或‘:’时…...
AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
AI学习记录已经发了十几篇,大佬们可以看看,如果有帮助动动小手点赞 token入门版,有空会更新具体代码操作 GPT4当中,我们提问问题是按照token进行扣费的,那到底什么是token? 在不同的语言模型当中&#x…...
Java线程池和执行流程
在 Java 中,常见的四种线程池包括: 1. newFixedThreadPool(固定大小线程池) 应用场景:适用于需要限制线程数量,并且任务执行时间比较均匀的场景,例如服务器端的连接处理。优点:线程数…...
进程信号的产生与处理
目录 前言 一.信号的概念 二.信号的产生 1.键盘产生 2.系统调用 3.软件条件 4.异常 三.信号的保存 四.信号的处理 信号处理的方式 设定屏蔽信号 自定义处理信号 信号处理的时机 前言 进程信号(Process Signals)是操作系统与运行进程之间进行通…...
统一响应结果封装,Result类的实现【后端 06】
统一响应结果封装,Result类的实现 在开发Web应用或API接口时,如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装(Unified Response Encapsulation)作为一种广泛采用的实践,不仅提高了API的…...
明日周刊-第20期
本周异形新电影上映,开始期待起来了,毕竟这是一个经久不衰的ip。还有就是马上来临的黑神话悟空,属于我们自己的3A大作,接下去的每一天都是新的期待。 文章目录 科技短讯资源分享随便说说一点心情 科技短讯 科技创新与突破 人工智…...
深入剖析 Spring 常用注解:功能与差异的全景洞察
《深入剖析 Spring 常用注解:功能与差异的全景洞察》 在当今的 Java 开发领域,Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中,注解的运用极大地简化了开发流程,提高了代码的可读性和可维护性。本文将深入探讨 Spring 中…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
