HAProxy--高性能反向代理

news2024/9/19 13:55:26

文章目录

  • Web架构
  • 负载均衡介绍
    • 为什么使用负载均衡
    • 负载均衡类型
  • HAProxy简介
    • 应用场景
    • HAProxy是什么
    • HAProxy功能
  • 脚本安装
  • HAProxy基础配置
    • global
      • 多进程和线程
      • HAProxy日志配置项
    • Proxies配置
      • -listen
      • -frontend
      • -backend
        • server配置
      • frontend+backend配置实例
      • 子配置文件
  • HAProxy调度算法
    • 静态算法
    • 动态算法
      • roundrobin
      • leastconn
      • random

Web架构

在这里插入图片描述

负载均衡介绍

负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。

阿里云SLB介绍:https://developer.aliyun.com/article/1803

为什么使用负载均衡

1.增加业务并发访问及处理能力  -->   解决单服务器瓶颈问题
2.节约公网IP地址            -->   降低IT支出成本
3.隐藏内部服务器IP          -->   提高内部服务器安全性
4.Web服务器的动态水平扩展    -->   对用户无感知
5.负载均衡配置简单          -->   固定格式的配置文件
6.负载均衡功能丰富          -->   支持四层和七层,支持动态下线主机
7.负载均衡性能较强          -->    并发数万甚至百万

负载均衡类型

四层:

LVS:      Linux virtual server
Nginx:    1.9版之后
HAProxy:  High Availability Proxy

七层:

HAProxy
Nginx

硬件:
F5 :https://www.f5.com.cn/
Netscaler :https://www.netscaler.com/
Array :https://www.arraynetworks.com.cn/
深信服: https://www.sangfor.com.cn/
北京灵州 :http://www.lingzhou.com.cn/cpzx/llfzjh/

HAProxy简介

HAProxy的定位和LVS类似,仅仅作为一个反向代理,没有其他功能,是一个专业级的反向代理,往往作为企业服务的总入口。

Nginx作为web服务器,其性能还是很优秀的,但是作为反向代理性能还是不如LVS,LVS是工作在Linux内核中的,LVS的并发可以达到百万级以上。

LVS虽然性能好,但是没有Nginx功能丰富,Nginx可以提供四层和七层的反向代理,且还具备健康检查功能。

HAProxy作为反向代理介于LVS和Nginx之间,性能比Nginx好,功能比LVS更丰富。HAProxy会作为企业项目中一个总的入口。

应用场景

随着公司业务的发展,公司负载均衡服务既有四层的,又有七层的,通过LVS实现四层和Nginx实现七层的负载均衡对机器资源消耗比较大,并且管理复杂度提升,运维总监要求,目前需要对前端负载均衡服务进行一定的优化和复用,能否用一种服务同既能实现七层负载均衡,又能实现四层负载均衡,并且性能高效,配置管理容易,而且还是开源。

在企业生产环境中,每天会有很多的需求变更,比如增加服务器、新业务上线、url路由修改、域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首选指标。在企业中,稳定压倒一切,与其搞得很复杂,经常出问题,不如做的简单和稳定。在企业中,90%以上的故障,来源于需求变更。可能是程序bug,也可能是人为故障,也可能是架构设计问题等。前端负载均衡设备为重中之重,在软件选型上一定充分考虑,能满足业务的前提下,尽可能降低复杂度,提高易维护性。

HAProxy是什么

社区版:https://www.haproxy.org/
企业版:https://www.haproxy.com/

在这里插入图片描述
这里HAProxy吹了一个牛,“offering high availability”提供高可用,其实它本身不具备高可用,需要借助别的服务,像Keepalived…
在这里插入图片描述

HAProxy功能

在这里插入图片描述

