HAproxy负载均衡集群部署

HAproxy负载均衡集群部署

haproxy 负载均衡 LoadBalance LB集群,HAProxy 是一款高性能的 TCP/HTTP 负载均衡器和代理服务器。它广泛应用于高可用性架构中,用于分发流量到多个后端服务器,从而提高系统的可靠性、可用性和性能。

官网:https://www.haproxy.org/

常用的负载均衡:

dns 轮询解析

优点: dns轮询的配置是比较方便的,如果网络扩增,新增的Web服务器只要增加一个公网IP即可。

缺点: 如果某台服务器宕机或更改ip地址,DNS服务器是无法自动获知,仍旧会将访问分配到此服务器或更新前的ip地址。修改DNS记录全部生效一般要1-3小时,甚至更久。超出管理员的管理范围。会出现间歇的问题;如果几台Web服务器之间的硬件配置不同,导致能够承受的压力也是不同的,但是DNS轮询解析目前不能很好的按权重进行分配。

nginx | apache

应用层负载均衡 http ftp mail

在nginx从1.9.0后引入模块ngx_stream_core_module,从此可以支持tcp负载均衡。默认该模块是没有编译的,需要用到编译需添加--with-stream配置参数

负载均衡集群:

四层:lvs, nginx(stream),haproxy(mode tcp)

七层:http: nginx(http, ngx_http_upstream_module), haproxy(mode http)

HAProxy核心工作模式

HAProxy 主要支持两种工作模式:

  • 四层负载均衡 (Layer 4):基于 IP 和端口进行转发。性能极高,适用于 TCP 协议(如数据库、SSH、普通 TCP 服务)。
  • 七层负载均衡 (Layer 7):基于 HTTP 头部、URL、Cookie 等内容进行转发。功能更丰富,适用于 Web 服务。

HAProxy 常用负载均衡算法

算法名称 描述 适用场景 特点
roundrobin 轮询算法 后端服务器性能相近,请求处理时间大致相同 默认算法,支持动态权重调整
static-rr 静态轮询算法 需要严格固定权重比例的场景 性能略优,不支持动态权重调整
leastconn 最少连接数算法 后端性能差异大,或请求处理时间长短不一 防止某台服务器过载,适合长连接
first 第一个可用算法 希望充分利用某几台高性能服务器,其余备用 可能导致负载不均,减少活跃服务器数量
source 源地址哈希算法 需要会话保持,且客户端 IP 相对固定 同一客户端总是访问同一后端
uri URI 哈希算法 缓存服务器集群 确保同一资源总是被请求到同一台服务器
url_param URL 参数哈希算法 需要根据特定业务参数(如用户 ID)进行会话保持 灵活性高,依赖 URL 结构
hdr HTTP 头哈希算法 需要根据 Cookie 或自定义 Header 进行分发 常用于基于 Cookie 的会话保持
random 随机算法 测试环境或对负载分布要求不严格 分布均匀性不如轮询,实现简单

HAProxy 源码部署

  • 安装源码编译所需要的依赖包

    powershell 复制代码
    [root@centos-manager ~]# yum -y install gcc systemd-devel openssl*
  • 创建一个haproxy的用户

    不允许该用户登录系统且不创建家目录,仅使用该用户编译haproxy

    powershell 复制代码
    [root@centos-manager ~]# useradd haproxy -s /sbin/nologin -M
  • 上传源码安装包并解压

    powershell 复制代码
    [root@centos-manager opt]# tar -zxvf haproxy-3.4-dev6.tar.gz
    [root@centos-manager opt]# cd haproxy-3.4-dev6/
    [root@centos-manager haproxy-3.4-dev6]# ls
    addons  BRANCHES     CHANGELOG     dev  examples  INSTALL  MAINTAINERS  README.md  scripts  SUBVERS VERDATE   admin   BSDmakefile  CONTRIBUTING  doc  include   LICENSE  Makefile     reg-tests  src      tests    VERSION
  • 编译haproxy

    powershell 复制代码
    # 查看操作系统的内核版本
    [root@centos-manager ~]# uname -r
    3.10.0-862.el7.x86_64
    # 开始编译
    [root@centos-manager haproxy-3.4-dev6]# make TARGET=linux3100 USE_OPENSSL=1 ADDLIB=-lz clean all
    参数 说明
    make 调用构建工具进行编译
    TARGET=linux3100 指定操作系统内核版本
    USE_OPENSSL=1 启用 OpenSSL 支持
    ADDLIB=-lz 链接 zlib 库
    clean all && make clean 清理之前的编译文件,确保环境干净
  • 安装haproxy

    powershell 复制代码
    [root@centos-manager haproxy-3.4-dev6]# make install PREFIX=/usr/local/haproxy
    [root@centos-manager sbin]# cp  -rf /usr/local/haproxy/sbin/haproxy  /usr/sbin/

    将haproxy的可执行程序复制到/usr/sbin/,确保在任何目录下都能执行haproxy的这个命令

  • 查看haproxy的版本

    powershell 复制代码
    [root@centos-manager sbin]# haproxy  -version
    HAProxy version 3.4-dev6-fcfabd0d9 2026/03/05 - https://haproxy.org/
    Status: development branch - not safe for use in production.
    Known bugs: https://github.com/haproxy/haproxy/issues?q=is:issue+is:open
    Running on: Linux 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
    
    [root@centos-manager sbin]# ldd /usr/local/haproxy/sbin/haproxy
        linux-vdso.so.1 =>  (0x00007ffdc21e6000)
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f3056745000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f30562e2000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f30560cc000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3055cfe000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f3055ab1000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f30557c8000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f30555c4000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f30553a9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f30551a5000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f30569b7000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f3054f96000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f3054d92000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3054b78000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f305495c000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3054735000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f30544d3000)

    使用ldd查看一下是否存在ssl的链接库文件,如果存在的话可以支持ssl集群的负载均衡

  • 创建haproxy的配置文件

    powershell 复制代码
    [root@centos-manager sbin]# mkdir /etc/haproxy
    [root@centos-manager sbin]# touch  /etc/haproxy/haproxy.cfg

    /etc/haproxy 是haproxy默认的主配置文件路径

