Haproxy -- 集群简单实现及全局配置详解

文末附有 HAProxy 核心配置速记+vim进入文件后文件编辑常用快捷键总结表

一. Haproxy简介

1.1 背景

HAProxy 是法国开发者威利塔罗(Willy Tarreau)在 2000 年用 C 语言写的一款开源软件,主打高并发(万级以上)和高性能,既能做 TCP 负载均衡,也能做 HTTP 负载均衡,还支持基于 cookie 的会话保持、自动故障切换、正则表达式和 Web 状态统计等功能,有社区版和企业版两个版本。

1.2 原理

HAProxy 就像一个 "智能流量管家",它站在客户端和后端服务器中间,先接住所有进来的请求,再根据预设的规则(比如轮询、最小连接数,或者看 URL、Cookie 等),把请求转发给最合适的后端服务器去处理,同时还能监控后端服务器的健康状态,发现哪个服务器挂了就自动把流量切到别的服务器上。

1.3 目的

扛住更多并发请求,不让单台服务器被压垮;保证服务不中断,某台服务器出问题也不影响用户使用;让用户访问更稳定、响应更快,体验更好;方便后续扩展,加服务器不用改太多配置。

二.环境设定

2.1 环境流程图

2.2 实验环境

2.3 环境配置

2.3.1创建并开启虚拟机

(注意对应的网卡数量及类型)

注:添加并更改网卡教程

添加

更改

2.3.2 环境配置命令

1.设定网络

在haproxy中

复制代码
[root@haproxy ~]# vmset.sh eth0 192.168.35.100 haproxy
[root@haproxy ~]# vmset.sh eth1 192.168.221.100 haproxy noroute

在webserver1中

复制代码
[root@webserver1 ~]# vmset.sh eth0 192.168.221.10 webserver1 noroute

在webserver2中

复制代码
[root@webserver2 ~]# vmset.sh eth0 192.168.221.20 webserver2 noroute

2.配置内核路由功能

让运行 HAProxy 的服务器具备转发 IP 数据包的能力 ------ 简单说,就是允许服务器把接收到的客户端请求数据包,转发给后端不同网段的真实服务器;同时也能把后端服务器的响应数据包,再转发回客户端。

在haproxy中

复制代码
[root@haproxy ~]# echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
#把开启内核 IP 转发的配置写入系统永久配置文件,确保服务器重启后依然生效

[root@haproxy ~]# sysctl -p    
#立即加载 /etc/sysctl.conf 中的内核参数,让 ip_forward=1 无需重启服务器就能生效

3.设定访问业务真实数据

搭建一台可被 HAProxy 调度的后端 HTTP 业务服务器

这组操作的核心是为 HAProxy 负载均衡架构搭建一台可用的后端 Web 业务节点:安装 httpd 服务并创建带专属标识的首页文件,同时启动服务并设置开机自启,既让服务器能提供网页访问服务,也便于验证 HAProxy 的负载均衡调度效果。

在webserver1中

复制代码
[root@webserver1 ~]# dnf install httpd -y
#安装 Apache HTTP 服务
[root@webserver1 ~]# echo webserver1 - 192.168.221.10 > /var/www/html/index.html
#创建 Web 服务的默认首页文件
[root@webserver1 ~]# systemctl enable --now httpd
#立即启动 httpd 服务,并设置开机自启

在webserver2中

复制代码
[root@webserver2 ~]# dnf install httpd -y
#安装 Apache HTTP 服务
[root@webserver2 ~]# echo webserver2 - 192.168.221.20 > /var/www/html/index.html
#创建 Web 服务的默认首页文件
[root@webserver2 ~]# systemctl enable --now httpd
#立即启动 httpd 服务,并设置开机自启

4.验证环境

在haproxy中

复制代码
[root@haproxy ~]# curl 192.168.221.10
webserver1 - 192.168.221.10
[root@haproxy ~]# curl 192.168.221.20
webserver2 - 192.168.221.20

三. Haproxy的安装及配置参数

3.1 安装

在haproxy中

复制代码
[root@haproxy ~]# dnf install haproxy -y
#通过系统包管理器安装 HAProxy 软件,这是搭建负载均衡服务的基础前提
[root@haproxy ~]# systemctl enable --now haproxy

3.2 harpoxy的参数详解实验

Haproxy的配置文件haproxy.cfg由两大部分组成,分别是:

global:全局配置段

(这是 HAProxy 配置里最顶层的部分,用来设置整个 HAProxy 进程生效的全局参数,所有代理相关的配置都会继承这里的基础设置。)