支持功能
  1.TCP和HTTP反向代理
  2.SSL/TSL服务器
  3.可以针对HTTP请求添加cookie,进行路由后端服务器
  4.可平衡负载至后端服务器,并支持持久连接
  5.支持所有主服务器故障切换至备用服务器
  6.支持专用端口实现监控服务
  7.支持停止接受新连接请求,而不影响现有连接
  8.可以在双向添加,修改或删除HTTP报文首部响应报文压缩
  9.支持基于pattern实现连接请求的访问控制
  10.通过特定的URI为授权用户提供详细的状态信息
  11.支持http反向代理
  12.支持动态程序的反向代理
  13.支持基于数据库的反向代理

在这里插入图片描述

脚本安装

#!/bin/bash
#
#******************************************************************************
#Author:            wangxiaochun
#Date:              2022-07-03
#FileName:          install_haproxy.sh
#URL:               www.wangxiaochun.com
#Description:       install haproxy for centos 7/8 & ubuntu 18.04/20.04
#Copyright (C):     2022 All rights reserved
#******************************************************************************

HAPROXY_VERSION=2.6.1
HAPROXY_FILE=haproxy-${HAPROXY_VERSION}.tar.gz
#HAPROXY_FILE=haproxy-2.2.12.tar.gz
LUA_VERSION=5.4.4
LUA_FILE=lua-${LUA_VERSION}.tar.gz
#LUA_FILE=lua-5.4.3.tar.gz
HAPROXY_INSTALL_DIR=/apps/haproxy

SRC_DIR=/usr/local/src
CWD=`pwd`
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
LOCAL_IP=$(hostname -I|awk '{print $1}')

STATS_AUTH_USER=admin
STATS_AUTH_PASSWORD=123456

VIP=192.168.10.100
MASTER1=192.168.10.101
MASTER2=192.168.10.102
MASTER3=192.168.10.103

. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


check_file (){
    if [ ! -e ${LUA_FILE} ];then
        color "缺少${LUA_FILE}文件!" 1
        exit
    elif [ ! -e ${HAPROXY_FILE} ];then
        color "缺少${HAPROXY_FILE}文件!" 1
        exit
    else
        color "相关文件已准备!" 0
    fi
}

install_haproxy(){
    if [ $ID = "centos" -o $ID = "rocky" ];then
        yum -y install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel libtermcap-devel ncurses-devel libevent-devel readline-devel 
    elif [ $ID = "ubuntu" ];then
        apt update 
        apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev  libreadline-dev libsystemd-dev 
    else
        color "不支持此操作系统!" 1
    fi
    [ $? -eq 0 ] ||  { color 'HAPROXY 启动失败,退出!' 1; exit; }
    tar xf ${LUA_FILE} -C ${SRC_DIR}
    LUA_DIR=${LUA_FILE%.tar*}
    cd ${SRC_DIR}/${LUA_DIR}
    make all test
    cd ${CWD}
    tar xf ${HAPROXY_FILE} -C ${SRC_DIR}
    HAPROXY_DIR=${HAPROXY_FILE%.tar*}
    cd ${SRC_DIR}/${HAPROXY_DIR}
    make -j ${CPUS} ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=${SRC_DIR}/${LUA_DIR}/src/ LUA_LIB=${SRC_DIR}/${LUA_DIR}/src/ PREFIX=${HAPROXY_INSTALL_DIR}
    make install PREFIX=${HAPROXY_INSTALL_DIR}
    [ $? -eq 0 ] && color "HAPROXY编译安装成功" 0 ||  { color "HAPROXY编译安装失败,退出!" 1;exit; }
    
    [ -L /usr/sbin/haproxy ] || ln -s ${HAPROXY_INSTALL_DIR}/sbin/haproxy /usr/sbin/ &> /dev/null
    [ -d /etc/haproxy ] || mkdir /etc/haproxy &> /dev/null  
    [ -d /var/lib/haproxy/ ] || mkdir -p /var/lib/haproxy/ &> /dev/null
    cat > /etc/haproxy/haproxy.cfg <<-EOF
global
maxconn 100000
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon

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 ${STATS_AUTH_USER}:${STATS_AUTH_PASSWORD}

#listen kubernetes-6443
#    bind ${VIP}:6443
#    mode tcp
#    log global
#    server ${MASTER1} ${MASTER1}:6443 check inter 3000 fall 2 rise 5
#    server ${MASTER2} ${MASTER2}:6443 check inter 3000 fall 2 rise 5
#    server ${MASTER3} ${MASTER2}:6443 check inter 3000 fall 2 rise 5

EOF
    #echo "PATH=${HAPROXY_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/haproxy.sh
	groupadd -g 99 haproxy
	useradd -u 99 -g haproxy -d /var/lib/haproxy -M -r -s /sbin/nologin haproxy
	cat > /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

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now haproxy 
    systemctl is-active haproxy &> /dev/null && color 'HAPROXY安装完成!' 0 ||  { color 'HAPROXY 启动失败,退出!' 1; exit; }
    echo "-------------------------------------------------------------------"
    echo -e "请访问链接: \E[32;1mhttp://${LOCAL_IP}:9999/haproxy-status\E[0m"
    echo -e "用户和密码: \E[32;1m${STATS_AUTH_USER}/${STATS_AUTH_PASSWORD}\E[0m" 
}

