仓库源文站点原文


title: Haproxy简介 toc: true cover: 'https://img.paulzzh.com/touhou/random?33' date: 2023-06-27 12:06:44 categories: 技术杂谈 tags: [技术杂谈, HAProxy]

description: 本文简单介绍了 HAProxy 的使用;

本文简单介绍了 HAProxy 的使用;

<br/>

<!--more-->

Haproxy简介

HAProxy概述

HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。

HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速。最关键的是,HAProxy具备媲美商用负载均衡器的性能和稳定性。

因为HAProxy的上述优点,它当前是免费负载均衡软件的首选;

简而言之,HAProxy 是一个和 Nginx 类似的负载均衡软件;

<br/>

HAProxy核心功能

核心功能如下:

<br/>

HAProxy关键特性

性能:

稳定性:

作为建议以单进程模式运行的程序,HAProxy对稳定性的要求是十分严苛的。按照作者的说法,HAProxy在13年间从未出现过一个会导致其崩溃的BUG,HAProxy一旦成功启动,除非操作系统或硬件故障,否则就不会崩溃(我觉得可能多少还是有夸大的成分)。

在上文中提到过,HAProxy的大部分工作都是在操作系统内核完成的,所以HAProxy的稳定性主要依赖于操作系统,对sysctls参数进行精细的优化,并且确保主机有足够的内存。这样HAProxy就能够持续满负载稳定运行数年之久。

<br/>

Nginx和HAProxy对比

二者现在都能支持http/tcp/udp的负载均衡,nginx的采用类似编程语言的配置,用文档结构表示配置关系,看起来比较清晰,haproxy的配置有点像网络设备,定义和引用,有时候搞清一个逻辑需要上下来回翻看。

nginx是master-workers多进程,每个进程单线程,多核CPU能充分利用;haproxy是多线程,单进程就能实现超高性能,虽然haproxy也能多进程,但是网上资料多认为开了多进程也不能提升性能,不建议多进程跑。

即使做反向代理nginx性能略低于haproxy,但实际两者性能都超高,我在阿里云1c1g云主机上压测nginx,http性能至少能达到2000qps,而开启了https以后,性能大约550次握手/s。性能问题几乎不用担心。

HAProxy是一款专业的负载均衡软件,相比较Nginx而言,虽然Nginx在19的版本后,也支持4层的负载均衡,但是在性能和稳定性上,还是HAProxy更为市场所接受一些, nginx对web层支持的优秀,使得Nginx更适合做7层的负载均衡, HaProxy以其稳定性和可靠性,可以与硬件级的F5负载均衡设备相媲美。

各自特点如下:

nginx:

haproxy:

<br/>

安装

使用包管理工具安装:

apt install haproxy

Docker 部署:

docker run -d --restart=always --name haproxy -p 18888:8888 -v /docker-data/haproxy:/usr/local/etc/haproxy haproxy:latest

其中 8888 为自定义可以配置的 HAProxy 状态 Web 的端口;

<br/>

配置说明

关键配置详解

HAProxy的配置文件共有5个域:

<br/>

global域

global域的关键配置:

<br/>

frontend域

frontend域的关键配置:

<br/>

backend域

backend域的关键配置:

<br/>

defalut域

上文所属的frontend和backend域关键配置中,除acl、bind、http-request、http-response、use_backend外,其余的均可以配置在default域中。

default域中配置了的项目,如果在frontend或backend域中没有配置,将会使用default域中的配置。

<br/>

listen域

listen域是frontend域和backend域的组合;

因此,frontend域和backend域中所有的配置都可以配置在listen域下!

<br/>

配置案例

以下面的配置为例:

global
    log         127.0.0.1 local2 info # 日志输出配置
    maxconn     4000  # HAProxy进程同时处理的连接数,当连接数达到这一数值时,HAProxy将停止接收连接请求
    daemon             #以后台形式运行ha-proxy

defaults
    mode                    http  # 工作模式:tcp是4层,http是7层
    log                     global # 沿用global域的log配置
    retries                 3   # 健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  # 服务不可用后重定向到其他健康服务器。
    maxconn                 4000

# 监控界面配置

listen stats
  bind *:8888
  stats enable # 开启监控页面
  stats uri / # 在此frontend上开启监控页面,通过[uri]访问
  stats refresh 10s # 监控数据刷新周期
  mode http
  stats realm Global\ statistics # 统计报告格式
  stats auth admin:123456 # 登录账户信息

# 前端入口定义
frontend test
  bind :80
  default_backend webservers

# 后端服务定义
backend webservers
  balance roundrobin
  server ng nginx:80 check fall 2 rise 2 weight 1
  server httpd httpd:80 check fall 2 rise 2 weight 1

上面定义了两个转发:

从上面的例子可以看出:

<font color="#f00">**在使用 HAProxy 时,主要就是编写 listen、或者 frontend + backend 逻辑即可!**</font>

<br/>

测试案例

这里以上面的配置为例,使用 Docker 进行操作;

创建网络:

docker network create --subnet 172.40.0.0/24 --gateway 172.40.0.1 my-net

创建 nginx、httpd 服务:

docker run -d --restart=always --name nginx --ip 172.40.0.10 --network my-net nginx:latest
16:19
docker run -d --restart=always --name httpd --ip 172.40.0.12 --network my-net httpd:latest

创建 HAProxy 配置文件:

vi /docker-data/haproxy/haproxy.cfg

global
  log         127.0.0.1 local2 info
  maxconn     4000   #优先级低
  daemon               #以后台形式运行ha-proxy

defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层
    log                     global
    retries                 3   #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中

listen stats
  bind *:8888
  stats enable
  stats uri /
  stats refresh 10s
  mode http
  stats realm Global\ statistics
  stats auth admin:123456

frontend test
  bind :80
  default_backend webservers

backend webservers
  balance roundrobin
  server ng nginx:80 check fall 2 rise 2 weight 1
  server httpd httpd:80 check fall 2 rise 2 weight 1

注:上面使用容器名称代替了 IP;

创建 HAProxy 容器,并挂载配置:

docker run -d --restart=always --name haproxy  -p 18888:8888 -p 8849:80 -v /docker-data/haproxy:/usr/local/etc/haproxy --network zk-net haproxy:latest

随后访问监控界面(18888端口):

可以看到我们的配置;

访问后端服务(8849端口),随着访问,会在上面两个页面切换;

<br/>

附录

参考文章:

<br/>