HAProxy 七层负载均衡器笔记

笔记说明:本文档旨在系统性地梳理HAProxy的核心概念、配置文件结构、调度算法,并提供基础搭建、日志配置、多进程/线程管理及热更新等实验步骤,作为学习和配置HAProxy的参考手册。

一、HAProxy 概述与核心概念

1.1 负载均衡与HAProxy简介
  • 负载均衡:一种高可用反向代理技术,将业务流量分担到多台后端服务器,以提升并发处理能力、实现高可用并方便水平扩展。

  • 为什么用它:动态水平扩展(用户无感知)、解决单服务器瓶颈、节约公网IP、隐藏内网IP提高安全性、配置相对简单且功能丰富。

  • HAProxy:由Willy Tarreau用C语言开发的高性能负载均衡软件。特点包括支持高并发(万级以上)、支持TCP/HTTP七层代理、基于cookie的持久性、自动故障切换以及提供详细的Web状态统计页面。

1.2 四层与七层负载均衡对比

HAProxy既可以作为四层(传输层)也可作为七层(应用层)负载均衡器。

维度 四层负载均衡 (如LVS) 七层负载均衡 (如HAProxy)
工作层次 传输层及以下(IP+端口) 应用层及以下(可解析HTTP头、URL等)
性能 高(不解析报文内容,直接转发) 相对较低(需要解析应用层信息)
原理 基于IP和端口的NAT转发 基于虚拟URL或主机IP的代理
核心功能 地址转换、端口映射 内容交换、会话保持、路径匹配
安全性 难以识别应用层攻击 可防御部分应用层攻击(如SYN Flood)
1.3 HAProxy的核心组件与配置结构

HAProxy的配置文件 /etc/haproxy/haproxy.cfg 主要由两大部分组成:

  1. global:全局配置段。用于设置进程管理、安全限制、性能调优和日志等参数,影响HAProxy自身的运行。

  2. proxies:代理配置段。包含以下四种关键组件:

    • defaults:为其他代理配置段提供默认参数,减少重复配置。

    • frontend:前端配置,定义客户端如何连接进来(监听IP和端口)。

    • backend:后端配置,定义一组真实服务器(RS)及其选项。

    • listen:一种混合配置,同时定义了frontend和backend,适用于简单的场景。

二、HAProxy 基础配置实验

2.1 实验环境规划
  • HAProxy主机 :双网卡(eth0: 172.25.254.100 对外,eth1: 192.168.0.100 对内),开启IP转发。

  • RS1 (Web服务器1)192.168.0.10,提供Web服务,测试页面内容为 webserver1 - 192.168.0.10

  • RS2 (Web服务器2)192.168.0.20,提供Web服务,测试页面内容为 webserver2 - 192.168.0.20

  • 客户端172.25.254.10,用于访问HAProxy的VIP进行测试。

2.2 安装与基础负载均衡配置
  1. 安装HAProxy

    bash 复制代码
    dnf install haproxy -y
    haproxy -v  # 查看版本
    systemctl enable --now haproxy
  2. 基础配置示例 (frontend/backend分离)

    bash 复制代码
    vim /etc/haproxy/haproxy.cfg

    添加以下内容(注意要保留或整合原有的globaldefaults配置):

    haproxy

    复制代码
    frontend webcluster
        bind *:80                 # 监听所有IP的80端口
        mode http                 # 工作模式为HTTP七层
        use_backend webserver-80   # 转发到名为webserver-80的后端
    
    backend webserver-80
        mode http
        # server <名称> <IP:端口> check [健康检查参数]
        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
    • check:启用健康检查。

    • inter 3s:每隔3秒检查一次。

    • fall 3:连续失败3次标记为宕机。

    • rise 5:连续成功5次标记为在线。

  3. 使用listen简化配置(适用于简单场景)

    haproxy

    复制代码
    listen webcluster
        bind *:80
        mode http
        server haha 192.168.0.10:80 check inter 3s fall 3 rise 5
        server hehe 192.168.0.20:80 check inter 3s fall 3 rise 5
  4. 验证负载均衡

    bash 复制代码
    systemctl restart haproxy
    # 在客户端多次访问
    for N in {1..6}; do curl 172.25.254.100; done
    # 应看到RS1和RS2的页面轮询输出
2.3 配置日志到指定服务器

HAProxy默认将日志输出到标准输出,通常需要重定向到syslog。

  1. 在RS1 (192.168.0.10) 上开启UDP日志接收

    bash 复制代码
    vim /etc/rsyslog.conf
    # 取消以下两行的注释
    module(load="imudp")
    input(type="imudp" port="514")
    systemctl restart rsyslog
  2. 在HAProxy主机上配置发送日志

    haproxy

    复制代码
    vim /etc/haproxy/haproxy.cfg
    global
        log 192.168.0.10 local2  # 将日志发往RS1的UDP 514端口
  3. 验证日志

    在客户端访问HAProxy后,在RS1上查看日志:

    bash 复制代码
    tail -f /var/log/messages
    # 应能看到包含请求信息的HAProxy日志条目
