Haproxy-2.X版本学习笔记记录

简介: Haproxy-2.X版本学习笔记记录

1.Haproxy简单介绍

什么是Haprxoy

Haproxy虽然叫ha,但是不提供HA高可用功能,而是提供proxy代理功能,支持代理TCP、HTTP等协议。

Haproxy提供对后端进行状态检测功能,一但后端节点出现故障,会重新分发请求,这也是称为haproxy的原因。

Haproxy应用场景

  • 支持HTTP反向代理
  • 支持动态程序的反向代理
  • 支持基于数据库的反向代理

Haproxy性能指标

  • 会话率:会话建立的速率,能在1s内建立多少链接
  • 会话并发能力:整体服务器的会话并发能力,能支持多少并发
  • 数据率:在所有会话基础上,数据传输速率或数据传输效率

正如在基于AWS ARM的Gravion2上的测试运行所示,HAProxy在线程上扩展得很好,并且能够通过SSL达到200万个请求/秒,对于转发流量,可以达到100 Gbps。

这是在说haproxy的性能贼好!

2.Haproxy安装

yum安装

  • 如果你为了方便,且并发很小的话,你用yum安装也无妨,版本在1.5.18,且许多新功能是没有的。
# 安装
yum -y install haproxy
# 删除的话可以用这个
yum -y erase haproxy

第三方仓库安装

wget https://repo.ius.io/ius-release-el7.rpm
rpm -Uvh --nodeps ius-release-el7.rpm
yum -y install haproxy22
# 装出来是一个2.2.18版本,不是最新但比较新
haproxy -v
HA-Proxy version 2.2.18-c6e1dfa 2021/11/05 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.18.html
Running on: Linux 4.19.12-1.el7.elrepo.x86_64 #1 SMP Fri Dec 21 11:06:36 EST 2018 x86_64

源码安装

  • 如果你想使用最新的稳定版,可以尝试编译安装,太麻烦我不装了,看别人的去就行。

3.配置文件

  • 配置文件默认路径/etc/haproxy/haproxy.cfg
  • 配置文件分为global全局段和代理段
  • 代理段包括前端匹配(frontend)、后端集群(backend)以及两者结合(listen)

3.1.global全局段常见配置

daemon:以守护进程运行(后台运行),没有的话会挂载前台
chroot  /var/lib/haproxy :锁定运行目录,比较安全
user  haproxy :用户
group  haproxy :用户组
maxconn  4000 :每个haproxy进程所接受最大并发连接数,注意是每个进程
cpu-map 1 0 :cpu亲和,第一个参数进程编号,第二个cpu序号,配合nbproc使用
nbproc  <n> :指定启动进程数,默认一个
nbthread  <n> :指定线程数,默认一个,不能与nbproc同时使用
log  127.0.0.1 local2 :日志记录,通过本地rsyslog的local2设备记录
stats socket /var/lib/haproxy/stats :基于socket通信,可实现动态变更配置
spread-checks <0..10, in percent> :健康检查范围
  • 多进程示例:
# 默认配置开启进程
ps -ef | grep haproxy
root       2642      1  0 09:20 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy    2645   2642  0 09:20 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
root       2648   2462  0 09:20 pts/1    00:00:00 grep --color=auto haproxy
# 修改配置文件,在global配置
    nbproc      4
# 重启后,查看进程
systemctl restart haproxy
ps -ef | grep haproxy
root       2659      1  0 09:22 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy    2663   2659  0 09:22 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy    2664   2659  0 09:22 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy    2665   2659  0 09:22 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy    2666   2659  0 09:22 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
root       2668   2462  0 09:23 pts/1    00:00:00 grep --color=auto haproxy
  • 配置haproxy日志,默认是没有日志的,需要自行配置
# haproxy中默认配置好了日志
log         127.0.0.1 local2
# 配置rsyslog文件
vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local2.*               /var/log/haproxy.log                                
systemctl restart rsyslog.service
systemctl restart haproxy
# 访问测试
tail -f /var/log/haproxy.log 
Dec 17 09:42:47 localhost haproxy[3067]: Proxy main started.
Dec 17 09:42:47 localhost haproxy[3067]: Proxy static started.

3.2.default默认区段(不经常用)

option参数

  • option httplog:记录日志,包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、frontend、backend等
  • option dontlognull:不记录健康检查的日志信息
  • option redispatch:当找不到cookie对应服务器时,重新分配新的节点给客户端
  • option forwardfor:传递客户端真实IP

timeout参数

·timeout http-request 30s:客户端发送http请求的超时时间

·timeout queue 1m:请求超过最大并发连接数,多余请求进入队列,等待的超时时间

··timeout connect 10s:haproxy与后端连接超时时间

timeout client 1m:非活动连接超时时间

  • timeout server 1m:haproxy与后端非活动连接超时时间
  • timeout http-keep-alive 60s:HTTP请求连接建立的最大超时时间
  • timeout check 10s:健康检测时间的最大超时时间

