HAProxy

一、HAProxy概念

1.1 什么是 HAProxy ?

HAProxy(High Availability Proxy)是一个高性能的TCP/HTTP负载均衡器,专为高可用性环境设计。它旨在提供快速且可靠的负载均衡解决方案,同时保持较低的CPU消耗。HAProxy可以非常灵活地配置,以支持各种复杂的路由规则、健康检查、会话保持等特性,从而确保服务的高可用性和可扩展性。

1.2 HAProxy 优势

高性能: HAProxy 能够处理成千上万的并发连接,同时保持低延迟和高吞吐量。maxconn 2000意味着HAProxy可以同时处理多达2000个并发连接。

**高可用性:**HAProxy支持多种健康检查机制,可以实时监控后端服务器的状态,确保只有健康的服务器才会接收请求。它还提供了会话保持(session persistence)功能,确保来自同一客户端的请求被转发到同一后端服务器,即使在高负载或故障转移情况下也能保持会话的连续性。

**灵活性:**HAProxy支持多种协议,包括TCP、HTTP、HTTPS、FTP等,并且可以通过配置来优化每种协议的性能。它还提供了丰富的配置选项,允许用户根据具体需求定制负载均衡策略,如轮询(round-robin)、最少连接(leastconn)、源地址哈希(source)等。

二、配置基础

配置文件haproxy.cfg解读:/etc/haproxy/haproxy.cfg

2.1 全局设置

定义了影响整个 HAProxy 进程的全局参数。

bash 复制代码
global  
    log         127.0.0.1 local2  
    chroot      /var/lib/haproxy  
    pidfile     /var/run/haproxy.pid  
    maxconn     4000  
    user        haproxy  
    group       haproxy  
    daemon  
  
    # 调试和统计设置  
    stats socket /var/lib/haproxy/stats
  • log:定义日志记录的地址和级别。
  • chroot:将 HAProxy 进程的工作目录更改到指定的目录,提高安全性。
  • pidfile:指定 HAProxy 进程 PID 文件的路径。
  • maxconn:设置 HAProxy 单个进程能接受的最大并发连接数。
  • usergroup:设置 HAProxy 进程运行的用户和组。
  • daemon:使 HAProxy 以守护进程模式运行。
  • stats socket:配置统计套接字的路径,用于收集 HAProxy 的运行数据。

2.2 默认设置

此部分定义了所有前端和后端默认的配置选项,可以被后续的 frontendbackendlisten 区块覆盖。

bash 复制代码
defaults  
    mode                    http  
    log                     global  
    option                  httplog  
    option                  dontlognull  
    option http-server-close  
    option forwardfor       except 127.0.0.0/8  
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    maxconn                 2000
    errorfile 503           /etc/haproxy/errorpage/503.http
  • mode:定义 HAProxy 的工作模式,http 表示 HTTP 模式,tcp 表示 TCP 模式。
  • log:启用日志记录。
  • option:定义不同的选项,如 httplog 用于记录 HTTP 请求的日志,dontlognull 表示不记录空连接日志等。
  • timeout:设置不同类型的超时时间,如连接超时、客户端超时、服务器超时等。
  • mode:定义了 HAProxy 的工作模式(如 http、tcp)。
  • maxconn: 最大连接数。
  • errorfile:定义特定 HTTP 错误代码的响应文件路径。

2.3 前端设置

前端定义了如何接收和处理进入 HAProxy 的连接。

bash 复制代码
frontend http-in  
    bind *:80  
    mode http  
    default_backend servers
  • bind:指定 HAProxy 监听的地址和端口。
  • mode:定义此前端的工作模式。
  • default_backend:指定了默认的后端服务器组。

2.4 后端设置

后端定义了如何将请求分发到后端服务器。

bash 复制代码
backend servers  
    balance     roundrobin  
    server      app1 172.25.254.10:80 check  
    server      app2 172.25.254.20:80 check

balance:定义了负载均衡算法(如 roundrobin、leastconn 等)。