HAProxy 配置文件

再haproxy.cfg 配置文件中添加以下配置模板,后端服务器IP可以按实际应用IP进行修改。

powershell 复制代码
# ==================== 全局配置区域 ====================
global
    log         127.0.0.1 local2 info          # 日志配置:发送到本地 syslog,设施 local2,级别 info
    chroot      /usr/local/haproxy             # 将 HAProxy 进程锁定在该目录,增强安全性
    pidfile     /usr/local/haproxy/haproxy.pid # PID 文件路径,用于进程管理
    maxconn     455350                         # 全局最大并发连接数
    user        haproxy                        # 以 haproxy 用户身份运行(降权)
    group       haproxy                        # 以 haproxy 用户组身份运行
    daemon                                       # 以守护进程模式后台运行

# ==================== 默认配置区域 ====================
defaults
    mode               http                    # 默认工作模式:HTTP 层代理(支持 7 层功能)
    log                global                  # 继承 global 中定义的日志配置
    option             httplog                 # 启用 HTTP 详细日志格式(记录请求方法、URL、状态码等)
    timeout connect    10s                     # 后端服务器连接超时时间
    timeout client     30s                     # 客户端空闲超时时间(无数据传输)
    timeout server     30s                     # 后端服务器响应超时时间

# ==================== 前端配置:接收客户端请求 ====================
frontend http-in
    bind *:80                                  # 监听所有网卡的 80 端口
    default_backend    backend_servers         # 默认转发到名为 backend_servers 的后端组
    option             forwardfor              # 添加 X-Forwarded-For 头,传递客户端真实 IP
    option             httpclose               # 每次请求后主动关闭与客户端的 HTTP 连接(保持短连接)

# ==================== 后端配置:真实服务器池 ====================
backend backend_servers
    balance            roundrobin              # 负载均衡算法:轮询(按顺序分发请求)
    # 后端服务器定义格式:server <名称> <IP:端口> <参数>
    server web1 192.168.1.17:80 cookie 1 check inter 5000 fall 3 rise 2 weight 1
        # cookie 1: 为该服务器设置 cookie 标识,用于会话保持
        # check: 启用健康检查
        # inter 5000: 健康检查间隔 5000 毫秒(5 秒)
        # fall 3: 连续 3 次检查失败则标记为 down
        # rise 2: 连续 2 次检查成功则标记为 up
        # weight 1: 权重值,影响轮询时的分发比例
    server web2 192.168.1.18:80 cookie 2 check inter 5000 fall 3 rise 2 weight 1

# ==================== 监控统计页面配置 ====================
listen stats    
    mode http                                # 使用 HTTP 模式提供统计页面
    bind *:10000                             # 监听 10000 端口
    stats enable                             # 启用统计功能
    stats uri /haproxy                       # 访问路径:http://<IP>:10000/haproxy
    stats realm HAProxy\ Statistics          # HTTP 认证领域名称(空格需转义)
    stats auth admin:123.com                 # 基本认证账号密码(格式:用户名:密码)

检查配置文件语法:haproxy -c -f /etc/haproxy/haproxy.cfg

启动HAProxy

haproxy 的安装包中自带了启动脚本haproxy.init,将该启动脚本复制到/etc/init.d目录中并赋予执行权限即可。

powershell 复制代码
[root@centos-manager ~]# cp /opt/haproxy-3.4-dev6/examples/haproxy.init  /etc/init.d/haproxy
[root@centos-manager ~]# chmod +x  /etc/init.d/haproxy
[root@centos-manager ~]# service  haproxy  start
Starting haproxy (via systemctl):                          [  确定  ]

查看haproxy启动状态

powershell 复制代码
[root@centos-manager ~]# ps -ef |  grep -v "grep"| grep haproxy
haproxy   29374      1  0 17:18 ?        00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
[root@centos-manager ~]# ss -luntp | grep 80
tcp    LISTEN     0      128       *:80                    *:*                   users:(("haproxy",pid=29374,fd=4))

测试

通过配置haproxy的配置文件可以看到,当前的haproxy一共有两台后端服务器,133和134的80端口。这里需要提前的两台后端服务器中安装一个nginx,并配置80端口访问时的网页。

测试的时候只需要访问 haproxy负载均衡服务器的80端口,就可以负载到两台后端服务器的80端口的服务。

当前负载配置架构图

Haproxy 状态监控

Haproxy 提供了状态监控页面,可以查看后端服务器的请求、响应数量以及状态。访问url:http://IP地址:10000/haproxy。用户名和密码:

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质12 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务