main(){
    check_file
    install_haproxy
}

main

HAProxy基础配置

官方文档:
https://docs.haproxy.org/
https://docs.haproxy.org/3.0/configuration.html

在这里插入图片描述
HAProxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分

global

HAProxy 的全局配置主要用于管理进程行为、日志、安全性以及性能调优等。在配置 HAProxy 时,全局设置是整个系统稳定、高效运行的基础。

官方帮助手册:https://docs.haproxy.org/3.0/configuration.html#3

global:全局配置段
  1.进程及安全配置相关的参数
  2.性能调整相关参数
  3.Debug参数

vim /etc/haproxy/haproxy.cfg

global
    log        127.0.0.1 local2
    chroot     /var/lib/haproxy
    pidfile    /var/run/haproxy.pid
    maxconn    4000
    user       haproxy
    group      haproxy
    daemon
    
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    
    #utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    

配置参数说明

chroot   #锁定运行目录,黑客攻破了这个目录化,它也只能在这个目录下操作,不会以此为跳板操作别的目录

deamon   #以守护进程运行

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1  #socket文件,并可以通过此文件管理

user, group,uid,gid     #运行haproxy的用户身份

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

#cpu-map 1 0    绑定haproxy worker进程至指定CPU,将第1个worker进程绑定至0号CPU
#cpu-map 2 1    绑定haproxy worker进程至指定CPU,将第2个worker进程绑定至1号CPU

cpu-map auto:1/1-8 0-7   #haproxy2.4中启用nbthreads,在global配置中添加此选项,可以进行线程和CPU的绑定,nbproc选项2.5版本中将会删除,每个进程中1-8个线程分别绑定0-7号CPU

maxconn n        #每个haproxy进程的最大并发连接数
maxsslconn n     #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate n    #每个进程每秒创建的最大连接数量

spread-checks n   #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile           #指定pid文件路径
log 127.0.0.1 local2 info  #定义全局的syslog服务器:日志服务器需要开启UDP协议,最多可以定义两个

多进程和线程

从2.5以上新版中用多线程代替多worker进程

范例:多进程和socket文件

[root@haproxy ~]#vim /etc/ haproxy / haproxy .cfggloba1
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy1.sock mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy2.sock mode 600 level admin process 2
stats socket /var/lib/haproxy/haproxy3.sock mode 600 level admin process 3
stats socket /var/lib/haproxy/haproxy4.sock mode 600 level admin process 4
uid 99
gid 99
daemon
nbproc 4

在这里插入图片描述

[root@haproxy ~]#ps axo pid,cmd,psr|grep haproxy
1933 /usr/sbin/haproxy -ws -f /e    5
1935 /usr/sbin/haproxy -ws -f /e    0
1936 /usr/sbin/haproxy -ws -f /e    1
1937 /usr/sbin/haproxy -ws -f /e    2
1938 /usr/sbin/haproxy -ws -f /e    3
1965 grep --color=auto haproxy      1

范例:多线程和CPU绑定

