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

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
大树8813 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质13 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务