HAPROXY负载均衡

一、负载均衡基础
  1. 定义与价值

    • 负载均衡(LB):将网络流量分配到多台服务器的技术,提升系统吞吐量、可用性和可扩展性。
    • 七层代理:基于应用层协议(如HTTP/HTTPS)进行流量分发,支持URL解析、Cookie会话保持等高级功能。
  2. 四层 vs 七层对比

    特性 四层负载均衡 七层负载均衡
    工作层级 传输层(IP+端口) 应用层(解析HTTP请求)
    典型设备/软件 LVS、Nginx(upstream模块) Nginx(proxy_pass)、HAProxy
    优点 高性能、低延迟 精准流量控制、会话粘性
    缺点 无法识别应用层特征 需解析报文,性能略低

二、HAProxy核心特性
  1. 架构设计

    • 单进程多线程模型:主进程管理连接池,子线程处理请求,资源利用率高。
    • 模块化设计:支持插件扩展(如统计页面、SSL加密)。
  1. 关键功能

    • 会话保持:通过Cookie或源地址哈希实现用户粘性。
    • 健康检查:主动探测后端服务状态(TCP连通性、HTTP响应码)。
    • 动态权重调整 :实时根据服务器负载分配流量(如roundrobin算法)。

三、安装与配置详解
  1. 环境准备

    • 依赖项:GCC、OpenSSL(用于HTTPS)、Perl(ACL脚本支持)。
    • 生产环境建议 :启用daemon模式、限制最大连接数(maxconn=10000)。
  2. 配置文件结构

bash 复制代码
# global段:全局参数
global
    log /var/log/haproxy.log local0
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 100000
    nbproc 2  # 多进程绑定CPU核心
    cpu-map 1 0  # 进程1绑定CPU 0核

# defaults段:默认配置模板
defaults
    mode http
    log global
    option httplog   # 记录请求日志
    timeout client   60s  # 客户端超时时间
    retries 3        # 失败重试次数

# frontend段:前端监听规则
frontend webserver_80
    bind *:80
    mode http
    use_backend webcluster

# backend段:后端服务器组
backend webcluster
    mode http
    balance roundrobin  # 动态轮询算法
    server web1 192.168.0.101:80 check inter 3s fall 3 rise 5
    server web2 192.168.0.102:80 check inter 3s fall 3 rise 5

高级配置示例

  • HTTPS卸载:将SSL握手压力转移至后端

frontend https_term

bind *:443 ssl crt /path/to/cert.pem

mode http

use_backend webcluster

路径重写:动态修改请求路径

frontend rewrite_demo

acl path_api path_beg -i /api

use_backend api_server if path_api

use_backend static_server otherwise

四、调度算法深度解析
  1. 静态算法

    • static-rr:固定顺序分配请求,适合无状态服务(如静态文件缓存)。
    • first:强制按服务器列表顺序分配,忽略权重(适用于简单场景)。
  2. 动态算法

    • roundrobin:加权轮询(权重范围0~256),新服务器可配置慢启动(逐步增加权重)。
    • leastconn:优先选择当前连接数最少的服务器,适合数据库集群。
    • source:基于客户端IP哈希分配(如CDN边缘节点负载均衡)。
  3. 混合算法

    • url_param:根据URL参数值分配流量(如电商订单追踪)。
    • hdr:根据HTTP头信息(如User-Agent)分流不同浏览器类型。

五、高级功能实战
  1. 访问控制(ACL)
    域名过滤:仅允许特定域名访问

acl allowed_domain hdr(host) -m sub .example.com

use_backend secure_server if allowed_domain

IP黑名单:阻止恶意IP访问

acl bad_ip src 192.168.1.0/24

http-request deny if bad_ip

路径匹配 :实现动静分离(如将/api请求路由至API服务器)

2. 会话管理

Cookie注入:生成唯一Session ID并持久化

cookie SESSID insert indirect nocache maxidle 300s

Sticky-Session:基于源地址或Cookie实现会话保持

3. 故障转移

备份服务器:当主服务器宕机时自动切换

server backup_web1 192.168.0.103:80 backup inter 5s fall 2 rise 3

