笔记说明:本文档旨在系统性地梳理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 主要由两大部分组成:
-
global:全局配置段。用于设置进程管理、安全限制、性能调优和日志等参数,影响HAProxy自身的运行。
-
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 安装与基础负载均衡配置
-
安装HAProxy
bashdnf install haproxy -y haproxy -v # 查看版本 systemctl enable --now haproxy -
基础配置示例 (frontend/backend分离)
bashvim /etc/haproxy/haproxy.cfg添加以下内容(注意要保留或整合原有的
global和defaults配置):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次标记为在线。
-
-
使用
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 -
验证负载均衡
bashsystemctl restart haproxy # 在客户端多次访问 for N in {1..6}; do curl 172.25.254.100; done # 应看到RS1和RS2的页面轮询输出
2.3 配置日志到指定服务器
HAProxy默认将日志输出到标准输出,通常需要重定向到syslog。
-
在RS1 (
192.168.0.10) 上开启UDP日志接收bashvim /etc/rsyslog.conf # 取消以下两行的注释 module(load="imudp") input(type="imudp" port="514") systemctl restart rsyslog -
在HAProxy主机上配置发送日志
haproxy
vim /etc/haproxy/haproxy.cfg global log 192.168.0.10 local2 # 将日志发往RS1的UDP 514端口 -
验证日志
在客户端访问HAProxy后,在RS1上查看日志:
bashtail -f /var/log/messages # 应能看到包含请求信息的HAProxy日志条目
2.4 socat工具实现动态热更新
socat是一个强大的工具,可以通过HAProxy的stats socket在运行时动态修改配置,无需重启服务。
-
配置并启用
stats sockethaproxy
vim /etc/haproxy/haproxy.cfg global stats socket /var/lib/haproxy/stats mode 600 level admin systemctl restart haproxy -
安装
socat并使用bashdnf 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 -
验证权重效果
bash# 在客户端多次访问,观察hehe (192.168.0.20) 出现的比例是否提高 for i in {1..10}; do curl 172.25.254.100; done
三、HAProxy 高级配置与调度算法
3.1 多进程与多线程配置
HAProxy支持多进程和多线程模式以利用多核CPU,但两者不能同时启用。
-
多进程配置 (
nbproc)bashglobal 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进行管理。
-
多线程配置 (
nbthread)bashglobal nbthread 4 # 启用4个线程 cpu-map auto:1/1-4 0-3 # 将1-4线程绑定到CPU 0-3
3.2 调度算法详解
通过 balance 关键字在listen或backend中指定。
1. 静态算法(权重不支持运行时动态调整)
-
static-rr:基于权重的轮询。与rr类似,但权重在运行时不能通过socat等工具修改。bashbalance static-rr server web1 192.168.0.10:80 weight 2 check server web2 192.168.0.20:80 weight 1 check -
first:根据服务器在配置文件中出现的顺序分配请求。只有第一台服务器的并发连接数达到其maxconn限制后,才会使用下一台。忽略权重。bashbalance 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实现的热更新能力 ,使其能够在不中断服务的情况下进行动态调整。掌握其配置文件结构(global、frontend、backend)是进行高效管理的基础。