haproxy分享

一、认识 HAProxy

(1)HAProxy (High Availability Proxy) 是一款由C语言编写的开源的负载均衡器和反向代理服务器,可以工作在4层和7层,广泛应用于 Web 应用的高可用性和负载均衡中。HAProxy 支持 TCP 和 HTTP 层的负载均衡,能够在大规模的 Web 服务中有效分配请求,避免单点故障,提高应用的可用性和性能。相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项更精细的控制更多的健康状态检测机制负载均衡算法

 (2) HAProxy特别适用于那些负载特大的web站点这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

(3)包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在内众多知名网站,及亚马逊网络服务系统都使用了HAProxy。

  • 官网https://www.haproxy.com

图片.png

  • 高可用性:通过健康检查自动剔除失效的后端服务器。

  • 负载均衡:支持多种负载均衡算法,如轮询、最少连接、源地址哈希等。

  • 高性能:HAProxy 能够承载数百万级的并发连接,适合大规模互联网应用。

  • 会话保持:支持多种会话保持机制,如基于客户端IP的Hash计算、基于cookie的会话保持等,确保用户请求能够被转发到正确的后端服务器上。

  • SSL终结和加速:可以在前端进行SSL终结,解密和加密SSL/TLS流量,从而减轻后端服务器的负担并提升性能。

二、HAProxy 部署

HAProxy 的部署一般分为几种种方式:二进制安装,Yum安装,或者在容器中部署(如 Docker)。以下是 HAProxy 在 Linux 服务器上的部署过程。

1. 安装 HAProxy

yum安装:

sudo yum install haproxy -y

二进制安装:

从https://www.haproxy.org/拉取安装包
tar xvf haproxy-3.1.0.tar.gz && cd haproxy-3.1.0
#安装依赖
yum install gcc make cmake glibc glibc-devel pcre pcre-devel openssl openssl-devel  -y
#编译
make TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE2=1 USE_ZLIB=1
#安装
make install PREFIX=/usr/local/haproxy

#发布PATH 默认安装到/usr/local不必不发PATH
cp haproxy  /usr/sbin  或者追加到/etc/profile

#编写Unit文件systemd管理
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
ExecStart=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -db
ExecReload=/bin/kill -USR2 $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target


#配置
# 全局设置 
    global
    log         127.0.0.1 local2    #
    pidfile     /var/run/haproxy.pid
    maxconn     500000
    user        haproxy
    group       haproxy
    daemon      #使用守护进程运行
#nbproc 6        #ha线程数
# 默认设置
defaults
    mode                    http         #L7 7层代理,能够解析应用层协议(意思是proxy会先和Client进行3次握手,获取clientIP,serverip 请求的URL,与RS建立连接,DNAT将自己的地址转换为RS的地址,RS处理请求,返回响应给proxy,proxy返回给Client,server的日志中正常能看到Client地址),除非server明确指定tcp模式
    log                     global
    option                  httplog      启用HTTP日志记录
    option                  dontlognull   不记录空连接。空连接通常不包含有用的信息。
    option http-server-close               在响应客户端后,强制服务器关闭连接.不开启长连接
    option forwardfor       except 127.0.0.0/8   在转发请求时添加X-Forwarded-For头部,但排除来自127.0.0.0/8(即本地回环地址)的请求。这有助于后端服务器识别客户端的真实IP地址  
    option                  redispatch       请求打到RS1故障时重新分发到RS?,这有助于处理服务器故障。
    retries                 3                重试连接RS3次
    timeout http-request    10s               http请求超时时间10s(一个很长的时间)内没有完成请求,那么连接会被关闭
    timeout queue           1m                请求在队列中等待被处理的最大时间为1分钟。如果队列满了或者请求在这个时间内没有被处理,它将被丢弃  
    timeout connect         10s              10s内没有连上RS则认为RS超时
    timeout client          8h               客户端连接的空闲超时时间为8小时。如果客户端在这个时间内没有发送任何数据,连接将被关闭。
    timeout server          8h               服务器连接的空闲超时时间为8小时。如果服务器在这个时间内没有发送任何数据,连接将被关闭。
    timeout http-keep-alive 10s             长连接空闲时常10s。如果在这个时间内没有新的请求,连接将被关闭。
    timeout check           10s             健康检查的超时时间为10秒,10s RS未响应,则认为RS DOWN
    maxconn                 400000          ha允许的最大请求连接数

