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

相关推荐
OpsEye8 分钟前
系统负载高一定是CPU问题吗?
运维·cpu·it
AOwhisky1 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
赵民勇1 小时前
Linux file命令详解
linux·运维
li-xun2 小时前
LINUX DO 社区注册机制调整与公益 AI 服务动态
linux·运维·人工智能
j_xxx404_2 小时前
MySQL表操作硬核解析:从 CREATE TABLE 到磁盘文件、ALTER TABLE 与 DDL 风险
运维·服务器·数据库·c++·mysql·adb·ai
前端程序猿i2 小时前
Nginx 教程:从入门到能上线
运维·nginx
木雷坞2 小时前
Qdrant Docker 部署教程:数据卷、API Key 和集合初始化
运维·docker·容器·知识图谱
团象科技2 小时前
外贸站选海外服务器 拆解跨境运营中常被忽略的核心性能细节
运维·服务器
Lv_沐曦3 小时前
银河麒麟桌面版安装、多屏配置、触摸校准
运维·docker·samba·vsftpd·银河麒麟·触控校准·多屏配置
半壶清水3 小时前
ubuntu下利用ns-3 + NetAnim搭建可视化路由选路过程的方法
linux·运维·ubuntu