· 进程及安全配置相关的参数 (主要控制 HAProxy 进程的运行方式和安全相关设置)

· 性能调整相关参数 (用于优化 HAProxy 的运行性能)

· Debug参数 (用于调试和排查问题)
proxies:代理配置段

(这是 HAProxy 配置里专门负责代理相关逻辑 的部分,用来定义如何接收请求、转发请求到后端服务器。)

· defaults:为 frontend, ...

(defaults 段是默认配置段 ,用来给下面的 frontendbackend 等提供统一的默认参数,避免重复配置。)

· frontend:前端,相当于 nginx

(frontend 是前端入口,负责监听客户端的请求(比如监听某个端口),并根据规则把请求转发到对应的后端,作用类似 Nginx 的 "前端监听 + 路由分发")

· backend:后端,相当于 nginx

(backend 是后端服务池,定义了一组真实的后端服务器,以及负载均衡、健康检查等规则,类似 Nginx 里的 upstream 后端服务器组。)

· listen:同时拥有前端和后端配置

(listen 是一种简化写法,把 frontend 和 backend 合并在一个配置块里,既定义监听端口,又直接指定后端服务器,适合简单的一对一代理场景。)

3.2.1 实现最基本的负载

前后端分开设定和用listen方式书写负载均衡这两种方法,功能完全等价,只是用listen方式写法更简洁

1.前后端分开设定

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
(注:为了不影响效果,可选择将源文件中目前不需要的配置信息注释掉
快速注释方法在文末)
frontend webcluster   #定义前端配置块,frontend负责接收客户端请求,名字叫webcluster(可自定义)
    bind            *:80           #监听服务器所有网卡的80端口
    mode            http           #工作模式为HTTP模式
    use_backend     webserver-80   #将接收到的请求转发到名为webserver-80的后端集群

backend webserver-80               #定义后端的配置块,名字要和前端的use_backend对应
    server web1 192.168.221.10:80 check inter 3s fall 3 rise 5
    server web2 192.168.221.20:80 check inter 3s fall 3 rise 5
     #指定了两台后端 Web 服务器(IP 是 192.168.221.10(20)),HAProxy 会默认用轮询方式,把请求交替发给 web1 和 web2,实现负载均衡。
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
[root@haproxy ~]# curl 192.168.35.100
webserver1 - 192.168.221.10
[root@haproxy ~]# curl 192.168.35.100
webserver2 - 192.168.221.20

2.用listen方式书写负载均衡

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster           # 定义一个listen配置块,名称为webcluster
    bind            *:80    # 监听服务器所有网卡的80端口
    mode            http    # 工作模式为HTTP模式
    server web1 192.168.221.10:80 check inter 3s fall 3 rise 5
    server web2 192.168.221.20:80 check inter 3s fall 3 rise 5
     #定义两台后端 Web 服务器(web1、web2);开启健康检查,每 3 秒检测一次,连续 3 次失败则剔除,连续 5 次成功则恢复。
[root@haproxy ~]# systemctl restart haproxy.service

测试:

3.2.2 log 127.0.0.1 local2

指定把日志发送到哪里

实验中指定日志发送到192.168.221.10(webserver1)

1.在192.168.0.10 开启接受日志的端口

复制代码
[root@webserver1 ~]# vim /etc/rsyslog.conf #打开 rsyslog 服务的核心配置文件

module(load="imudp") # needs to be done just once
#开启rsyslog 的 "UDP 输入模块",作用是让 rsyslog 具备通过 UDP 协议接收日志的能力
input(type="imudp" port="514")
#定义rsyslog的日志输入源为UDP模块,监听 UDP 514 端口(514 是 syslog 协议的默认端口)

[root@webserver1 ~]# systemctl restart rsyslog.service

2..测试接受日志端口是否开启

复制代码
[root@webserver1 ~]# netstat -antlupe | grep rsyslog
  1. 在haproxy主机中设定日志发送信息

    [root@haproxy haproxy]# vim haproxy.cfg
    log 192.168.221.10 local2
    [root@haproxy haproxy]# systemctl restart haproxy.service

  1. 验证

新开一个shell中

在webserver1中

复制代码
[root@webserver1 ~]# cat /var/log/messages

注:做完实验后将log 更改回去

