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

相关推荐
路由侠内网穿透2 小时前
本地部署开源工作空间工具 AFFiNE 并实现外部访问
运维·服务器·数据库·物联网·开源
zzzsde2 小时前
【Linux】Ext文件系统(1)
linux·运维·服务器
爱学习的小囧2 小时前
ESXi 8.0 无法选择分区方式 小白级详细解决办法
运维·服务器·网络·虚拟化·esxi8.0
F1FJJ2 小时前
什么是 Shield CLI?视频讲解:一条命令,可浏览器远程访问一切内部服务(RDP/VNC/SSH/数据库等)
运维·网络·数据库·网络协议·ssh
WordPress学习笔记2 小时前
wordpress网站上传不了图片可能是文件夹的权限的原因
运维·wordpress·文件夹权限·uploads·wordpress上传错误
倔强的胖蚂蚁2 小时前
openEuler 24.03 LTS SP3 motd标志区使用教程
运维·云原生
皮卡蛋炒饭.3 小时前
Ext系列文件系统
运维
齐齐大魔王3 小时前
linux-核心工具
linux·运维·服务器
醇氧3 小时前
Linux 系统的启动过程
linux·运维·服务器