集万千优点于一身的Haproxy集群,你还不了解?

一、HAProxy介绍

HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计,目前最新TLS版本为2.8左右。

HAProxy是可提供高可用性(需要keepalive)、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HProxy非常适用于并发大(并发达1w以上) web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上

Haproxy有社区版和收费版

支持功能

  • TCP 和 HTTP反向代理

  • SSL/TSL服务器

  • 可以针对HTTP请求添加cookie,进行路由后端服务器

  • 可平衡负载至后端服务器,并支持持久连接,支持长连接

  • 支持所有主服务器故障切换至备用服务器 keepalive

  • 支持专用端口实现监控服务

  • 支持停止接受新连接请求,而不影响现有连接

  • 可以在双向添加,修改或删除HTTP报文首部字段

  • 响应报文压缩

  • 支持基于pattern实现连接请求的访问控制

  • 通过特定的URI(url)为授权用户提供详细的状态信息

二、 HAProxy的主要特性

  1. 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;

  2. 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;

  3. 支持多达8种负载均衡算法,同时也支持会话保持;

  4. 支持虚拟机主机功能,从而实现web负载均衡更加灵活;

  5. 支持连接拒绝、全透明代理等独特的功能;

  6. 拥有强大的ACL支持,用于访问控制; 

  7. 其独特的弹性二x树数据结构,使数据结构的复杂性上升到了0(1),即数据的查寻速度不会随着数据条日的增加而速度有所下降;·支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成;

  8. 支持TCP加速,零复制功能(零拷贝技术),类似于mmap机制;nginx中sendfile用的就是零拷贝

  9. 支持响应池(response buffering) ;

  10. 支持RDP协议;

  11. 基于源的粘性,类似nginx的ip hash功能(保持会话),把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;·更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息;

  12. 详细的健康状态检测web接口中有关于对上游服务器的健康检测状态,并提供了一定的管理功能;

  13. 基于流量的健康评估机制;

  14. 基于http认证;

  15. 基于命令行的管理接口;

  16. 日志分析器,可对日志进行分析

三、HAProxy负载均衡有如下8种:

静态调度算法:不管后端服务器,按照调度器的算法进行分配

动态调度算法:会考虑后端服务器的负载情况

官方文档:http://cbonte.github.io/haproxy-dconv/2.4/configuration.html#4-balance

1) roundrobin,表示简单的轮询 rr

2) static-rr,表示根据权重

3)leastconn,表示最少连接者先处理

4) source,表示根据请求源IP

5) uri,表示根据请求的URI,做cdn需使用;

6) url param,表示根据请求的URl参数' balance url param’requires an URL parameter name

7) hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

8) rdp-cookie (name),表示根据据cookie(name)来锁定并哈希每一次TCP请求

四、 LVS、Nginx、HAproxy的区别

  1. IVS基于Linux操作系统实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;

  2. LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;

  3. LVS因为工作在TCP模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URI等多种状态检测方式;

  4. HAProxy功能强大,但整体性能低于4层模式的IVS负载均衡。

  5. Ngrinx主要用于web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好

五、安装haproxy

5.1 yum 安装

CentOS 7 的默认的base仓库中包含haproxy的安装包文件,但是版本比较旧,是1.5.18的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版本

[root@zzzcentos1 ~]#rpm -q haproxy
未安装软件包 haproxy 
[root@zzzcentos1 ~]#yum install haproxy -y
[root@zzzcentos1 ~]#haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>

[root@zzzcentos1 ~]#yum info haproxy      #查看软件包信息和常用软件包
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.bupt.edu.cn
 * epel: mirror-nrt.yuki.net.uk
 * extras: mirrors.bupt.edu.cn
 * updates: mirrors.bupt.edu.cn
