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

相关推荐
林开落L5 小时前
解决云服务器内存不足:2 分钟搞定 Ubuntu swap 交换区配置(新手友好版)
运维·服务器·ubuntu·swap交换区
初恋叫萱萱5 小时前
深入解析 Rust + LLM 开发:手把手教你写一个 AI 运维助手
运维·人工智能·rust
加农炮手Jinx5 小时前
Flutter for OpenHarmony: Flutter 三方库 icon_font_generator 自动化将 SVG 图标集转化为字体文件(鸿蒙矢量资源全自动管理)
运维·flutter·华为·自动化·harmonyos·devops
雨大王5128 小时前
汽车生产智能计划助手如何提升排产效率并降低库存积压?
大数据·运维
以太浮标9 小时前
华为eNSP综合实验之- 3a认证配置案例及解析(AAA认证)
运维·tcp/ip·网络安全·华为·信息与通信
No8g攻城狮9 小时前
【Linux】Linux nano 编辑器全攻略:从入门到精通
linux·运维·编辑器·nano
2301_8059629310 小时前
arduino IDE如何设置代理
运维·服务器
shughui11 小时前
Docker Desktop下载、安装、配置、使用
运维·docker·容器·自动化
huaweichenai11 小时前
Linux安装http-server并部署html静态站点
linux·运维·服务器