2.4 socat工具实现动态热更新

socat是一个强大的工具,可以通过HAProxy的stats socket在运行时动态修改配置,无需重启服务。

  1. 配置并启用stats socket

    haproxy

    复制代码
    vim /etc/haproxy/haproxy.cfg
    global
        stats socket /var/lib/haproxy/stats mode 600 level admin
    systemctl restart haproxy
  2. 安装socat并使用

    bash 复制代码
    dnf install socat -y
    # 查看后端服务器信息
    echo "show stat" | socat stdio /var/lib/haproxy/stats
    # 查看指定服务器的当前权重
    echo "get weight webcluster/hehe" | socat stdio /var/lib/haproxy/stats
    # 动态修改权重 (例如将hehe的权重改为4)
    echo "set weight webcluster/hehe 4" | socat stdio /var/lib/haproxy/stats
    # 再次验证权重变化
    echo "get weight webcluster/hehe" | socat stdio /var/lib/haproxy/stats
  3. 验证权重效果

    bash 复制代码
    # 在客户端多次访问,观察hehe (192.168.0.20) 出现的比例是否提高
    for i in {1..10}; do curl 172.25.254.100; done

三、HAProxy 高级配置与调度算法

3.1 多进程与多线程配置

HAProxy支持多进程和多线程模式以利用多核CPU,但两者不能同时启用

  1. 多进程配置 (nbproc)

    bash 复制代码
    global
        nbproc 2                # 启动2个进程
        cpu-map 1 0             # 绑定进程1到CPU 0
        cpu-map 2 1             # 绑定进程2到CPU 1
        # 为不同进程配置独立的socket,方便管理
        stats socket /var/lib/haproxy/haproxy1 mode 600 level admin process 1
        stats socket /var/lib/haproxy/haproxy2 mode 600 level admin process 2

    注意:多进程模式下,每个进程独立,需要通过进程ID或独立的socket进行管理。

  2. 多线程配置 (nbthread)

    bash 复制代码
    global
        nbthread 4              # 启用4个线程
        cpu-map auto:1/1-4 0-3  # 将1-4线程绑定到CPU 0-3
3.2 调度算法详解

通过 balance 关键字在listenbackend中指定。

1. 静态算法(权重不支持运行时动态调整)

  • static-rr :基于权重的轮询。与rr类似,但权重在运行时不能通过socat等工具修改。

    bash 复制代码
    balance static-rr
    server web1 192.168.0.10:80 weight 2 check
    server web2 192.168.0.20:80 weight 1 check
  • first :根据服务器在配置文件中出现的顺序分配请求。只有第一台服务器的并发连接数达到其maxconn限制后,才会使用下一台。忽略权重

    bash 复制代码
    balance first
    server web1 192.168.0.10:80 maxconn 3 check
    server web2 192.168.0.20:80 check

2. 动态算法(考虑后端服务器实时负载)

  • roundrobin:基于权重的轮询,支持运行时调整权重。这是最常用的算法之一。

  • leastconn:将请求分配给当前活动连接数最少的服务器,适用于长连接场景(如数据库)。

  • source:对客户端IP进行哈希,确保来自同一IP的请求始终发往同一台服务器,实现会话保持。

总结

HAProxy是一款功能强大且灵活的七层负载均衡器。其核心优势在于丰富的调度算法 、细致的健康检查机制 以及通过 socat实现的热更新能力 ,使其能够在不中断服务的情况下进行动态调整。掌握其配置文件结构(globalfrontendbackend)是进行高效管理的基础。

相关推荐
欧云服务器1 小时前
宝塔邮局磁盘满了怎么清理?linux磁盘清理教程
运维·服务器
觅特科技-互站1 小时前
告别手动微调Prompt:DevOps用陌讯Skills重构AI运维工作流
运维·prompt·线性回归·kmeans·devops
天空属于哈夫克32 小时前
基于 Webhook 的企业微信外部群自动化推送集成
运维·自动化·企业微信
茶乡浪子2 小时前
实战H3C单环RRPP应用配置
运维·服务器·网络
上海合宙LuatOS2 小时前
LuatOS核心库API——【iperf 】吞吐量测试
linux·运维·服务器·单片机·嵌入式硬件·物联网·硬件工程
乂爻yiyao2 小时前
Minecraft 服务端 JVM 调优指南(低资源 / 非专用服务器专用)
运维·服务器·jvm
芝士雪豹只抽瑞克五2 小时前
Linux Virtual Server (LVS) 负载均衡集群笔记
linux·笔记·负载均衡·lvs
廋到被风吹走2 小时前
稳定性保障:限流降级深度解析 —— Sentinel滑动窗口算法与令牌桶实现
运维·算法·sentinel
Houz-2 小时前
【13180】 计算机操作系统第一章操作系统概论——第一节操作系统概念
笔记·职场和发展·学习方法