3.2.3 实现haproxy的多进程

  1. 默认haproxy是单进程,现在改为多进程

    [root@haproxy haproxy]# vim /etc/haproxy/haproxy.cfg
    maxconn 10000 #选择性更改最大并发量为多少
    user haproxy
    group haproxy
    daemon

    # turn on stats unix socket

    复制代码
     stats socket /var/lib/haproxy/stats
     nbproc      2        #设定进程数量为2个

    [root@haproxy haproxy]# systemctl restart haproxy.service
    [root@haproxy haproxy]# pstree | grep haproxy
    |-haproxy---2*[haproxy]

验证

  1. 多进程cpu绑定

为 HAProxy 开启多进程模式,并将不同进程绑定到指定 CPU 核心,提升性能和资源利用效率

注:每个进程独占一个核心,最大化利用多核 CPU 的算力,尤其适合高并发的负载均衡场景

复制代码
[root@haproxy haproxy]# vim /etc/haproxy/haproxy.cfg

    nbproc      2
    cpu-map     1 0  
#将 HAProxy 的第 1 个进程绑定到服务器的第 0 号 CPU 核心(CPU 核心编号从 0 开始)
    cpu-map     2 1

[root@haproxy haproxy]# systemctl restart haproxy.service

3.为不同进程准备不同套接字

复制代码
[root@haproxy ~]# systemctl stop haproxy.service
[root@haproxy ~]# rm -fr /var/lib/haproxy/stats
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

    stats socket /var/lib/haproxy/haproxy1  mode 600 level admin process 1
    stats socket /var/lib/haproxy/haporxy2  mode 660 level admin process 1
#  stats socket /var/lib/haproxy/haproxy1   定义统计套接字的文件路径,
   mode 600 设置套接字文件的权限:- 600:仅文件所有者(haproxy 用户)可读写;
   level admin 设置套接字的操作权限级别为 "管理员"
   process 1 指定该套接字仅关联 HAProxy 的第 1 个进程

[root@haproxy ~]# systemctl restart haproxy.service

效果:

3.2.4 haproxy实现多线程

注意多线程不能和多进程同时启用

1.查看当前haproxy的进程信息

