haproxy7层代理

负载均衡

HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,它具有以下特点和功能:

一、特点

  1. 高性能

    • 它能够快速地处理大量的并发连接,在高负载的情况下依然保持较低的资源消耗。其事件驱动、单一进程的架构使其在处理网络流量时非常高效。例如,在一些大型电商网站的应用中,HAProxy 可以轻松应对每秒数万次的请求,确保系统的响应速度不受影响。
    • 采用了高效的内存管理和优化的网络 I/O 模型,减少了系统开销,进一步提高了性能。
  2. 可靠性高

    • 支持多种健康检查机制,能够实时监测后端服务器的状态。如果某台后端服务器出现故障,HAProxy 会自动将流量切换到其他正常的服务器上,保证服务的连续性。例如,它可以通过定期发送 HTTP 请求或 TCP 连接尝试来检测后端 Web 服务器的可用性,一旦发现服务器不可用,就立即停止向其发送流量。
    • 自身也具有高可用性配置,可以通过设置主备模式等方式,确保在 HAProxy 节点出现故障时,服务能够快速切换到备用节点,不影响整体的负载均衡功能。
  3. 灵活的配置

    • 提供了丰富的配置选项,可以根据不同的应用场景进行定制。它支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)、源地址哈希(Source Hashing)等。以轮询为例,它会依次将请求分发到后端的每台服务器上,适用于后端服务器性能相近的情况;而源地址哈希则可以根据客户端的 IP 地址进行哈希计算,将来自同一客户端的请求始终分发到同一台后端服务器,适用于需要保持会话一致性的应用。
    • 可以对 HTTP 协议进行深度的配置,如设置请求和响应的头部信息、根据 URL 路径进行路由等。比如,可以将以"/images/"开头的请求路由到专门存储图片的服务器集群,将以"/api/"开头的请求路由到提供 API 服务的服务器集群。

二、工作原理

  1. 客户端请求

    • 当客户端发起一个请求(如通过浏览器访问一个网站)时,请求首先会到达 HAProxy。客户端认为它是在直接与目标服务器通信,但实际上请求被发送到了 HAProxy 所监听的 IP 地址和端口上。
  2. 负载均衡决策

    • HAProxy 根据配置的负载均衡算法来决定将请求转发到哪台后端服务器。如果是轮询算法,它会依次选择下一台可用的后端服务器;如果是最少连接算法,它会选择当前连接数最少的后端服务器。
    • 同时,HAProxy 会根据健康检查的结果来排除那些不可用的后端服务器。例如,如果一台后端服务器在健康检查中被判定为故障状态,它将不会被选中来处理新的请求。
  3. 请求转发

    • 一旦确定了目标后端服务器,HAProxy 会将请求转发给该服务器。在转发过程中,它可以对请求进行一些修改,如添加或修改 HTTP 头部信息等。
    • 后端服务器处理请求并将响应返回给 HAProxy。
  4. 响应返回

    • HAProxy 接收后端服务器的响应,并将其返回给客户端。对于客户端来说,整个过程就像是直接从目标服务器获取响应一样。

软件下载

yum install haproxy -y
#查看版本
haproxy -v
HAProxy version 2.9.9-ad75c48 2024/06/14 - https://haproxy.org/
Status: stable branch - will stop receiving fixes around Q1 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.9.9.html
Running on: Linux 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020
x86_64

多线程和多进程

vim /etc/haproxy/haproxy.cfg

log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 100000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1 
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2  #启用多个文件

#nbproc 2 #启用多进程
#cpu-map 1 0 
#cpu-map 2 1
nbthread 2

systemctl restart haproxy.service

haproxy的算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法 balance参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法 有些算法可以根据参数在静态和动态算法中相互转换。

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

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

慢启动是指,服务器慢慢的加载处理任务

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

不支持慢启动和权重的热处理

first

while true;do curl 172.25.254.100 ; sleep 0.1;done