##配置优先级高于defaults
listen tianan3
    bind *:1803
    mode   tcp
    option tcpka
    balance     roundrobin
    server tianan3 21.135.78.3:8020 check inter 3000 rise 2 maxconn 250000 fall 3

listen myapp
    bind *:6666
    mode   http
    option tcpka
    balance     roundrobin
    server myapp 10.255.0.6:8888 check inter 3000 rise 2 maxconn 250000 fall 3
 #起服务
 systemctl enable --now haproxy
 
 #本地起一个http服务用于测试
 nohup python3 -m http.server 8888 > nohup.out &
 
 curl  http://127.0.0.1:8888
 curl http://127.0.0.1:6666
  
  • ​健康检查提示后端server连接不上

图片.png

  • 测试代理端口6666

    图片.png

容器化部署:

docker run -d --name myha  haproxy:latest
#报错:
[ALERT]    (1) : config : Cannot open configuration file/directory /usr/local/etc/haproxy/haproxy.cfg : No such file or directory
#原因:
这是因为默认情况下,HAProxy 容器会尝试从该路径加载配置文件,而容器内没有默认的配置文件。

#那么

docker run -d --name myha -p proxyport:RSport  -v /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:laetst 可解决此问题。

2. 启动和配置 HAProxy

安装完成后,可以通过以下命令启动 HAProxy:

sudo systemctl start haproxy
sudo systemctl enable haproxy

HAProxy 配置文件通常位于 /etc/haproxy/haproxy.cfg,可以通过编辑这个文件来定义负载均衡规则和后端服务器配置。

三、HAProxy 配置详解

HAProxy 的配置文件由多个部分组成,包括全局设置、默认设置、前端和后端设置。以下是一个简单的配置示例:

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

# proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,为常用配置

##配置示例举例:
# 全局设置
global
    log /dev/log    local0
    maxconn 2000
    user haproxy
    group haproxy

# 默认设置
defaults
    log     global
    option  httplog
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

# 前端设置:接受客户端请求(根据URI转发代理)
frontend http_front
    bind *:80  # 监听 80 端口
    acl url_example path_beg /example
    use_backend example_backend if url_example

# 后端设置:处理转发到的请求
backend example_backend
    balance roundrobin  # 使用轮询负载均衡
    server server1 192.168.1.1:80 check
    server server2 192.168.1.2:80 check
    
#使用listen代理:
 listen tianan3
    bind *:1803
    mode   tcp
    option tcpka
    balance     roundrobin
    server tianan4 21.135.78.3:8020 check inter 3000 rise 2 maxconn 250000 fall 3
主要配置项:
  • frontend:定义客户端请求的入口。

  • backend:定义将请求转发给后端服务器的规则。

  • balance:负载均衡算法,可以是 roundrobin(轮询)、leastconn(最少连接数)等。

  • server:指定后端服务器的地址和端口。

  • acl:定义访问控制列表,可以根据请求的 URL、头部信息等条件进行转发。(补充具体的限制策略)

四、HAProxy 集群模式

HAProxy 支持集群模式,在此模式下,可以部署多个 HAProxy 实例来实现负载均衡和高可用性。集群模式通常使用共享存储或分布式配置管理工具(如 Consul 或 Etcd)来管理后端服务器的信息。

集群模式的常见配置方法:
  1. 高可用性集群:使用 keepalived 或类似工具实现 HAProxy 的主备切换,以保证主 HAProxy 实例宕机时,备份实例能够接管流量。

  2. 多节点负载均衡:将多个 HAProxy 节点配置为负载均衡入口,通过反向代理将请求均衡分发到多个后端服务器。这样可以通过水平扩展来处理更高的流量。

五、HAProxy 常用命令(基本操作)

HAProxy 提供了丰富的命令行操作和 API,用于查看状态、重新加载配置以及调整运行时参数。

常用命令:
  • 查看 HAProxy 状态

