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

相关推荐
数智工坊8 小时前
Zotero自建Ubuntu WebDAV附件同步方案(完美解决存储空间不足)
linux·运维·ubuntu
独隅10 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
饺子大魔王的男人10 小时前
CentOS部署Cockpit:图形化查看系统、日志与服务状态
linux·运维·centos
不会就选b10 小时前
Linux之信号(二)
linux·运维·服务器
qq_2676128911 小时前
Gitee项目管理推荐:从工具链割裂到DevOps全链路贯通的企业级协作实践
运维·gitee·devops
寺中人12 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
V哥AI增长12 小时前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能
小张成长计划..13 小时前
【Linux】18:基础IO
linux·运维·服务器
东东最爱敲键盘14 小时前
二阶段总结
运维
Benszen14 小时前
云计算基础-13:Linux网络管理实战-1
linux·运维·云计算