看会不会被调度到20上

动态算法

roundrobin

  1. 基于权重的轮询动态调度算法,

  2. 支持权重的运行时调整,不同于lvs中的rr轮训模式,

  3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),

  4. 其每个后端backend中最多支持4095个real server,

  5. 支持对real server权重动态调整,

  6. roundrobin为默认调度算法,此算法使用广泛

leastconn

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法

和一致性hash

listen webserver 80
bind *:80
mode http
balance source
server webserver1 172.25.254.10:80 weight 1 check inter 3 fa11 3 rise 5
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

 for N in {1..5}; do curl 172.25.254.100; done
 server - 172.25.254.10
 server - 172.25.254.10
 server - 172.25.254.10
 server - 172.25.254.10
 server - 172.25.254.10

map-base 取模法

取模法 map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请 求转发至对应的后端服务器。 此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度 缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果 整体改变hash-type 指定的默值为此算法

不能改变不权重,只能是使用或者不用

hash

listen stats
  mode http
  bind *:80
  balance   source
  hash-type consistent
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

uri

listen stats
  mode http
  bind *:80
  balance   uri
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

uri和hash

listen stats
  mode http
  bind *:80
  balance   uri
  hash-type consistent
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

url_param

listen stats
  mode http
  bind *:80
  balance   uri
  balance url_param webcluster
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

测试

 curl 172.25.254.100/index3.html name=webcluster
 172.25.254.10 index

hdr

listen stats
  mode http
  bind *:80
  balance   hdr(User-Agent)
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

一致性hash配置示例

listen stats
  mode http
  bind *:80
  balance   hdr(User-Agent)
  hash-type consistent
  server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
  server wed2  172.25.254.20:80   check inter 2 fall 3 rise 5 weight 1

基于cookie的会话保持

为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替

ip穿透

四层穿透

listen webserver 80
bind *:80
mode tcp
balance roundrobin
server webserver1 172.25.254.10:80 weight 1 check inter 3 fa11 3 rise 5
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

七层穿透

listen webserver_80
option forwardfor
bind *:80
mode http
balance roundrobin
server web1  172.25.254.10:80   check inter 2 fall 3 rise 5 weight 1 
server wed2  172.25.254.20:80 send-proxy  check inter 2 fall 3 rise 5 weigh

ACL

frontend webcluster
bind *:80
mode http
acl test hdr_dom(host)  -i wwW.timinglee.com
use_backend webcluster-host  if test
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode-http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5

#做本地解析
vim /etc/hosts
172.25.254.100 www.timing.com

数据库

yum install mariadb-server-galera.x86_64 -y
 systemctl start mariadb.service 

 vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqtdl]
server-id=1
datadir=/var/lib/mysgl
socket=/var/lib/mysql/mysql.sock
Log-error=/var/log/mariadb/mariadb.logpid-file=/run/mariadb/mariadb.pid

 vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqtdl]
server-id=2
datadir=/var/lib/mysgl
socket=/var/lib/mysql/mysql.sock
Log-error=/var/log/mariadb/mariadb.logpid-file=/run/mariadb/mariadb.pid

listen dbserver
bind *:3306
mode tcp
balance static-rr
server db1 172.25.254.10:3306
server db2 172 35.354 20:3306 check inter 3 falt 3 rise s

[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
相关推荐
张某布响丸辣3 分钟前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle
路遇晚风1 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
P.H. Infinity1 小时前
【RabbitMQ】10-抽取MQ工具
数据库·分布式·rabbitmq
zgscwxd1 小时前
thinkphp6 --数据库操作 增删改查
数据库·thinkphp6
代码小鑫1 小时前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
小白~小黑2 小时前
软件测试基础二十(接口测试 Postman)
python·自动化·postman
天天要nx2 小时前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
精进攻城狮@2 小时前
Redis(value的数据类型)
数据库·redis
爪哇学长2 小时前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle