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。用户名和密码:

相关推荐
奈斯先生Vector43 分钟前
从“能调用”到“可替换”:Coze 多模型 API 编排层设计指南
linux·运维·人工智能·ubuntu·平面·ios
技术不支持1 小时前
wsl 离线安装 Debian 11, Debian 12等指定版本
运维·debian
Databuff1 小时前
使用Pinpoint作分布式链路跟踪系统
运维·分布式·运维开发·开源软件
小张同学a.1 小时前
OpenStack 私有云实战 3—— Neutron 网络服务与 Dashboard 控制台部署
linux·运维·服务器·openstack
味悲1 小时前
HAProxy 负载均衡实战:从环境搭建到七层/四层/HTTPS 全解析
运维·https·负载均衡
云飞云共享云桌面1 小时前
机械设计研发成本优化:怎样用一台高性能服务器替代 10 台 SolidWorks 工作站?
大数据·运维·服务器·汽车·制造
Horn Still Sounds1 小时前
Linux系统编程进阶:进程回收、程序替换与多线程并发模型
linux·运维·服务器·c语言
挨踢诗人3 小时前
金蝶K3 WISE × 乐企平台 直连数电票集成解决方案(商贸企业开票自动化)
大数据·运维·自动化
光电的一只菜鸡10 小时前
ubuntu之坑(二十)——VMware虚拟机系统无法正常进入如何处理
linux·运维·ubuntu
青 春 记 忆10 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器