#范例1
[root@haproxy ~]#vim /etc/haproxy/haproxy. cfg
global
    cpu-map auto: 1/1-8 0-7
    
#语法检查
[root@haproxy ~]#haproxy  -c  -f   /etc/haproxy/haproxy.cfg

[root@haproxy ~]#systemctl restart haproxy.service
[root@haproxy ~]#pidstat -p 915 -t
Linux 4.15.0-112-generic (haproxy. wang.org)   saturday,september 04,2021
_x86_64_     (8 CPU)

07:46:56 CST  UID  TGID  TID  ‰usr %system  %guest  %wait  %CPU  CPUCommand
07:46:56 CST  999   915    -  0.00    0.00   0.00    0.00  0.00  0 
haproxy
07∶46:56 CST  999    -   915  0.00    0.00   0.00    0.00  0.00  0
|__haproxy
07∶46:56 CST  999    -   916  0.00    0.00   0.00    0.00  0.00  1
|__haproxy
07∶46:56 CST  999    -   917  0.00    0.00   0.00    0.00  0.00  2
|__haproxy
07∶46:56 CST  999    -   918  0.00    0.00   0.00    0.00  0.00  3
|__haproxy
07∶46:56 CST  999    -   919  0.00    0.00   0.00    0.00  0.00  4
|__haproxy
07∶46:56 CST  999    -   920  0.00    0.00   0.00    0.00  0.00  5
|__haproxy
07∶46:56 CST  999    -   921  0.00    0.00   0.00    0.00  0.00  6
|__haproxy
07∶46:56 CST  999    -   922  0.00    0.00   0.00    0.00  0.00  7
|__haproxy
#范例2
[root@haproxy ~]#vim /etc/haproxy/haproxy.cfg
cpu-map auto:1/1-4 0-3

[root@haproxy ~]#ps axo pid,cmd,psr -L |grep haproxy
   1437 /usr/sbin/haproxy -ws -f /e  4
   1439 /usr/sbin/haproxy -ws -f /e  0
   1439 /usr/sbin/haproxy -ws -f /e  1
   1439 /usr/sbin/haproxy -ws -f /e  2
   1439 /usr/sbin/haproxy -ws -f /e  3

HAProxy日志配置项

HAproxy本身不记录客户端的访问日志.此外为减少服务器负载,一般生产中HAProxy不记录日志.也可以配置HAProxy利用rsyslog服务记录日志到指定日志文件中

HAProxy配置

#在global配置项定义:
log 127.0.0.1 local{1-7] info #基于syslog记录日志到指定设备,级别有(err、warning、info、 debug)

listen web_port
  bind 127.0.0.1:80
  mode http
  log global      #开启当前web_port的日志功能,默认不记录日志
  server web1 127.0.0.1:8080  check inter 3000 fall 2 rise 5
  
#systemctl restart haproxy

Rsyslog配置

vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
......
local3.*    /var/log/haproxy.log
......

#systemctl restart rsyslog

验证HAProxy日志

#tail -f /var/ log/haproxy. 1og
Aug 14 20:21:06 localhost haproxy[18253]: connect from 192.168.0.1:3050 to10.0.0.7:80 (web_host/HTTP)
Aug 14 20:21:06 localhost haproxy[18253]: connect from 192.168.0.1:3051 to10.o.0.7:80 (web_host/HTTP)
Aug 14 20:21:06 localhost haproxy[18253]: connect from 192.168.0.1:3050 to10.0.0.7:80 (web_host/HTTP)

Proxies配置

官方帮助手册:https://docs.haproxy.org/3.0/configuration.html#4

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),并且严格区分大小写
在这里插入图片描述

-listen

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

#官网业务访问入口
listen WEB_PORT_80
    bind 192.168.10.100:80
    mode http
    option forwardfor
    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
    
#检查语法
[root@ubuntu2004 ~]#haproxy -c -f /etc/haproxy/haproxy.cfg
configuration file is valid

-frontend

frontend 配置参数:

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

#格式:
bind [<address>]:<port_range> [...] [param*]

#注意:如果需要绑定在非本机的IP,需要开启内核参数: net.ipv4.ip_nonlocal_bind=1

backlog <backlog>  #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend
frontend http_proxy             #监听http的多个IP的多个端口和sock文件
    bind :80,:443,:8801-8810
    bind 10.0.0.1:10080,10.0.0.1:10443
    bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
    
frontend http_https_proxy       #https监听
    bind :80
    bind :443 ssl crt /etc/haproxy/site.pem    #公钥和私钥公共文件
    
frontend http_https_proxy_explicit             #监听ipv6、ipv4和unix sock文件
    bind ipv6@:80
    bind ipv4@public_ss1:443 ssl crt /etc/haproxy/site.pem
    bind unix@ssl-frontend.sock user root mode 600 accept-proxy
    
listen external_bind_app1                      #监听file descriptor
    bind "fd@${FD_APP1]"

生产示例

frontend wang_web_port              #建议采用后面形式命名:业务-服务-端口号
    bind :80, :8080
    bind 10.0.0.7:10080, :8801-8810,10.0.0.17:9001-9010
    mode http|tcp                   #指定负载协议类型
    use_backend <backend_name>      #调用的后端服务器组名称

-backend

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

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

mode   http|tcp     #指定负载协议类型,和对应的frontend必须一致
option              #配置选项
server              #定义后端real server,必须指定IP和端口

注意: option后面加httpchk,smtpchk,mysql-check,pgsql-check,ss-hello-chk方法,可用于实现更多应用层检测功能。

server配置

针对一个后端服务器server的配置

#针对一个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           #将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
maxconn <maxconn>  #当前后端server的最大并发连接数,放在server指令后面
redir http://www.baidu.com   #将请求临时(302)重定向至其它URL,只适用于http模式,放在server指令后面

redirect配置

#注意:此指令和redir功能相似,但不属于server指令后面,是独立存放在1isten,frontend,backend语句块
redirect prefix http://www.baidu.com/    #将请求临时(302)重定向至其它URL,只适用于http模式

frontend+backend配置实例

范例1

frontend wang-test-http
  bind :80, :8080
  mode tcp
  use_backend wang-test-http-nodes
  
backend wang-test-http-nodes
  mode tcp
  default-server inter 1000 weight 6
  server web1 10.0.0.17:80 weight 2 check addr 10.0.0.117 port 8080
  server web1 10.0.0.27:80 check

范例2

#官网业务访问入口
frontend WEB_PORT_80
    bind 10.0.0.7 :80
    mode http
    use_backend web_prot_http_nodes

backend web_prot_http_nodes
    modehttp
    option forwardfor
    server 10.0.0.17 10.0.0.17:8080   check inter 3000 fall 3 rise 5
    server 10.0.0.27 10.0.0.27:8080   check inter 3000 fall 3 rise 5

子配置文件

当业务众多时,将所有配置都放在一个配置文件中,会造成维护困难。可以考虑按业务分类,将配置信息拆分,放在不同的子配置文件中,从而达到方便维护的目的。

注意:子配置文件的文件后缀必须为.cfg

#创建子配置目录
[root@centos7 ~]#mkdir /etc/haproxy/conf.d/

#添加子配置目录到unit文件中
[root@centos7 ~]#vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
#修改下面两行
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -c -q
Execstart=/usr/sbin/haproxy -ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/lib/haproxy /haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
wantedBy=multi-user.target
创建子配置文件,注意:必须为cfg后缀非.开头的配置文件
[root@centos7 ~]#vim/etc/haproxy/conf.d/test.cfg
listen WEB_PORT_80
    bind 10.0.0.7:80
    mode http
    balance roundrobin
    server web1 10.0.0.17:80   check inter 3000 fall 2 rise 5
    server web2 10.0.0.27:80   check inter 3000 fall 2 rise 5
    
[root@centos7 ~]#systemctl daemon-reload
[root@centos7 ~]#systemctl restart haproxy

HAProxy调度算法

HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

官方帮助手册:https://docs.haproxy.org/3.0/configuration.html#4.2

balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post]

静态算法

静态算法:按照事先定义好的规则轮询进行调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时动态修改权重(只能为0和1,不支持其它值)或者修改后不生效,如果需要修改只能靠重启HAProxy生效。

动态算法

动态算法:基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。

roundrobin

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法,此算法使用广泛。

listen web_host
  bind 10.0.0.7:80, :8801-8810,10.0.0.7 :9001-9010
  mode http
  log global
  balance roundrobin
  server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
  server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5

leastconn

leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接),比较适合长连接的场景使用,比如: MySQL等场景。

listen web_host
  bind 10.0.0.7:80,:8801-8810,10.0.0.7 : 9001-9010
  mode http
  log global
  balance leastconn
  server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
  server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5

random

在1.9版本开始增加random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求

listen web_host
  bind 10.0.0.7:80,:8801-8810,10.0.0.7: 9001-9010
  mode http
  log globa1
  ba1ance random
  server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
  server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SRS流媒体服务器从入门到精通(其一,环境搭建)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 一、SRS简介二、SRS的应用场景三、环境搭建…

(计算机网络)应用层

1.为什么需要应用层 应用层提供使用tcp&#xff0c;udp使用的方式 协议就是制定的规则 2.域名服务器概述 域名是唯一的 新增域名&#xff0c;大家都要修改这个文本文件&#xff0c;所以要进行集中管理这个文本文件&#xff0c;而不是使用本地的hosts文件 hosts文件在Windows系统…

智能厕所系统高科技打造公厕新生态丨深圳讯鹏科技

从人们踏入智能厕所的那一刻起&#xff0c;便能深切感受到科技的力量。智能感应门悄然无声地开启&#xff0c;仿佛在欢迎每一位使用者。这种感应门不仅方便快捷&#xff0c;更避免了传统公厕门的直接接触&#xff0c;减少了细菌交叉感染的风险。走进厕所内部&#xff0c;智能灯…

Golang | Leetcode Golang题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; func integerReplacement(n int) (ans int) {for n ! 1 {switch {case n%2 0:ansn / 2case n%4 1:ans 2n / 2case n 3:ans 2n 1default:ans 2n n/2 1}}return }

掌握Flux的各种风格表现,另外,flux也有了滑块Lora

在AIGC知识库通过#flux标签&#xff0c;汇总了下最近整理的内容&#xff0c;部分如下&#xff0c;更多可见AIGC知识库。 shadow&#xff1a; 经常在画图的时候&#xff0c;会有选择困难症&#xff0c;这下可以直接翻阅查看自己喜欢的风格&#xff0c;参考使用 ↓ Flux Style Te…

安装oh-my-zsh后报错zsh: command not found: conda问题解决

zsh: command not found: conda问题解决 一、问题介绍与环境介绍 系统为macOS Sonoma 14.5 所用终端为zsh 主要问题&#xff1a;安装了oh-my-zsh之后conda命令在终端中不可用。 二、原因分析 终端中zsh的可访问的程序一般放在/bin, /usr/bin, /usr/local/bin&#xff0c;~/bi…

快速了解高并发解决方案

对《高并发的哲学原理》的个人总结&#xff0c;原书地址如下 https://pphc.lvwenhan.com/ 本书的核心思想就是拆分&#xff0c;服务细化拆分多资源并行。 通用设计方法 例子&#xff1a;每秒100万次http请求 通过架构解决性能问题&#xff0c;在面对并发需求时&#xff…

【Python系列】JSON和JSONL简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

动手学深度学习(一)简介+预备知识+基础知识(上)

一、简介 1、机器学习 机器学习研究如何使用经验改善计算机系统的性能。 2、表征学习 表征学习是机器学习的一类&#xff0c;研究的是&#xff0c;如何自动学习出数据合适的表示方式&#xff0c;更好地由输入得到正确的输出。 3、深度学习 深度学习是具有多级表示的表征学…

SpringCloud微服务详细笔记(一):微服务介绍--微服务拆分--RestTemplate远程调用--Nacos注册中心

目录 1.认识微服务 1.1单体架构 1.2微服务 1.3SpringCloud 2.微服务拆分 2.1服务拆分原则 2.1.1什么时候拆&#xff1f; 2.1.2怎么拆&#xff1f; 2.2微服务项目结构&#xff1a; 2.3服务拆分示例&#xff1a; 2.4远程调用 2.4.1RestTemplate 2.4.2远程调用示例 …

Qt篇——Qt使用C++获取Windows电脑上所有外接设备的名称、物理端口位置等信息

我之前有发过一篇文章《Qt篇——获取Windows系统上插入的串口设备的物理序号》&#xff0c;文章中主要获取的是插入的USB串口设备的物理序号&#xff1b;而本篇文章则进行拓展&#xff0c;可以获取所有外接设备的相关信息&#xff08;比如USB摄像头、USB蓝牙、USB网卡、其它一些…

前端转鸿蒙好做吗

在科技不断发展的当下&#xff0c;许多前端开发者可能会思考一个问题&#xff1a;前端转鸿蒙好做吗? 一、前端与鸿蒙开发的差异 1. 技术栈的变化 前端开发主要涉及 HTML、CSS、JavaScript 等技术&#xff0c;而鸿蒙开发则需要掌握 Java、Kotlin、JavaScript 等语言&#xff0c…

远程存储 RDMA

什么是 RDMA RDMA&#xff08;Remote Direct Memory Access&#xff09;指的是远程直接内存访问&#xff0c;这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法。 Remote&#xff1a;数据通过网络与远程机器间进行数据传输。 Direct&#xff1a;没有内核的参与&am…

计算机毕业设计 | 基于SpringBoot的健身房管理系统(附源码)

1&#xff0c;项目背景 随着人们生活水平的提高和健康意识的增强&#xff0c;越来越多的人开始关注自己的身体健康并加入到健身行列中。然而&#xff0c;传统的健身房管理方式往往存在诸多问题&#xff0c;如会员信息管理混乱、课程安排不合理、教练资源分配不均等&#xff0c…

MaxCompute基础概论

1. 简介与背景 随着大数据技术的发展&#xff0c;企业和组织面临着处理海量数据的挑战。传统的数据存储和处理工具难以应对高并发、复杂计算以及海量数据的快速增长需求。为了解决这些问题&#xff0c;阿里云推出了 MaxCompute&#xff08;原名 ODPS&#xff09;&#xff0c;这…

超声波雪深监测站

超声波雪深监测站是一种用于测量和监测雪深的设备。它的功能和作用主要包括以下几个方面&#xff1a; 雪深测量&#xff1a;超声波雪深监测站能够通过发射超声波并接收回波的方式&#xff0c;测量雪地表面到地面之间的距离&#xff0c;从而得到雪深的数据。通过分析和处理这些数…

图像去噪的艺术:自适应中值滤波器的应用与实践

在数字图像处理的众多挑战中&#xff0c;噪声的去除是一个永恒的话题。特别是椒盐噪声&#xff0c;因其随机将像素点变为极黑或极白&#xff0c;对图像的视觉质量破坏极大。本文将通过MATLAB实现的自适应中值滤波器&#xff08;AMF&#xff09;&#xff0c;探讨其在图像去噪中的…

--- 数据结构 二叉树 --- java

树形结构 数使一个非线性结构&#xff0c;他是由n个结点组成的具有一定层次关系的集合&#xff0c;叫做树是因为他像是一颗倒挂的树&#xff0c;根在上&#xff0c;叶子在下&#xff0c;具有一些性质 1&#xff0c;有一个特殊节点叫做根节点&#xff0c;他没有钱去节点&#x…

017_Python爬虫系列_防盗链代理

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

限流,流量整形算法

写在前面 本文看下流量整形相关算法。 目前流量整形算法主要有三种&#xff0c;计数器&#xff0c;漏桶&#xff0c;令牌桶。分别看下咯&#xff01; 1&#xff1a;计数器 1.1&#xff1a;描述 单位时间内只允许指定数量的请求&#xff0c;如果是时间区间内超过指定数量&a…