优雅降级 :标记服务器为维护状态(disabled),避免流量冲击

六、性能优化与监控
  1. 调优参数

    • 连接复用 :减少TCP三次握手开销(option http-keep-alive)。
    • 超时设置 :合理配置客户端/服务器超时时间(如timeout connect 10s)。
    • 内存优化 :通过maxconn限制并发连接数,避免内存耗尽。
  2. 监控工具

    • Web仪表盘 :访问http://<HAProxy IP>:8888/status查看实时指标4。
    • Prometheus集成 :暴露metrics端点(stats socket /var/lib/haproxy/stats)。
    • 日志分析 :解析/var/log/haproxy.log定位异常流量4。

七、典型应用场景
  1. Web服务反向代理 :将www.example.com流量分发至多个Tomcat实例。
  2. 微服务网关:根据请求路径路由至不同的Spring Cloud服务。
  3. 混合协议处理:同时支持HTTP(七层)与MySQL(四层)负载均衡。
  4. 安全防护 :通过ACL过滤恶意爬虫(如屏蔽curl请求)。

haproxy的基本配置和实现

调度器配置

1.安装haproxy

root@haproxy \~\]# dnf install haproxy.x86_64 -y \[root@haproxy \~\]# systemctl enable haproxy.service --now

2.实现基本负载

root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg backend webserver-80-web1 server web1 192.168.0.10:80 check inter 3s fall 3 rise 5 backend webserver-80-web2 server web2 192.168.0.20:80 check inter 3s fall 3 rise 5 \[root@haproxy \~\]# systemctl restart haproxy.service

服务器配置

1.安装httpd

root@webserver1 \~\]# yum install httpd -y \[root@webserver2 \~\]# yum install httpd -y

2.配置静态页面

root@webserver1 \~\]# echo webserver1 - 192.168.0.10 \> /var/www/html/index.html \[root@webserver2 \~\]# echo webserver2 - 192.168.0.20 \> /var/www/html/index.html 验证 \[root@webserver1 \~\]# curl 192.168.0.10 webserver1 - 192.168.0.10 \[root@webserver2 \~\]# curl 192.168.0.20 webserver2 - 192.168.0.20

调度器的负载均衡

root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg frontend webcluster bind \*:80 mode http use_backend webserver-80 backend webserver-80 server web1 192.168.0.10:80 check inter 3s fall 3 rise 5 server web2 192.168.0.20:80 check inter 3s fall 3 rise 5 \[root@haproxy \~\]# systemctl restart haproxy.service 测试 \[root@haproxy \~\]# curl 172.25.254.100 webserver1 - 192.168.0.10 \[root@haproxy \~\]# curl 172.25.254.100 webserver2 - 192.168.0.20 \[root@haproxy \~\]# curl 172.25.254.100 webserver1 - 192.168.0.10 \[root@haproxy \~\]# curl 172.25.254.100 webserver2 - 192.168.0.20

相关推荐
道亦无名11 小时前
Linux下是STM32的编译修改配置文件tensorflow
linux·运维
Azure DevOps11 小时前
Azure DevOps Server:2026年3月份补丁
运维·microsoft·azure·devops
wanhengidc17 小时前
云手机的运行环境如何
运维·服务器·游戏·智能手机·生活
cyber_两只龙宝17 小时前
【Haproxy】Haproxy的算法详解及配置
linux·运维·服务器·云原生·负载均衡·haproxy·调度算法
阿常呓语17 小时前
Linux命令 jq详解
linux·运维·shell·jq
火车叼位19 小时前
Docker Compose 网络原理与实战:同一 Compose 服务间如何稳定通信
运维·docker·容器
白狐_79821 小时前
从零构建飞书 × OpenClaw 自动化情报站(三)
运维·自动化·飞书
人间打气筒(Ada)1 天前
mysql数据库之DDL、DML
运维·数据库·sql·mysql·dba·dml·dql
SongYuLong的博客1 天前
Linux IPC进程通信几种方法
linux·运维·算法
yiwenrong1 天前
安全审计-Ubuntu-ufw防火墙
linux·运维·ubuntu