3.3.proxy区段配置

代理相关配置

  • frontend (name):用于定义系列监控的端口,这些端口可接受客户端请求并连接
  • backend (name):用于定义一系列后端服务器,代理将会将对应客户端请求分发至这些服务器
  • listen (name):通过关联“前端”和“后端”定义一个完整的代理

mode参数:定义haproxy示例运行的协议

  • 语法:mode {tcp|udp}
  • tcp:不对7层报文做任何检查;通常用于ssl、ssh、mysql等应用
  • http:客户端请求服务器,服务端重新封装请求报文,请求后端真实节点
  • 示例:
listen www *:80
  mode http
  server web01 192.168.10.3:80

maxconn:一个前端的最大并发连接数,不可超过全局,优先级比全局高

  • haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,加上其他数据大概共占用17KB左右。意味着优化后1GB的RAM空间可以维护40000-50000并发连接

server参数:为后端定义一个server节点

  • 为后端声明一个server节点信息,不能用于default和frontend区段
  • 语法:server [name] [address]:[port] [param*]
# param常用参数:
backup:正常节点异常后启用备用节点
check:对此server进行tcp的健康检查;check port 80
inter:健康检查的时间间隔;check inter 3000
rise:设置离线状态转正常状态需要成功检查的次数
fall:设置正常状态转不可用状态检查的次数
maxconn:设置此服务器接收最大的并发连接数
maxqueue:设置请求队列的最大长度
weight:服务器节点权重,默认为1,最大256,0表示不参加负载均衡

bind:绑定的端口

  • 示例:bind *:8080

4.haproxy调度算法

  • 根据后端服务器的负载,或其他计算的标准,判断挑选哪台RS来进行请求处理
  • 调度算法可用于“default、listen、backend”

roundrobin:轮询

  • 基于权重进行轮询,保持均匀分布,是比较平衡公平的算法
  • 此算法是动态的,权重可以进行调整,但是每个后端服务器最多接受4128个连接
  • 示例:
frontend main
  bind *:80
  mode http
  use_backend web
backend web
  balance roundrobin
  server web01 192.168.10.3:80 check
  server web02 192.168.10.4:80 check

static-rr:静态轮询

  • 加权轮询调度算法,根据服务器的硬件情况、处理能力,为每台服务器分配不同的权值
  • 此算法为静态,不可在运行时进行调整
  • 示例:访问时按2、3的规则分配
backend web
  balance static-rr
  server web01 192.168.10.3:80 check weight 2
  server web02 192.168.10.4:80 check weight 3

leastconn

  • 新的连接请求被派发至具有最少连接数目的服务器
  • 此算法为动态,可以在运行时调整权重

source

  • 源地址hash调度算法,将请求的源地址进行‘hash’运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求发到对应编号的服务器上。
  • 这样可对不同源IP的访问进行负载分发,对同一个客户端IP请求始终分发到特定的服务器
  • 如果添加新机器或宕机,客户端请求也可能会派发至与之前不同的服务器
  • 可通过hash-type修改特性:hash-type {map-based|consistent}
  • 示例:
backend web
  balance source
  hash-type consistent
  server web01 192.168.10.3:80 check weight 2
  server web02 192.168.10.4:80 check weight 3

uri

  • 基于对用户请求uri做hash并将请求转发至后端服务器
  • 同一个节点访问不同的uri会被调度到不同的后端服务器;不同节点访问相同的uri会被调度到同一台服务器
  • 此算法仅用于http后端服务器场景;默认为静态,可以修改

url_param

  • 对用户请求的url中的param参数中的name做调度
  • 一个url中?后的name中内容
  • 通常用于追踪用户,以确保来自同一个用户请求始终发往同一个backend server(使用少)

hdr

  • 针对用户发起HTTP请求中header中的name关键字进行hash计算,如果没有有效的值,则会进行轮询(使用少)

5.ACL

  • acl主要对请求报文和响应报文进行匹配和过滤。
  • 首先定义acl规则,即定义一个测试条件,条件可以是请求报文中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等。
  • 然后在条件得到满足时执行相应的动作;比如阻止请求、又或者转发请求至某特定后端。
  • 语法:
acl <aclname> <criterion> [flags] [operator] [value]
即:
acl acl名称 条件 条件标记位 具体操作符 操作对象类型
  • aclname:ACL名称,可使用字母、数字和:. - _区分字符大小写
  • criterion:比较的条件标准
基于源地址、源端口、目标地址、目标端口:src、src_port、dst、dst_port
基于Header信息对比:hdr、hdr_beg、hdr_end、hdr_dom
基于路径或后缀:path_beg、path_end
基于请求方法比对:method
  • flags:条件标记
-i:不区分大小写
-m:使用pattern匹配方法
-n:不做dns解析
-u:禁止acl重名,否则多个同名acl为或的关系
  • operator:条件筛选