已安装的软件包
名称    :haproxy
架构    :x86_64
版本    :1.5.18
发布    :9.el7_9.1
大小    :2.6 M
源    :installed
来自源:updates
简介    : TCP/HTTP proxy and load balancer for high availability environments
网址    :http://www.haproxy.org/
协议    : GPLv2+
描述    : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
         : availability environments. Indeed, it can:
         :  - route HTTP requests depending on statically assigned cookies
         :  - spread load among several servers while assuring server persistence
         :    through the use of HTTP cookies
         :  - switch to backup servers in the event a main server fails
         :  - accept connections to special ports dedicated to service monitoring
         :  - stop accepting connections without breaking existing ones
         :  - add, modify, and delete HTTP headers in both directions
         :  - block requests matching particular patterns
         :  - report detailed status to authenticated users from a URI
         :    intercepted by the application

[root@zzzcentos1 ~]#

5.2 第三方 rpm   -ivh 安装包

官方没有提供rpm相关的包,可以通过第三方仓库的rpm包

从第三方网站下载rpm包:https://pkgs.org/download/haproxy

基于互联网第三方仓库在线安装

[root@localhost ~]#mkdir /data
[root@localhost ~]#cd /data
[root@localhost data]#ls
[root@localhost data]#rz -E
rz waiting to receive.
[root@localhost data]#rz -E
rz waiting to receive.
[root@localhost data]#ls
rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm  rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm
[root@localhost data]#yum install rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm -y
[root@localhost data]#rpm -qa|grep haproxy
rh-haproxy18-runtime-3.1-2.el7.x86_64
rh-haproxy18-haproxy-1.8.24-3.el7.x86_64
[root@localhost data]#systemctl start rh-haproxy18-haproxy.service 
[root@localhost data]#systemctl status rh-haproxy18-haproxy.service
● rh-haproxy18-haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/rh-haproxy18-haproxy.service; disabled; vendor preset: disabled)
   Active: active (running) since 五 2024-03-08 14:49:29 CST; 56s ago
  Process: 1960 ExecStartPre=/opt/rh/rh-haproxy18/root/usr/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 1965 (haproxy)
   CGroup: /system.slice/rh-haproxy18-haproxy.service
           ├─1965 /opt/rh/rh-haproxy18/root/usr/sbin/haproxy -Ws -f /etc/opt/rh/rh-haproxy18/haproxy/hapr...
           └─1967 /opt/rh/rh-haproxy18/root/usr/sbin/haproxy -Ws -f /etc/opt/rh/rh-haproxy18/haproxy/hapr...

3月 08 14:49:29 localhost.localdomain systemd[1]: Starting HAProxy Load Balancer...
3月 08 14:49:29 localhost.localdomain systemd[1]: Started HAProxy Load Balancer.
[root@localhost data]#

第三方yum仓库

[root@localhost ~]#rpm -q haproxy
未安装软件包 haproxy 
[root@localhost ~]#yum install centos-release-scl-rh -y
[root@localhost ~]#yum install rh-haproxy18-haproxy -y

以上安装方式了解了解,如果你要使用haproxy,最好还是用编译安装

5.3 编译安装

5.3.1 解决lua环境

HAProxy 支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 官网:www.lua.org

Lua 应用场景

  • 游戏开发

  • 独立应用脚本

  • Web 应用脚本

  • 扩展和数据库插件,如MySQL Proxy

  • 安全系统,如入侵检测系统

由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,过程如下:

https://www.lua.org/download.html  #lua官网