复制代码
[root@haproxy ~]# pstree -p | grep haproxy  #查看 HAProxy 进程树
           |-haproxy(32313)-+-haproxy(32315)
           |                `-haproxy(32316)

#输出含义
32313 是管理进程,只做管控不处理业务;
32315/32316 是业务进程,专门处理请求转发,数量由nbproc 2决定。



[root@haproxy ~]# cat /proc/32315/status  | grep Threads  #查看指定进程的线程数
Threads:        1

2.启用多线程

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

	#nbproc     2
    #cpu-map    1 0
    #cpu-map    2 1
    nbthread    2
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    #stats socket /var/lib/haproxy/haproxy1  mode 600 level admin process 1
    #stats socket /var/lib/haproxy/haporxy2  mode 660 level admin process 1
[root@haproxy ~]# systemctl restart haproxy.service

3.效果

复制代码
[root@haproxy ~]#  pstree -p | grep haproxy
           |-haproxy(32333)---haproxy(32335)---{haproxy}(32336)
[root@haproxy ~]# cat /proc/32335/status  | grep Threads

四. 常见问题

Q1:如何设定vim中tab键的空格个数?

解决方法:

在对应主机中,进入 vim ~/.vimrc这个文件,输入set ts=4 ai 即为设定vim中tab键的空格个数为4个

Q2:如何将文件中的内容进行注释或删除?

解决方法:

以文件/etc/haproxy/haproxy.cfg为例,通过命令"vim /etc/haproxy/haproxy.cfg"进入文件之后,

逐行注释(单行)

普通模式 下:

  • 光标移到要注释的行,按 I(大写 i)进入行首插入模式
  • 输入 #,按 Esc 退出
  • 重复操作可注释多行,或用 . 重复上一次操作
  1. 批量选中区域注释

  2. Ctrl + v 进入 可视块模式(Visual Block)

  3. 用上下方向键选中要注释的多行的行首

  4. I(大写 i)进入行首插入模式

  5. 输入 #

  6. Esc,选中的所有行首都会自动加上 #


二、全部注释(整个文件)

  1. gg 跳转到文件首行
  2. Ctrl + v 进入可视块模式
  3. G(大写 g)选中从首行到末行的所有行首
  4. I → 输入 # → 按 Esc整个文件所有行都会被加上 # 注释

三、部分删除注释(逐行或选中区域)

  1. 单行删除注释

普通模式下,光标移到 # 所在位置,按 x 删除单个 #

  1. 批量删除注释

  2. Ctrl + v 进入可视块模式

  3. 选中所有行首的 # 字符(确保只选中 #

  4. d,即可一次性删除选中区域内的所有 #

小技巧:如果 # 前面有空格,可先按 0 跳行首,再按 l 右移到 # 位置,再用可视块选中

四、全部删除注释(整个文件)

  1. gg 跳转到首行
  2. Ctrl + v 进入可视块模式
  3. G 选中所有行首的 #
  4. d 删除所有选中的 #

Q3:假设有多台haproxy主机,如何将所有主机的日志都集中在同一haproxy主机中?

五. 结论

HAProxy 就像餐厅里的 "智能领位员":

  • 背景:这家餐厅生意太好,单靠一个服务员(单台服务器)忙不过来,于是请了个专业领位(HAProxy)来帮忙。
  • 原理:客人来了,领位先问清楚想吃什么、几个人,再根据各个包间(后端服务器)的空闲情况,把客人安排到最合适的包间,要是某个包间的厨师请假了(服务器故障),领位就再也不把客人往那儿带。
  • 目的:让客人不用等太久,也不会因为某个包间忙不过来而吃不上饭,餐厅也能轻松接待更多客人。
  • 实际效果:不管是周末高峰还是平时,客人都能快速入座,体验一直很稳定,餐厅也能放心地多开几个包间(扩展服务器),不用怕客人找不到位置。

附录

HAProxy 核心配置速记

全局配置(global)- 基础环境

复制代码
global
    log /dev/log  local0  # 日志输出位置
    maxconn 10240         # 最大并发连接数
    user haproxy          # 运行用户
    group haproxy         # 运行用户组
    daemon                # 后台运行
    nbthread 4            # 工作线程数(建议等于CPU核心数)

默认配置(defaults)- 通用规则(继承给后端 / 前端)

复制代码
defaults
    log     global        # 继承global的日志配置
    mode    http          # 模式:http(七层)/tcp(四层)
    option  httplog       # 记录HTTP详细日志
    option  dontlognull   # 不记录空连接日志
    retries 3             # 后端服务器重试次数
    timeout connect 5s    # 连接后端服务器超时时间
    timeout client 30s    # 客户端连接超时时间
    timeout server 30s    # 后端服务器响应超时时间
    maxconn 2048          # 该配置组最大并发

后端服务器池(backend)- 定义真实服务节点

复制代码
backend web_server  # 后端池名称(前端需关联)
    mode http        # 匹配七层/四层模式
    balance roundrobin  # 调度算法:轮询(常用)
    # 调度算法可选:leastconn(最小连接)、source(源IP哈希-会话粘滞)
    server node1 192.168.221.10:80 check inter 2s rise 2 fall 3  # 节点1+健康检查
    server node2 192.168.221.20:80 check inter 2s rise 2 fall 3  # 节点2+健康检查
    # check:开启健康检查;inter:检查间隔;rise:恢复上线次数;fall:故障下线次数

前端监听(frontend)- 接收客户端请求并转发

复制代码
frontend web_listen
    bind 192.168.221.200:80  # 监听VIP+端口(对外提供服务的地址)
    mode http                # 匹配七层/四层模式
    default_backend web_server  # 转发到指定后端池(核心关联)

快捷整合配置(frontend+backend 合并:listen)

适合简单场景,替代单独的 frontend+backend,更简洁

复制代码
listen web_service
    bind 192.168.221.200:80
    mode http
    balance roundrobin
    server node1 192.168.221.10:80 check
    server node2 192.168.221.20:80 check
    timeout connect 5s

核心常用配置 - 按需添加

1.会话粘滞(source 哈希):同一客户端固定转发到同一后端

复制代码
balance source  # 替换backend中的roundrobin

2.四层 TCP 转发(如 443 / 数据库):仅需修改 mode 为 tcp

复制代码
mode tcp  # global/default/frontend/backend 统一改为tcp,关闭httplog

3.健康检查关闭 :后端节点后去掉check即可

4.节点权重:给性能好的节点分配更多流量(weight 默认 1)

复制代码
server node1 192.168.221.10:80 check weight 2  # 权重2,占比更高

配置后必执行命令

复制代码
haproxy -c -f /etc/haproxy/haproxy.cfg  # 检查配置语法(核心,先检查再重启)
systemctl restart haproxy  # 重启生效
systemctl enable haproxy   # 开机自启
ss -tnl | grep 80          # 验证监听端口是否开启

常用快捷键总结表

相关推荐
ZHOUPUYU5 小时前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆9 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
2601_9491465310 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天10 小时前
大模型幻觉问题
运维·服务器
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar12311 小时前
C++使用format
开发语言·c++·算法
码说AI11 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师11 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g