haproxy基础

目录

[1 HAProxy介绍](#1 HAProxy介绍)

[1.1 版本对比](#1.1 版本对比)

[1.2 HAProxy功能](#1.2 HAProxy功能)

[2 参数介绍与实践](#2 参数介绍与实践)

[2.1 global参数说明](#2.1 global参数说明)

[2.2 真实代码格式实例](#2.2 真实代码格式实例)

[2.3 常用全局参数](#2.3 常用全局参数)

[2.3.1 nbproc -- 开启几个进程](#2.3.1 nbproc -- 开启几个进程)

[2.3.2 cpu-map(CUP绑定)](#2.3.2 cpu-map(CUP绑定))

[2.3.3 nbthread 2 --开启2个线程](#2.3.3 nbthread 2 --开启2个线程)

[3 Proxies配置](#3 Proxies配置)

[3.1 Proxies配置-defaults](#3.1 Proxies配置-defaults)

[3.2 Proxies配置-frontend(和backend组合使用)](#3.2 Proxies配置-frontend(和backend组合使用))

[3.3 Proxies配置-backend(与frontend混合使用)](#3.3 Proxies配置-backend(与frontend混合使用))

[3.4 frontend+backend配置实例](#3.4 frontend+backend配置实例)

[3.5 Proxies配置-listen替代 frontend+backend](#3.5 Proxies配置-listen替代 frontend+backend)

[3.6 使用子配置文件保存配置](#3.6 使用子配置文件保存配置)

[4 Socat 工具](#4 Socat 工具)

[4.1 下载工具](#4.1 下载工具)

[4.2 Socat 工具的使用](#4.2 Socat 工具的使用)

[4.2.1 查看帮助](#4.2.1 查看帮助)

[4.2.2 套接字文件添加管理员权限](#4.2.2 套接字文件添加管理员权限)

[4.2.3 常用实例](#4.2.3 常用实例)

[4.2.4 套接字文件配合CPU核心分批次管理](#4.2.4 套接字文件配合CPU核心分批次管理)


1 HAProxy介绍

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

历史版本:

历史版本更新功能:1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2-dev

1.8:多线程,HTTP/2缓存......

1.7:服务器动态配置,多类型证书......

1.6:DNS解析支持,HTTP连接多路复用......

1.5:开始支持SSL,IPV6,会话保持......

企业版网站:[HAProxy Technologies | World's Fastest Load Balancer]

社区版网站:[http://www.haproxy.org/]

1.1 版本对比

功能 社区版 企业版
高级HTTP / TCP负载平衡和持久性 支持 支持
高级健康检查 支持 支持
应用程序加速 支持 支持
高级安全特性 支持 支持
高级管理 支持 支持
HAProxy Dev Branch新功能 支持
24*7 支持服务 支持
实时仪表盘 支持
VRRP和Route Health Injection HA工具 支持
ACL,映射和TLS票证密钥同步 支持
基于应用程序的高级DDoS和Bot保护(自动保护) 支持
Bot(机器人)监测 支持
Web应用防火墙 支持
HTTP协议验证 支持
实时集群追踪 支持

1.2 HAProxy功能

2 参数介绍与实践

2.1 global参数说明

参数 类型 作用
chroot 全局 锁定运行目录
deamon 全局 以守护进程运行
user, group, uid, gid 全局 运行haproxy的用户身份
stats socket 全局 套接字文件
nbproc N (和nbproc互斥) 全局 开启的haproxy worker 进程数,默认进程数是一个
nbthread 1 全局 指定每个haproxy进程开启的线程数,默认认为每个进程一个线程
cpu-map 0 1 全局 绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 1 1 全局 绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号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.2 真实代码格式实例

bash 复制代码
global
    # 将工作目录锁定在/var/haproxy
    chroot /var/haproxy
    
    # 以守护进程运行
    daemon
    
    # 以haproxy用户和组的身份运行
    user haproxy
    group haproxy
    
    # 打开了一个套接字文件,允许管理员通过socket与Haproxy交互
    stats socket /run/haproxy/admin.sock mode 660 level admin
    
    # 开启了两个worker进程
    nbproc 2
    
    # 让每个Haproxy进程开启两个线程
    nbthread 2
    
    # 将第一个worker进程绑定了到0号CPU,第二个worker进程绑定了到1号CPU
    cpu-map 0 0
    cpu-map 1 1
    
    # 设置每个Haproxy进程的最大并发连接数为4000
    maxconn 4000
    
    # 设置每个Haproxy进程SSL最大连接数为4000
    maxsslconn 4000
    
    # 设置每个进程每秒创建的最大连接数量为1000
    maxconnrate 1000
    
    # 设置后端server状态check随机提前或延迟百分比时间为2%
    spread-checks 2
    
    # 指定了pid文件路径
    pidfile /var/run/haproxy.pid
    
    # 定义全局的syslog服务器,日志服务器需要开启UDP协议,最多可以定义两个
    log 127.0.0.1 local2 info

2.3 常用全局参数

2.3.1 nbproc -- 开启几个进程

查看此时haproxy的进程数

bash 复制代码
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(2307)---haproxy(2309)---{haproxy}(2310)

打开配置文件,增加以下行

bash 复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 

重启服务再次查看进程,由原先的一个进程变成了两个

bash 复制代码
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(2375)-+-haproxy(2377)
           |               `-haproxy(2378)

但这样子设置会照成一个不好的效果,会使得CPU抖动

CPU抖动:

CPU抖动是指CPU在短时间内频繁地在不同任务间切换,导致性能下降的现象。这种现象通常发生在多核处理器上,因为操作系统会在不同的核心上调度不同的任务,如果任务之间的切换过于频繁,就会出现CPU抖动。

2.3.2 cpu-map(CUP绑定)

所以为了解决这一问题,就得使用到一个新的参数cpu-map(CUP绑定)

2.3.3 nbthread 2 --开启2个线程

注意:多进程与多线程不能同时开多个,不然会报错

查看系统日志文件,说明如果使用多个线程就不能使用多个进程

注释

重启服务

bash 复制代码
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(3388)---haproxy(3390)---{haproxy}(3391)



[root@haproxy ~]# cat /proc/3390/status | grep -i thread
Threads:        2
Speculation_Store_Bypass:       thread vulnerable

3 Proxies配置

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

3.1Proxies配置-defaults

参数 功能
option abortonclose 当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option redispatch 当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option http-keep-alive 开启与客户端的会话保持
option forwardfor 透传客户端真实IP至后端web服务器(在apache配置文件中加入:%{X-Forwarded-For}i后在webserer中看日志即可看到地址透传信息)
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 指定后端服务器的默认设置

3.2 Proxies配置-frontend**(和backend组合使用)**

frontend 配置参数:

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

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

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

生产示例:

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

3.3 Proxies配置-backend**(与frontend混合使用)**

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

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

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

server 配置

bash 复制代码
check               #对指定real进行健康状态检查,如果不加此设置,默认不开启检查
    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的最大并发连接数
backlog <backlog> #当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend

3.4 frontend+backend配置实例

bash 复制代码
frontend webcluster
   bind *:80
   mode http
   use_backend webcluster-host

backend webcluster-host
   # 使用 roundrobin 动态算法
   balance roundrobin
   server web1 192.168.239.10:80 check inter 3000 fall 3 rise 5
   server web2 192.168.239.20:80 check inter 3000 fall 3 rise 5

# check 关键字表示启用健康检查。
# inter 3000 表示健康检查的间隔时间为 3 秒钟。
# fall 3 表示连续失败 3 次之后,HAProxy 认为这个服务器不可用。
# rise 5 表示连续成功 5 次之后,HAProxy 认为这个服务器可用

3.5 Proxies配置-listen替代frontend+backend

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

bash 复制代码
#官网业务访问入口
listen webcluster
    bind *:80
    mode http
    balance roundrobin
    # inter 健康检查的时间 每隔2毫秒进行一次健康检查
    # fall 如果连续三次健康检查都失败,那么HAProxy会认为该服务器不可用.
    # rise 如果连续五次健康检查都成功,那么HAProxy会认为该服务器可用。
    server web1 192.168.239.10:80 check inter 2 fall 3 rise 5  weight 1
    server web2 192.168.239.20:80 check inter 2 fall 3 rise 5  weight 1

3.6 使用子配置文件保存配置

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

bash 复制代码
#创建子配置文件,注意:必须为cfg后缀
[root@node1 ~]# vim   /etc/haproxy/conf.d/test.cfg
listen  WEB_PORT_80
    bind *:80
    mode http
    balance roundrobin
    server web1  192.168.239.14:80   check inter 3000 fall 3 rise 5
    server web2  192.168.239.15:80   check inter 3000 fall 3 rise 5

在使用yum安装的版本中服务脚本中是默认加载子配置文件的,不需要在主配置文件里增加配置

4 Socat 工具

Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。可以利用 socat工具对服务器动态权重和其它状态的调整

4.1 下载工具

bash 复制代码
[root@haproxy ~]# yum -y install socat

4.2 Socat 工具的使用

4.2.1 查看帮助

bash 复制代码
# 查看帮助

[root@haproxy ~]# socat -h
# stdio 是 socat 的一个选项,它表示标准输入/输出。在这个命令中,stdio 用来接收来自 echo 的输入,并将其传递给 /var/lib/haproxy/stats
[root@haproxy ~]# echo help | socat stdio /var/lib/haproxy/stats

4.2.2 套接字文件添加管理员权限

打开haproxy的配置文件

4.2.3 常用实例

bash 复制代码
[root@haproxy ~]# echo show servers state | socat - /var/lib/haproxy/stats
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
2 webcluster 1 web1 192.168.239.10 2 0 1 1 171 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
2 webcluster 2 web2 192.168.239.20 2 0 1 1 172 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
2 webcluster 3 web3_sorry 192.168.239.100 2 0 1 1 15732 1 0 2 0 0 0 0 - 8080 - 0 0 - - 0


[root@haproxy ~]# echo get weight webcluster/web1 | socat - /var/lib/haproxy/stats
1 (initial 1)

# 修改weight,注意只针对单进程有效
[root@haproxy ~]# echo set weight webcluster/web1 2 | socat stdio /var/lib/haproxy/stats

[root@haproxy ~]# echo get weight webcluster/web1 | socat - /var/lib/haproxy/stats
2 (initial 1)

# 将后端服务器禁用,注意只针对单进程有效
[root@haproxy ~]# echo disable server webcluster/web1 | socat stdio /var/lib/haproxy/stats

# 将后端服务器启用
[root@haproxy ~]# echo enable server webcluster/web1 | socat stdio /var/lib/haproxy/stats

# 将后端服务器软下线,即weight设为0
[root@haproxy ~]# echo set weight webcluster/web1 0 | socat - /var/lib/haproxy/stats
[root@client ~]# while true;do curl 192.168.239.100; sleep 0.1; done
this is web2
this is web2
this is web2
this is web2
this is web2

# 如果静态算法,如:static-rr,可以更改weight为0或1,但不支持动态更改weight为其它值,否则会提示下面信息
[root@haproxy ~]# echo set weight webcluster/web1 0 | socat - /var/lib/haproxy/stats
[root@haproxy ~]# echo set weight webcluster/web1 1 | socat - /var/lib/haproxy/stats
[root@haproxy ~]# echo set weight webcluster/web1 2 | socat - /var/lib/haproxy/stats
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.

4.2.4 套接字文件配合CPU核心分批次管理

设置第一个套接字文件由第一个进程管,第二个进程管第二个套接字

bash 复制代码
# nbproc 2:这行配置指定了 HAProxy 进程的数量,这里是 2 个进程。
#
# cpu-map 1 0 cpu-map 2 1:这两行配置指定了每个进程应该绑定到哪个 CPU 核心上。1 0 表示第一个进程
# 绑定到第 0 个核心,2 1 表示第二个进程绑定到第 1 个核心>。这意味着 HAProxy 将创建两个进程,其中一
# 个进程将被绑定到 CPU 的第一个核心,另一个进程将被绑定到 CPU 的第二个核心。这样做的目的是为了更好地
# 利用多核处>理器,提高性能。
#
# stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1:
# 这行配置打开了一个名为 /var/lib/haproxy/stats1 的套接字文件,用于收集 HAProxy 的统计信息。
# mode 600 表示权限为 600,level admin 表示管理员级别,process 1 表示仅限于第一个进程。这意味着
# 只有拥有足够权限的用户才能访问这个套接字,而且>只能访问第一个进程的信息。
#
# stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2:这行配置同上,但仅限于
# 第二个进程。这意味着只有拥有足够权限的用户才能访问这个套接字,而且只能访问第二个进程的信息。
#
# 总的来说,这段代码的作用是启动两个 HAProxy 进程并将它们绑定到不同的 CPU 核心,同时开放了两个套接
# 字供管理员获取这两个进程的统计信息。这样做的好处是可>以更有效地监控和管理 HAProxy,在多核环境中充
# 分利用硬件资源

# 这样每个进程就会有单独的sock文件来进行单独管理

[root@haproxy ~]# ll /var/lib/haproxy/
总用量 0
srw-------. 1 root root 0  8月 10 00:24 stats
srw-------. 1 root root 0  8月 10 00:33 stats1
srw-------. 1 root root 0  8月 10 00:33 stats2
相关推荐
疯狂飙车的蜗牛1 分钟前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
恩爸编程1 小时前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
Michaelwubo2 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
远游客07132 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<2 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟2 小时前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun3 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
LIKEYYLL4 小时前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu
云云3215 小时前
搭建云手机平台的技术要求?
服务器·线性代数·安全·智能手机·矩阵