-eq、-ne、-ge、le、gt、lt
-m str:字符串必须完全匹配
-m sub:在提取的字符串中查找,如果其中任何一个被发现,acl将匹配
-m beg:在提取的字符串首部查找,如果其中任何一个被发现,acl将匹配
-m end:在提取的字符串尾部查找,如果其中任何一个被发现,acl将匹配
-m dir:提取用/分割的字符串,如果其中任何一个被发现,acl将匹配
-m dom:提取用.分割字符串,如果其中任何一个被发现,acl将匹配
  • value:条件目标
布尔值:false、true
整数或整数范围,比如用于匹配端口范围:1024-32768
IP地址或范围:
字符串:比如匹配URL路径,/static\/images等
  • 逻辑关系:多个acl作为条件时的逻辑关系(||、!)
  • 示例:基于http访问,来源用户非127.0.0.1则拒绝
acl source_ip src 192.168.10.100
http-request deny if !source_ip

。。 。 。。。。 。。。。 。。。。 。

目录
相关文章
|
Windows
Windows使用cygwin编译运行haproxy
已编译 链接: https://pan.baidu.com/s/1qZPMlpM 密码: avt2 1.安装 cygwin 1.1.下载cygwin(https://cygwin.
3209 0
|
负载均衡 监控 算法
HAproxy
HAProxy 是一个高性能的负载均衡软件,可以将客户端的请求均衡地分发给多个后端服务器。HAProxy支持多种负载均衡算法,并提供灵活的配置选项。与LVS相比,HAProxy更加灵活和高级,可以进行更复杂的负载均衡策略和应用层的请求转发。通常,HAProxy可以与Keepalived结合使用,以提供高可用性和负载均衡的解决方案。
499 5
|
监控 负载均衡 网络协议
小白带你学习linux的HAproxy
小白带你学习linux的HAproxy
460 0
|
数据可视化 Linux Apache
CentOS部署Apache Superset大数据可视化BI分析工具并实现无公网IP远程访问
CentOS部署Apache Superset大数据可视化BI分析工具并实现无公网IP远程访问
|
存储 Kubernetes 开发工具
Kubernetes (K8s) 的几种卷类型
Kubernetes (K8s) 提供了以下几种卷类型: 1. 空白卷(emptyDir):这是一个临时的卷,它在 Pod 生命周期内存在,但在 Pod 关闭或重新启动后会被清空。 2. 主机路径卷(hostPath):将节点上的目录或文件挂载到 Pod 中,可以使用节点上的文件系统或文件。 3. 持久卷(Persistent Volume,PV):PV 是独立于 Pod 的一种资源,它可以由管理员手动创建并供 Pod 使用。PV 存储在集群中,并可以被多个 Pod 共享。 4. 持久卷声明(Persistent Volume Claim,PVC):PVC 是对 PV 的请求,它描述了所需的存
1163 0
|
人工智能 数据安全/隐私保护 Docker
短短时间,疯狂斩获1.9k star,开源AI神器AingDesk:一键部署上百模型,本地运行还能联网搜索!
AingDesk 是一款开源的本地 AI 模型管理工具,已获 1.9k Star。它支持一键部署上百款大模型(如 DeepSeek、Llama),适配 CPU/GPU,可本地运行并联网搜索。五大核心功能包括零门槛模型部署、实时联网搜证、私人知识库搭建、跨平台共享和智能体工厂,满足学术、办公及团队协作需求。相比 Ollama 和 Cherry Studio,AingDesk 更简单易用,适合技术小白、团队管理者和隐私敏感者。项目地址:https://github.com/aingdesk/AingDesk。
1633 3
|
网络性能优化 调度 索引
4. VPP源码分析(graph node(2))
2.2.2. VLIB_NODE_TYPE_PROCESS结点 每个process结点是由jump机制构成的一个协程,协程主要用于等待、处理事件。使用longjmp/setjmp的轻量级多任务协程,由应用进程自行进行调度,不受操作系统调度机制的影响,上下文切换只损耗调用longjmp/setjmp的时间。
8428 1
|
存储 缓存 运维
【Redis原理探索】帮你完全搞定Cluster(集群)原理篇
【Redis原理探索】帮你完全搞定Cluster(集群)原理篇
1381 0
【Redis原理探索】帮你完全搞定Cluster(集群)原理篇
|
网络协议
TCP的长连接和短连接
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
18644 1
|
监控 Apache
HAProxy的高级配置选项-Web服务器状态监测
这篇文章介绍了HAProxy的高级配置选项,特别是如何进行Web服务器状态监测,包括基于四层传输端口监测、基于指定URI监测和基于指定URI的request请求头部内容监测三种方式,并通过实战案例展示了配置过程和效果。
604 8
HAProxy的高级配置选项-Web服务器状态监测