当前位置: 首页 > news >正文

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参数

proxies参数设置
参数类型作用
default[]proxies默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name
frontendproxies前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集 群。
backendproxies后端服务器组,等于nginx的upstream和LVS中的RS服务器
listenproxies将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
http://www.lryc.cn/news/421397.html

相关文章:

  • Geoscene Pro的三维
  • 论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023
  • 前端框架(三件套)
  • MemoryCache 缓存 实用
  • Java设计模式(命令模式)
  • 什么是 CI/CD?
  • 【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发
  • 【苍穹外卖JAVA项目】第2天:新增员工
  • 队列的实现及循环队列
  • docker部署zookeeper和kafka
  • (13)zabbix的监控-1
  • Redis相关面试题(二)
  • Docker Compose与私有仓库
  • AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
  • Java线程池和执行流程
  • 进程信号的产生与处理
  • 统一响应结果封装,Result类的实现【后端 06】
  • 明日周刊-第20期
  • 深入剖析 Spring 常用注解:功能与差异的全景洞察
  • 【隐私计算篇】隐私计算使用不当也会泄露原始数据
  • C++第一讲:开篇
  • OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
  • HSL模型和HSB模型,和懒人配色的Color Hunt
  • 什么是云原生?(二)
  • pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
  • LeetCode_sql_day15(262.行程与用户)
  • 【MySQL】详解数据库约束、聚合查询和联合查询
  • bug积累
  • 版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core简化多供应商协作,控制访问权限,确保数据资产安全(下)
  • Anaconda配置envs和pcks路径