sudo systemctl status haproxy
  • 重载 HAProxy 配置

如果修改了 HAProxy 配置文件,需要重新加载配置而不重启服务:

sudo systemctl reload haproxy
  • 查看 HAProxy 进程状态

你可以使用以下命令查看 HAProxy 进程的状态,或访问 HAProxy 的统计页面。

haproxy -v
  • 查看运行时统计信息

可以通过访问 HAProxy 的 stats 页面来查看运行时的状态。例如,配置 stats 页面:

listen stats
    bind *:8080
    stats enable
    stats uri /haproxy_stats
    stats auth admin:password

然后通过浏览器访问 http://<haproxy_ip>:8080/haproxy_stats 查看统计信息。

六、HAProxy 排错

HaProxy常见错误列举

1. 配置文件语法错误
  • 错误描述:修改 HAProxy 配置文件后,尝试重新加载 HAProxy 服务时,服务无法启动,可能是因为配置文件存在语法错误。

  • 解决方法: 在重载配置之前,使用以下命令检查配置文件的正确性:

haproxy -c -f /etc/haproxy/haproxy.cfg

该命令会检查配置文件是否有语法错误,并输出详细的错误信息。通过这些信息,你可以定位并修复配置文件中的问题。

图片.png

提示优先级低的配置项将被忽略掉eg tianan3 mode是tcp  ,那么default的forwardfor是工作在http mode的,则忽略

2. 后端服务器不可达
  • 错误描述:HAProxy 正常启动,但客户端请求无法成功转发,可能是因为后端服务器不可达或未正确配置。

  • 解决方法

    • 检查后端服务器是否在线:使用 pingtelnet 等命令检查 HAProxy 能否访问后端服务器。例如,检查后端服务器端口是否开放:

telnet 192.168.1.1 80

配置健康检查:确保后端服务器配置了健康检查。如果后端服务器不可用,HAProxy 会将流量转发到其他可用的服务器。示例如下:

backend my_backend
    balance roundrobin
    server server1 192.168.1.1:80 check
    server server2 192.168.1.2:80 check
  • 查看日志:查看 HAProxy 日志(如 /var/log/haproxy.log)以获取更多信息,确认请求是否被成功转发以及是否有后端服务器出现故障。

3. HAProxy 无法绑定端口
  • 错误描述:HAProxy 启动时,显示类似 "address already in use" 的错误,表示端口被占用,无法绑定。

  • 解决方法

    • 使用 netstatss 命令查看端口是否已被其他服务占用:

netstat -tuln | grep 80
  • 如果端口已被占用,可以更改 HAProxy 配置文件中的绑定端口,或停止占用该端口的服务。

bind *:8080  # 更改为可用的端口
4. 负载均衡算法不生效
  • 错误描述:配置了负载均衡算法(如 roundrobinleastconn),但请求没有按照期望的方式分配到后端服务器。

  • 解决方法

    • 确保 balance 参数配置正确,例如:

      backend my_backend
          balance roundrobin  # 轮询算法
          server server1 192.168.1.1:80 check
          server server2 192.168.1.2:80 check
      
  • 如果负载均衡算法没有生效,可以尝试更换为其他算法,例如 leastconnsource,查看是否能够解决问题。

balance leastconn  # 使用最少连接算法
5. 请求分配到错误的后端服务器
  • 错误描述:根据请求 URL 或其他条件,流量应该被分发到不同的后端服务器,但实际上所有请求都被分发到一个服务器。

  • 解决方法

    • 使用 acluse_backend 进行条件转发,确保配置正确。例如,基于 URL 路径进行流量分发:

      frontend http_front
          bind *:80
          acl is_example path_beg /example
          use_backend example_backend if is_example
          default_backend default_backend
      
      backend example_backend
          server example_server 192.168.1.1:80 check
      
      backend default_backend
          server default_server 192.168.1.2:80 check
      
  • 如果 acluse_backend 配置不正确,可能会导致所有流量都被转发到默认的后端。确保条件判断语法无误。