[root@localhost ~]#mkdir /data/
[root@localhost ~]#cd /data/
[root@localhost data]#ls
[root@localhost data]#lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
[root@localhost data]#curl -L -R -O https://www.lua.org/ftp/lua-5.4.6.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  354k  100  354k    0     0   2651      0  0:02:17  0:02:17 --:--:--  4868
[root@localhost data]#tar zxf lua-5.4.6.tar.gz
[root@localhost data]#cd lua-5.4.6/
[root@localhost lua-5.4.6]#make all
make[1]: 进入目录“/data/lua-5.4.6/src”
Guessing Linux
make[2]: 进入目录“/data/lua-5.4.6/src”
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
make[3]: 进入目录“/data/lua-5.4.6/src”
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX    -c -o lapi.o lapi.c
make[3]: gcc:命令未找到
make[3]: *** [lapi.o] 错误 127
make[3]: 离开目录“/data/lua-5.4.6/src”
make[2]: *** [linux-noreadline] 错误 2
make[2]: 离开目录“/data/lua-5.4.6/src”
make[1]: *** [guess] 错误 2
make[1]: 离开目录“/data/lua-5.4.6/src”
make: *** [guess] 错误 2
[root@localhost lua-5.4.6]#yum -y install gcc openssl-devel pcre-devel systemd-devel
[root@localhost lua-5.4.6]#ls
doc  Makefile  README  src
[root@localhost lua-5.4.6]#cd /data/
[root@localhost data]#ls
lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]#

5.3.2编译安装 haproxy

[root@localhost data]#ln -s lua-5.4.6 lua
[root@localhost data]#ls
lua  lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]#rz -E
rz waiting to receive.
[root@localhost data]#ls
haproxy-2.4.25.tar.gz  lua  lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]#tar xf haproxy-2.4.25.tar.gz 
[root@localhost data]#cd haproxy-2.4.25/
[root@localhost haproxy-2.4.25]#ls
addons    CHANGELOG     doc       INSTALL      Makefile   ROADMAP  SUBVERS  VERSION
admin     CONTRIBUTING  examples  LICENSE      README     scripts  tests
BRANCHES  dev           include   MAINTAINERS  reg-tests  src      VERDATE
[root@localhost haproxy-2.4.25]#cat INSTALL
[root@localhost haproxy-2.4.25]#make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/  LUA_LIB=/data/lua/src/
Makefile:631: *** unable to automatically detect the Lua library name, you can enforce its name with LUA_LIB_NAME=<name> (where <name> can be lua5.4, lua54, lua, ...)。 停止。
[root@localhost haproxy-2.4.25]#systemctl stop firewalld
[root@localhost haproxy-2.4.25]#setenforce 0
[root@localhost data]#cd lua-5.4.6/
[root@localhost lua-5.4.6]#ls
doc  Makefile  README  src
[root@localhost lua-5.4.6]#make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/  LUA_LIB=/data/lua/src/
[root@localhost lua-5.4.6]#cd /data/
[root@localhost data]#ls
haproxy-2.4.25  haproxy-2.4.25.tar.gz  lua  lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]#cd haproxy-2.4.25/
[root@localhost haproxy-2.4.25]#make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/  LUA_LIB=/data/lua/src/
[root@localhost haproxy-2.4.25]#make install PREFIX=/apps/haproxy
[root@localhost haproxy-2.4.25]#ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
[root@localhost haproxy-2.4.25]#haproxy -v
HAProxy version 2.4.25-6cfe787 2023/12/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.25.html
Running on: Linux 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64
[root@localhost haproxy-2.4.25]#tee /usr/lib/systemd/system/haproxy.service  <<eof