server:定义了后端服务器的地址、端口和检查选项。

2.4.1 相关参数

server <name> <address>:<port> [param1=value1] ...

定义一个后端服务器。<name>是服务器的名称,<address>是服务器的IP地址,<port>是端口号。后面的[param1=value1]...是可选参数,用于进一步配置服务器,如权重(weight)、检查间隔(check inter)、检查失败次数(fall)、检查成功次数(rise)等。

权重(weight:设置服务器的相对权重,用于负载均衡算法中的权重分配。

检查间隔(check interval :设置健康检查的时间间隔,以毫秒(ms)或秒(s)为单位。注意,在某些配置中,inter 可能是 interval 的简写,但最好使用完整的 interval 以避免混淆。

检查失败次数(fall:指定在认为服务器不可用之前,需要连续失败的健康检查次数。

检查成功次数(rise:指定在认为服务器重新可用之前,需要连续成功的健康检查次数。

检查命令(check :虽然通常与 check intervalfallrise 等参数一起使用来启用健康检查,但 check 本身也可以后跟特定的检查命令或协议(如 check httpcheck tcp 等),以指定检查服务器健康状态的方法。

超时设置timeout connect:设置与服务器建立连接的超时时间。timeout server:设置服务器响应的超时时间(即服务器处理请求并返回响应的时间)。这些超时设置通常不在 server 指令中直接设置,而是在 defaultsfrontendbackend 块中设置,但可以在 server 指令中通过 timeout check 来设置健康检查的超时时间。

备份服务器(backup:标记该服务器为备份服务器,仅在所有非备份服务器都不可用时才会向其发送请求。

禁用(disabled:暂时禁用该服务器,使其不会接收任何请求。

2.5 监听配置

listen 部分是 frontendbackend 的组合,适用于简单配置,无需分别定义前端和后端。

2.6 监听统计信息

统计页面,用于监控和管理后端服务器。

bash 复制代码
listen stats  
    bind *:9999  
    mode http  
    stats enable  
    stats uri /stats  
    stats auth admin:password

这个配置在 9999 端口上开启了一个 HTTP 统计页面,需要用户名和密码访问。 后面有实例。

三、haproxy 的算法

HAProxy 通过固定参数 balance 指明对后端服务器的调度算法 ,balance参数可以配置在 listen 或 backend 选项中。
HAProxy 的调度算法分为静态和动态调度算法。
静态算法:
静态算法是指负载均衡中的 调度算法在配置时就已经确定,并且在运行过程中不会随着服务器状态或负载的变化而改变。

3.1 静态算法:

**Round Robin(轮询):**按照后端服务器列表的顺序依次将请求分发给每个服务器,然后再从头开始。每个服务器依次接收请求,实现负载均衡。适用于后端服务器性能相近的情况。

**Static-Weight(静态权重):**手动设置每个后端服务器的权重值。根据权重值来决定每个服务器获得请求的比例。可以根据服务器性能、硬件配置等设置不同的权重,以实现负载均衡。

**Source IP Hash(源IP哈希):**根据客户端的IP地址计算哈希值,并将请求分发到对应的服务器。这样,相同IP的请求总是被分发到同一个后端服务器上。

**URI Hash(URI哈希):**根据请求的URI(URL)计算哈希值,并将请求分发到对应的服务器。用于确保特定URI的请求总是发送到同一个后端服务器。

**URL Parameter(URL参数):**根据请求的URL参数来选择后端服务器。例如,可以根据某个特定的URL参数值来分发请求。

Static-Weight(静态权重):

bash 复制代码
backend web_servers
    mode http
    balance static-rr
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

round robin:

bash 复制代码
backend web_servers
    mode http
    balance roundrobin
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

Source IP Hash(源IP哈希):

bash 复制代码
backend web_servers
    mode http
    balance source
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

3.2 动态算法:

动态算法是指在负载均衡过程中根据服务器状态和负载情况动态调整的算法。

Least Response:

算法会选择响应时间最短的服务器来处理请求。它会测量后端服务器的响应时间,并将请求分发给响应时间最短的服务器,以确保请求能够尽快获得响应。这使得负载均衡器可以动态地选择性能最好的服务器来处理请求,从而优化整体性能。

bash 复制代码
backend web_servers
    mode http
    balance leastresponse
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

Least Connections(最少连接数):

bash 复制代码
backend web_servers
    mode http
    balance leastconn
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

URI Hash(URI哈希):

bash 复制代码
backend web_servers
    mode http
    balance uri
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

URL Parameter(URL参数):

bash 复制代码
backend web_servers
    mode http
    balance url_param sid
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

3.3 随机算法

hdr取模法:

bash 复制代码
backend web_servers
    mode http
    balance hdr(User-Agent)
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

除以上总结的外,还有其他算法,有需求的话可以去了解!!

**四、**高级功能

4.1 基于cookie的会话保持

会话保持实现方式:Cookie&&Session

使用Cookie是最常见的会话保持技术。当用户首次访问网站时,服务器会在响应中设置一个会话Cookie,并在用户浏览器中存储一个唯一的会话标识(通常是一个加密的字符串)。

在随后的每个请求中,浏览器都会自动将该会话Cookie包含在请求头中,使得服务器能够识别并与用户的会话进行关联。

会话Cookie通常具有过期时间,这样一旦用户关闭浏览器,会话Cookie就会失效,会话数据也会被清除,从而保护用户的隐私。

会话保持中服务器传输Session ID的过程可以通过Cookie来描述,因为Cookie是最常见的会话保持机制。

什么是"cookie"?用简单的话来解释,"cookie" 就像是网站和你之间的一张小便条,它记录了一些信息,以便在你后续的访问中提供更好的体验。

配置示例:

验证cookie信息:
通过命令行验证:

4.2 IP透传

IP透传允许后端服务器接收到来自客户端的真实IP地址,而不是负载均衡器自身的IP地址。

4层透传

在四层(传输层)进行IP透传时,HAProxy将客户端发送的报文中的目标地址(原本是负载均衡器的IP地址)替换为后端服务器的IP地址,但保留客户端的源IP地址不变。这样,后端服务器在接收到报文时,可以直接从报文中获取到客户端的真实IP地址。

bash 复制代码
backend app_servers
    bind 172.25.254.100:80
    mode tcp
    balance roundrobin
    server webserver1 172.25.254.10:80 send-proxy check
    server webserver2 172.25.254.20:80 send-proxy check

7层透传

在七层(应用层)进行IP透传时,HAProxy作为反向代理服务器,会在转发请求给后端服务器之前,在HTTP请求头中添加表示客户端真实IP地址的字段。后端服务器在接收到请求时,可以从请求头中读取该字段以获取客户端的真实IP地址。

bash 复制代码
defaults  
    option forwardfor  

backend app_servers  
    bind 172.25.254.100:80
    mode http  
    balance roundrobin
    server webserver1 172.25.254.10:80 check
    server webserver2 172.25.254.20:80 check

**示例:**通过IP透传技术,查看日志时,看到了访问主机的IP为172.25.254.6 :

4.3 ACL

基本格式:acl <aclname> <criterion> [flags] [operator] [<value>]

常用参数 :

  • <aclname>: 自定义的ACL名称,用于后续引用。
  • <criterion>: 匹配的依据,如hdr(HTTP请求头)、path(URL路径)、src(源IP地址)等。
  • [flags]: 可选的标志,用于修改匹配行为,如-i表示不区分大小写。
  • [operator]: 操作符,如eq(等于)、beg(以...开始)、reg(正则表达式匹配)等。
  • [<value>]: 与<criterion>[operator]结合使用的匹配值。

说明:acl:区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl。

-i:忽略大小写

-f:从指定的文件中加载模式;

常用的方法:

1)hdr_beg(host):用于测试请求报文的指定首部的开头部分是否符合指定的模式

例子:

acl host_static hdr_beg(host) -i img. video. download. ftp.

测试请求是否为提供静态内容的主机img、video、download或ftp。

2)hdr_end(host):用于测试请求报文的指定首部的结尾部分是否符合指定的模式

例子:

acl host_static hdr_beg(host) -i .aa.com .bb.com

3)hdr_reg(host):正则匹配

例子:

acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)

4)url_sub:表示请求url中包含什么字符串

5、url_dir:表示请求url中存在哪些字符串作为部分地址路径

6)path_beg: 用于测试请求的URL是否以指定的模式开头

例子:

acl url_static path_beg -i /static /iilannis /javascript /stylesheets

用于测试URL是否以/static、/iilannis、/javascript或/stylesheets开头。

7)path_end:用于测试请求的URL是否以指定的模式结尾