6. HAProxy 性能问题(高并发情况下出现慢响应)
  • 错误描述:在高并发流量下,HAProxy 性能下降,导致请求延迟增加,甚至出现超时问题。

  • 解决方法

    • 调整 maxconn 参数:根据服务器的性能和流量需求,适当增加 maxconn(最大连接数)参数,以提高 HAProxy 处理并发请求的能力。

global
    maxconn 10000  # 提高最大连接数
  • 调整 timeout 参数:检查和调整 timeout 参数,确保请求的连接和响应时间设置合理。

defaults
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms
  • 检查硬件资源:确保服务器硬件资源足够,特别是 CPU、内存和网络带宽。如果负载过高,考虑横向扩展后端服务器,或者优化 HAProxy 配置。

7. HAProxy 日志过多或配置错误
  • 错误描述:日志文件过大或日志级别设置过高,导致日志系统负担过重。

  • 解决方法

    • 可以调整日志级别,减少不必要的日志记录。修改 global 部分的日志配置:

global
    log /dev/log    local0 info  # 设置为 'info' 或 'warning' 以减少日志量
  • 如果你不需要某些类型的日志,可以禁用一些不必要的日志记录。

HAProxy 排错通常包括以下几个方面:

  1. 日志文件:HAProxy 会生成详细的日志文件,通常在 /var/log/syslog/var/log/haproxy.log 中。通过查看日志,可以快速了解问题发生的位置。

  2. 检查配置文件:使用 haproxy -c -f /etc/haproxy/haproxy.cfg 命令来检查 HAProxy 配置文件的正确性。如果有错误,HAProxy 会输出详细的错误信息。

    图片.png

  3. 健康检查:确保 HAProxy 的健康检查功能已启用。健康检查可以确保流量只会发送到健康的后端服务器。通过配置文件中的 check 参数,可以启用健康检查。

  4. 查看状态页面:使用 HAProxy 自带的状态页面查看流量分配、后端服务器的健康状况等信息。如果流量分配不均或某个后端服务器不可用,排查这些问题。

  5. 性能调优:根据流量和硬件资源,调整 HAProxy 的性能参数,如 maxconn(最大连接数)、timeout(超时时间)等。

七、几种负载均衡器的对比

  • 负载均衡器(代理方式)比较:

• 4层代理(只理解4层协议):负载均衡设备获取客户端TCP/UDP报文中客户端ip目标地址和所要访问的服务端口,根据调度算法,修改报文中目的ip地址(将自己的ip改为real server的ip)后,将客户端的SYN请求直接转发给real server,它的三次握手与4次断开都是直接与后端服务器进行的

• 7层代理(理解7层协议): 负载均衡设备会根据真正要访问的应用层内容(如动静分离的实现)来做负载均衡,所以先与客户端建立3次握手,才能获取到客户端所要访问的应用层报文内容,然后再做转发,因其与前后端都要做3握4断,所以同配置转发效率较L4低

• nginx:可以工作在第4层和第7层。并发量高,可以根据url进行负载均衡。(对应的配置文件/usr/local/nginx/conf/nginx.conf语句)正则表达式支持的更广泛,支持健康检查和动静分离代理 。 支持算法少 效率较低

• lvs负载均衡,keepalived可完成lvs的高可靠,另keepalived有健康检查,稳定转发效率最高。运维成本高,适用于大型网站,工作在第4层。

• haproxy:不需要配vip,没有DR或NAT工作模式,可以工作在第4层和第7层。可以根据url进行负载均衡,支持有限的正则表达式。比NINGX效率高,更专业,更稳定。

正向代理是客户端代理:指客户端想要访问无法访问的网络资源,在客户端上部署代理服务器(软件),此代理服务器是可以访问目标服务器的,目标服务器会认为是代理在访问自己(不知道客户端是谁)  ;应用场景:翻墙

 

图片.png

反向代理是服务器代理:客户端访问的是代理机,不知道real server是谁 ,一般用来做负载均衡和服务器安全

图片.png

图片.png

总结

HAProxy 是一款高效、可靠的负载均衡器和反向代理工具,广泛应用于 Web 服务的高可用性和流量管理中。通过了解 HAProxy 的部署、配置、集群模式、常用命令及排错技巧,你可以更好地管理和优化你的服务架构。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值