[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target


eof
[root@localhost haproxy-2.4.25]#mkdir /etc/haproxy
[root@localhost haproxy-2.4.25]#vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info

defaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000ms

listen stats
 mode http
 bind 0.0.0.0:9999
 stats enable
 log global
 stats uri     /haproxy-status
 stats auth    haadmin:123456

listen  web_port
 bind 0.0.0.0:8899
 mode http
 log global
 server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
[root@localhost haproxy-2.4.25]#mkdir  /var/lib/haproxy    #pid 文件路径
[root@localhost haproxy-2.4.25]#useradd -r -s /sbin/nologin  haproxy
[root@localhost haproxy-2.4.25]#systemctl enable --now haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.
[root@localhost haproxy-2.4.25]#systemctl start haproxy
[root@localhost haproxy-2.4.25]#systemctl status haproxy

下载包

①解压

make clean
#清除之前编译过程中产生的目标文件和临时文件,确保从一个干净的状态开始新的编译过程。
 
make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1
 
-j $(nproc) 
#使用系统的逻辑处理器数量同时进行编译,以加快编译速度。
 
TARGET=linux-glibc 
#指定目标平台为基于glibc的Linux系统。
 
USE_OPENSSL=1 
#启用OpenSSL库支持,使得软件可以利用OpenSSL提供的加密和安全功能。
 
USE_LUA=1 
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。
 
USE_PCRE=1 
#启用PCRE(Perl Compatible Regular Expressions)库支持,提供强大的正则表达式处理能力。
 
USE_SYSTEMD=1
#启用Systemd支持,使软件能够更好地与Systemd初始化系统集成,例如注册systemd服务等。
 
sudo make install
#完成编译后,使用管理员权限执行此命令将编译好的软件安装到系统预设的安装路径下。
②编译安装注意路径

make ARCH=x86_64
#指定要构建的目标处理器架构为x86_64,即适用于64位Intel/AMD处理器的版本。
 
TARGET=linux-glibc
#设置目标平台为基于glibc的Linux系统,glibc是Linux系统中最常用的C语言标准库实现。
 
USE_PCRE=1
#启用PCRE支持,这将允许软件使用复杂的正则表达式进行匹配和处理。
 
USE_OPENSSL=1
#启用OpenSSL支持,提供加密算法、SSL/TLS协议等功能。
 
USE_ZLIB=1
#启用Zlib支持,用于数据压缩和解压缩功能。
 
USE_SYSTEMD=1
#启用Systemd支持
 
USE_LUA=1
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。
 
LUA_INC=/usr/local/lua/src/
#指定Lua头文件目录,编译时需要用到这些头文件来链接到Lua库。  
 
LUA_LIB=/usr/local/lua/src/
#指定Lua库文件目录,编译时会链接到这个目录下的库文件以支持Lua功能
③指明安装路径,做软连接,使haproxy命令可以补全

④交给systemd管理

需要在/usr/lib/systemd/system/目录下建立管理文件,交给systemd管理

Description=HAProxy Load Balancer
#这一行定义了服务的简要描述,说明该服务是用于提供负载均衡功能的HAProxy
After=syslog.target network.target
#表示此服务在syslog日志系统和网络服务完全启动之后开始启动。
 
[Service]   #服务部分包含了与服务运行相关的各种设置。
 
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
#指定服务启动前执行haproxy命令。表示启动HAProxy前检查配置文件/etc/haproxy/haproxy.cfg 
#是否有效,-c表示仅检查配置文件,-q表示静默模式,不输出多余信息。
#该文件需要手动建立并配置信息。  
'具体信息在下一目录介绍'
 
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
#执行haproxy命令,并指定配置文件路径为 /etc/haproxy/haproxy.cfg,
#-Ws:表示以守护进程模式运行并打开Unix套接字以便进行管理操作,
#同时将PID写到/var/lib/haproxy/haproxy.pid 文件中。该文件也需要手动创建
 
ExecReload=/bin/kill -USR2 $MAINPID
#设置当服务收到reload信号时需要执行的操作,这里是发送USR2信号给主进程($MAINPID),
#使得haproxy能够平滑重载配置文件而无需停止服务。
 
LimitNOFILE=100000
#服务的最大打开文件数量限制为100000
 
[Install]
#安装部分定义了如何将此服务与系统的启动目标关联
 
WantedBy=multi-user.target
#表明该服务应随多用户目标启动,即在系统进入多用户模式时自动启动haproxy服务
⑤建立检测文件,并手写配置服务相关信息

创建检测目录/etc/haproxy
创建pid号存放目录,/var/lib/haproxy/启动服务后会自动生成haproxy.pid文件
建立检测文件,并配置服务相关信息

六、配置文件详解

官方地址配置文件官方帮助文档

http://cbonte.github.io/haproxy-dconv/
http://cbonte.github.io/haproxy-dconv/2.4/configuration.html
https://www.haproxy.org/download/2.5/doc/configuration.txt

HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分

①global:全局配置段 进程及安全配置相关的参数、性能调整相关参数、Debug参数

②proxies:代理配置段 

defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用

6.1  global配置

官方文档:http://cbonte.github.io/haproxy-dconv/2.4/configuration.html#3

global
#全局配置
maxconn 100000
#最大连接数
chroot /apps/haproxy
#锁定运行目录,类似于ftp中的禁锢
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#Socket文件 进程间通信
uid 99
#运行haproxy用户身份
gid 99
#运行haproxy用户身份
daemon
#后台运行
#nbproc 4
#开启的haproxy work 进程数,默认进程数是一个
#nbthread  1    #和多进程 nbproc配置互斥(版本有关,CentOS8的haproxy1.8无此问题),指定每个haproxy进程开启的线程数,默认为每个进程一个线程
#如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务Apr  714:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both.
#cpu-map 1 0
#绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
#cpu-map 2 1
##绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU
#cpu-map 3 2
#cpu-map 4 3
#CPU的亲缘性  绑定cpu   可以通过ps axo  pid,cmd,psr,pid |grep haproxy查看cpu亲缘性状态
#maxsslconn  n
#每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
#maxconnrate n
#每个进程每秒创建的最大连接数量
#spread-checks n
#后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile /var/lib/haproxy/haproxy.pid
#pid运行路径
log 127.0.0.1 local3 info
#日志级别
 
defaults
#默认模块
option http-keep-alive
#可以和http  Keepalive进行搭配使用   模式为http(7层代理http,4层代理tcp)
option  forwardfor
#可以IP透传
#option  httplog	   	#日志类别为http日志格式		 	
#option  dontlognull	#不记录健康检查日志信息
#retries 3           #检查节点服务器失败次数,连续达到3次,则反馈不可用 
#redispatch			#当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 100000
#最大连接数,此处的数值不能大于全局里的数值
mode http
#模式 http
timeout connect 300000ms
#设置连接超时时间,默认单位是毫秒
timeout client  300000ms
#设置客户端超时时间,默认单位是毫秒
timeout server  300000ms
#设置服务器超时时间,默认单位是毫秒
 
listen stats
 #状态页
 mode http
 #模式http
 bind 0.0.0.0:9999
 #绑定任意地址的9999端口
 stats enable
 #开启
 log global
 #引入global定义的日志格式
 stats uri     /haproxy-status
 #状态页位置
 stats auth    haadmin:123456
 #用户为haadmin 密码为123456
 
listen  web_port
 bind 0.0.0.0:8899
 mode http
 log global
 server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
 #后端真实服务器            检查健康性       延迟等待3000毫秒  失败两次  五次之后重连
 
 
 
defaults [<name>]
#默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>
#前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>
#后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen   <name>
#将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
 
 
 
 
使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用
#官网业务访问入口
listen  webcluster 0.0.0.0:80
        option httpchk GET /test.html
        balance roundrobin
        server  inst1 192.168.246.8:80 check inter 2000 fall 3
        server  inst2 192.168.246.9:80 check inter 2000 fall 3

服务启动以后,可以看到默认开启一个主进程,带一个工作进程以及三个线程

6.1.1 指定进程线程个数

进程与线程会有冲突

nbproc    n     #开启的haproxy work 进程数,默认进程数是一个
#nbthread  1    #和多进程 nbproc配置互斥(版本有关,CentOS8的haproxy1.8无此问题),指定每个haproxy进程开启的线程数,默认为每个进程一个线程
#如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务Apr  714:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both.

可以根据cpu个数来决定开机时启动的work进程数量:在全局配置中添加nbproc参数

服务启动以后,可以看到默认开启一个主进程,带一个工作进程以及三个线程

6.1.2 cpu亲缘性

CPU亲缘性(CPU Affinity)是指将进程或线程绑定到特定的CPU核心上运行的技术。通过设置CPU亲缘性,可以避免进程在不同核心之间频繁迁移,从而减少缓存失效,提高系统的整体性能和效率

nbproc  2
cpu-map 1  0     #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 2  1     #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1  号CPU
                
ps axo  pid,cmd,psr  |grep haproxy
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3

6.1.3状态页

①写配置文件

②去浏览器访问:

6.1.4 多进程和线程

6.1. 5 日志

HAproxy本身不记录客户端的访问日志,haproxy服务没有单独的日志管理文件,它的默认日志文件位置在/var/log/messages,此外为减少服务器负载,一般生产中HAProxy不记录日志.也可以配置HAProxy利用rsyslog服务记录日志到指定日志文件中。

①修改配置文件

解释:

$ModLoad imudp: 这是在rsyslog配置文件中加载UDP模块的命令。imudp表示输入模块(Input Module)用于处理UDP协议的数据。通过此命令,系统将能够监听并接收通过UDP端口发送过来的日志消息。

$UDPServerRun 514: 这个指令告诉rsyslog服务在指定的UDP端口(这里为514)上启动一个UDP服务器以监听日志事件。默认情况下,许多网络设备和服务会使用514端口通过UDP协议发送syslog日志信息给日志收集服务器

②检测:

把haproxy日志放在远端服务器

由于haproxy服务只能做代理服务,对资源消耗较大,建议将日志文件放在远程的日志文件服务器上,专门建立日志文件查看

①本机服务器配置

②7-2远端服务器配置

③去浏览器访问状态页,刷新:

不建议在本机开启日志功能

6.2 Proxies配置

官方文档:HAProxy version 2.1.12 - Configuration Manual

defaults [<name>] #默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>   #前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>   #后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen  <name>   #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用

注意:name字段只能使用大小写字母,数字,‘-’(dash),'_‘(underscore),'.' (dot)和 ':'(colon),并且严格区分大小

6.2.1 Proxies配置-defaults

option redispatch    			#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose   			#当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive 			#开启与客户端的会话保持
option forwardfor     			#透传客户端真实IP至后端web服务器
mode http|tcp 					#设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s 	#session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s 			#客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s 			#客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
timeout client 600s 			#设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check   5s   			#对后端服务器的默认检测超时时间
default-server inter 1000 weight 3   #指定后端服务器的默认设置

6.2.2Proxies配置-listen 简化配置

使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用

#官网业务访问入口
listen WEB_PORT_80    #业务名称
   bind 10.0.0.7:80   #ip加端口
   mode http          #默认 可以不写
   option forwardfor  #透传客户端真实IP至后端web服务器
   server web1   10.0.0.17:8080   check inter 3000 fall 3 rise 5
   server web2   10.0.0.27:8080   check inter 3000 fall 3 rise 5

6.2.3 Proxies配置-frontend

bind: #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于
listen字段中

#格式:
bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1


backlog <backlog> #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注
意:不支持backend

6.2.4Proxies配置-backend

定义一组后端服务器,backend服务器将被frontend进行调用。

注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动

mode http|tcp     #指定负载协议类型,和对应的frontend必须一致
option #配置选项
server   #定义后端real server,必须指定IP和端口
6.2.4.1server 配置
#针对一个server配置
check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没
有其它配置也可以启用检查功能
 #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定
端口才能实现健康性检查
 addr <IP>   #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
 port <num> #指定的健康状态监测端口
 inter <num> #健康状态检查间隔时间,默认2000 ms
 fall <num>   #后端服务器从线上转为线下的检查的连续失效次数,默认为3
 rise <num>   #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连
接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似
Sorry Server
disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,
状态为深黄色,优雅下线,不再接受新用户的请求
redirect prefix http://www.baidu.com/ #将请求临时(302)重定向至其它URL,只适用于
http模式
redir http://www.baidu.com       #将请求临时(302)重定向至其它URL,只适用于
http模式
maxconn <maxconn> #当前后端server的最大并发连接数

七、实验1:haproxy  

Centos7-1作为haproxy服务器;

Centos7-2作为提供Web服务器的后端真实服务器1

Centos7-3作为提供Web服务的后端真实服务器2

Centos7-4作为客户端

①7-1haproxy服务器配置

②7-2后端服务器配置

③7-3后端服务器配置

④7-4客户端检测

⑤模拟服务器宕机,可见没有后端健康性检查,如下图

实验2:开启健康性检测

(1)开启健康性检测有报错,不要慌

(2)需要手动在backend后端语句块中添加check开启

(3)再去访问检测:就会自动过滤不在线的后端服务器

原理:通过抓包看到实际上是haproxy三次握手没有成功,来进行的健康检查

80端口是haproxy代为监听,如果有Web服务的请求将转到后端真实服务器,不然就会丢包

实验3:haproxy代理设置,用前后端的方法设置

去客户端检测:

use_backend  ky22_web别忘记开启哦

①写配置文件

frontend  ky22
     bind 192.168.246.7:80
     use_backend  ky22_web
backend  ky22_web
server rs1  192.168.246.8:80 check
server rs2  192.168.246.9:80 check

②再去客户机7-4检测:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/442393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么做不限扫码次数的文件活码?文件可长期扫描展现下载

如何制作不限扫码次数的文件二维码呢&#xff1f;将文件转二维码后分享给其他人&#xff0c;是现在非常方便的一种文件传输方式。很多小伙伴在制作文件二维码的时候&#xff0c;比较担心的一个问题&#xff0c;就是二维码可以扫码的次数&#xff0c;担心达不到自己预期的效果&a…

C++ 打印输出十六进制数 指定占位符前面填充0

C 打印十六进制数据&#xff0c;指定数据长度&#xff0c;前面不够时&#xff0c;补充0. 代码如下&#xff1a; #include <iostream> #include <iomanip> #include <cmath>using namespace std;int main() {unsigned int id 0xc01;unsigned int testCaseId…

Docker部署SimpleMindMap结合内网穿透实现公网访问本地思维导图

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

【C++】inline内联函数 VS #define宏

文章目录 1. 内联概念2. 内联特点3. 宏的优缺点 1. 内联概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;无函数建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 在release模式下&#xff0c;默认展开生效。 在…

时序报告Report_timing_summary之一步精通配置选项使用

目录 一、前言 二、配置选项概览图 三、配置选项 3.1 Options 3.1.1 report 3.1.2 path limits 3.1.3 path display 3.2 Advanced 3.2.1 report 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、工程示例 4.1 工程设计代码 4.2 约束文件 4.3 Option…

Stable Diffusion WebUI 中英文双语插件(sd-webui-bilingual-localization)并解决了不生效的情况

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍一款中英文对照插件 sd-webui-bilingual-localization&#xff0c;该插件可以让你的 Stable Diffusion WebUI 界面同时显示中文和英文&#xff0c;让我…

【C++】手撕string类(超实用!)

前言 一、标准库中的string类 1.1 string类介绍 1.2 string的常用接口 1.2.1 常用的构造函数 1.2.2 容量操作接口 &#xff08;1&#xff09;size &#xff08;2&#xff09;capacity &#xff08;3&#xff09;empty &#xff08;4&#xff09;clear &#xff08…

stm32学习记录-5.2PWM输出控制sg90舵机角度

源码连接&#xff1a;https://gitee.com/HL12334/stm32-learning-code 前提知识&#xff1a; 1.定时器中断 1.关键概念 1.1pwm输出 1.常用术语 OC&#xff08;output compare&#xff09;输出比较CNT&#xff08;counter&#xff09;&#xff0c;定时器中用于计数的寄存器…

【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

力扣每日刷题 一、977. 有序数组的平方1.1题目1.2、解题思路1.3、代码实现——C 二、76. 最小覆盖子串2.1&#xff1a;题目2.2、解题思路2.3&#xff1a;代码实现——c2.4&#xff1a;易错点 一、977. 有序数组的平方 1.1题目 [题目链接]( 1.2、解题思路 题型&#xff1a;双…

数据中台驱动:高效交付之道

如何保证数据中台高效交付&#xff1f; 在数据行业中&#xff0c;项目交付难题尤为突出&#xff0c;尤其在数据中台领域。数据中台项目交付面临诸多挑战&#xff0c;若不妥善解决&#xff0c;将会降低服务质量&#xff0c;影响企业数字化建设的顺利开展&#xff0c;甚至影响项目…

21 卷积层里的多输入多输出通道【李沐动手学深度学习v2课程笔记】

目录 1. 多输入输出通道&相应代码实现 1.1 多输入 1.2 多输出 1.3 1x1 卷积层 1.4 小结 1. 多输入输出通道&相应代码实现 1.1 多输入 为了加深理解&#xff0c;我们实现一下多输入通道互相关运算。 简而言之&#xff0c;我们所做的就是对每个通道执行互相关操作&a…

电磁兼容(EMC):一文读懂压敏电阻选型

目录 1 MOV 外观结构 2 MOV 常见品牌 3 MOV命名规则 4 MOV 工作原理 5 MOV基本特点 6 MOV典型应用 7 MOV电气参数说明 8 MOV 选型注意事项 8.1 压敏电压V1mA 8.2 峰值脉冲电流 IP&#xff0c;钳位电压VC 8.3 漏电流IR 8.4 结电容 9 有绝缘耐压测试要求时选型 10 …

预处理详解

目录 一&#xff1a;预定义符号 二&#xff1a;#define定义常量 三&#xff1a;#define定义宏 四&#xff1a;带有副作用的宏定义 五&#xff1a;宏的替换规则 六&#xff1a;宏函数的对比 七&#xff1a;# 和 ## 7.1 #运算 7.2 ##预算符 八&#xff1a;命名约定 九&…

mac电脑版MATLAB R2023b for Mac中文激活版

MATLAB R2023b for Mac&#xff1a;科学计算的终极工具 软件下载&#xff1a;MATLAB R2023b for Mac中文激活版下载 &#x1f52c; 探索科学&#xff0c;无限可能 MATLAB R2023b for Mac&#xff0c;助您深入挖掘科学计算的奥秘。从数据分析、算法设计到可视化展示&#xff0c;…

物联网导论

物联网起源 物联网&#xff1a;是一个基于互联网、传统电信网等信息承载体&#xff0c;让所有能够被独立寻址的普通物理对象实现互联互通的网络。它具有普通对象设备化、自治终端互联化和普适服务智能化三个重要特征。 按照规定的协议&#xff0c;将具有感知、通信、计算等功…

T2 小美的平衡矩阵(25分) - 美团编程题 题解

考试平台&#xff1a; 牛客网 题目类型&#xff1a; 30道单选题&#xff08;60分&#xff09; 2 道编程题 &#xff08;15分 25分&#xff09; 考试时间&#xff1a; 2024-03-09 &#xff08;两小时&#xff09; 题目描述 小美拿到了一个n*n的矩阵&#xff0c;其中每个元素是…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…

【JavaEE进阶】Spring中事务的实现

文章目录 &#x1f343;前言&#x1f334;事务简介&#x1f6a9; 什么是事务?&#x1f6a9;为什么需要事务?&#x1f6a9;事务的操作 &#x1f340;Spring 中事务的实现&#x1f6a9;Spring 编程式事务&#x1f6a9;Spring声明式事务Transactional&#x1f6a9;Transactional…

Using WebView from more than one process

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题过程源码追踪…

Pinctrl子系统_04_Pinctrl子系统主要数据结构

引言 本节说明Pinctrl子系统中主要的数据结构&#xff0c;对这些数据结构有所了解&#xff0c;也就是对Pinctrl子系统有所了解了。 前面说过&#xff0c;要使用Pinctrl子系统&#xff0c;就需要去配置设备树。 以内核面向对象的思想&#xff0c;设备树可以分为两部分&#x…