例子:

acl url_static path_end -i .jpg .gif .png .css .js

测试URL是否以.jpg、.gif、.png、.css或.js结尾。

也可以根据访问的地址和端口进行规制设置:

dst:目标地址

dst_port:目标端口

src:源地址

src_port:源端口

实现的结果:

当客户端访问haproxy时,请求的是静态文件内容时,请求转交给static server,请求的是php内容时,请求转交给php server,请求的是jsp内容时,请求转交给tomcat server,以实现动静分离。

五、实例

5.1 acl的应用实例

基于域名的访问

自定义错误页面

一般错误页面都是固定的;比如400、500、502、503、504等。

自定义错误页面示例:

自定义 503.http:

修改配置文件 haproxy.cfg:

在浏览器上测试一下:

还可以通过以下配置:在返回 503 错误时显示一个自定义的 HTML 页面,而不是默认的服务器错误页面。

errorloc 503 https://www.baidu.com

5.2 四层负载实现

实验环境:

|---------|---------------------|
| 主机 | IP |
| haproxy | eth0:172.25.254.100 |
| server1 | eth0:172.25.254.10 |
| server2 | eth0:172.25.254.20 |

在三台主机上安装 mariadb-server;

为了更好的观察效果,在 server1 和 server2 上修改 /etc/my.cnf.d/mariadb-server.cnf 文件:

在 server1 和 server2 上的数据库中查看一下是否生效:

在 server1 和 server2 上的数据库中:创建用户lxm并设置其密码;并授予用户lxm从任何主机连接到数据库服务器时,对数据库服务器上所有数据库(*.*表示所有数据库和表)拥有全部权限。

编辑HAProxy的配置文件(通常是/etc/haproxy/haproxy.cfg

在haproxy上测试:

5.3haproxy的https实现

制作证书和密钥:

查看:

编辑HAProxy的配置文件:haproxy.cfg

OVER !!!

相关推荐
hzylyh14 小时前
【Java实现单例模式的五种方式及其优缺点分析】
负载均衡
Vio72515 小时前
Ribbon负载均衡
spring cloud·ribbon·负载均衡
zrande17 小时前
Nginx 负载均衡通用方案
nginx·负载均衡
维尔切3 天前
Nginx 反向代理与负载均衡
运维·nginx·负载均衡
知白守黑2673 天前
反向代理和负载均衡
运维·负载均衡
vadvascascass3 天前
平滑加权轮询负载均衡的底层逻辑
java·算法·负载均衡
yunmi_3 天前
Spring Cloud Netfilx -- Ribbon:负载均衡工具(代码示例)
spring cloud·ribbon·maven·负载均衡
java干货4 天前
我用Nginx做了负载均衡,还需要API网关吗?
运维·nginx·负载均衡
小任今晚几点睡5 天前
LVS深度解析:从原理到实战的负载均衡完全指南
负载均衡·lvs
森林-6 天前
Spring Cloud Netflix Ribbon:微服务的客户端负载均衡利器
spring cloud·微服务·ribbon·负载均衡