一、认识 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
-
高可用性:通过健康检查自动剔除失效的后端服务器。
-
负载均衡:支持多种负载均衡算法,如轮询、最少连接、源地址哈希等。
-
高性能: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连接不上
-
测试代理端口6666
容器化部署:
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)来管理后端服务器的信息。
集群模式的常见配置方法:
-
高可用性集群:使用
keepalived
或类似工具实现 HAProxy 的主备切换,以保证主 HAProxy 实例宕机时,备份实例能够接管流量。 -
多节点负载均衡:将多个 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
该命令会检查配置文件是否有语法错误,并输出详细的错误信息。通过这些信息,你可以定位并修复配置文件中的问题。
提示优先级低的配置项将被忽略掉eg tianan3 mode是tcp ,那么default的forwardfor是工作在http mode的,则忽略
2. 后端服务器不可达
-
错误描述:HAProxy 正常启动,但客户端请求无法成功转发,可能是因为后端服务器不可达或未正确配置。
-
解决方法:
-
检查后端服务器是否在线:使用
ping
或telnet
等命令检查 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" 的错误,表示端口被占用,无法绑定。
-
解决方法:
-
使用
netstat
或ss
命令查看端口是否已被其他服务占用:
-
netstat -tuln | grep 80
-
如果端口已被占用,可以更改 HAProxy 配置文件中的绑定端口,或停止占用该端口的服务。
bind *:8080 # 更改为可用的端口
4. 负载均衡算法不生效
-
错误描述:配置了负载均衡算法(如
roundrobin
或leastconn
),但请求没有按照期望的方式分配到后端服务器。 -
解决方法:
-
确保
balance
参数配置正确,例如:backend my_backend balance roundrobin # 轮询算法 server server1 192.168.1.1:80 check server server2 192.168.1.2:80 check
-
-
如果负载均衡算法没有生效,可以尝试更换为其他算法,例如
leastconn
或source
,查看是否能够解决问题。
balance leastconn # 使用最少连接算法
5. 请求分配到错误的后端服务器
-
错误描述:根据请求 URL 或其他条件,流量应该被分发到不同的后端服务器,但实际上所有请求都被分发到一个服务器。
-
解决方法:
-
使用
acl
和use_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
-
-
如果
acl
或use_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 排错通常包括以下几个方面:
-
日志文件:HAProxy 会生成详细的日志文件,通常在
/var/log/syslog
或/var/log/haproxy.log
中。通过查看日志,可以快速了解问题发生的位置。 -
检查配置文件:使用
haproxy -c -f /etc/haproxy/haproxy.cfg
命令来检查 HAProxy 配置文件的正确性。如果有错误,HAProxy 会输出详细的错误信息。 -
健康检查:确保 HAProxy 的健康检查功能已启用。健康检查可以确保流量只会发送到健康的后端服务器。通过配置文件中的
check
参数,可以启用健康检查。 -
查看状态页面:使用 HAProxy 自带的状态页面查看流量分配、后端服务器的健康状况等信息。如果流量分配不均或某个后端服务器不可用,排查这些问题。
-
性能调优:根据流量和硬件资源,调整 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效率高,更专业,更稳定。
正向代理是客户端代理:指客户端想要访问无法访问的网络资源,在客户端上部署代理服务器(软件),此代理服务器是可以访问目标服务器的,目标服务器会认为是代理在访问自己(不知道客户端是谁) ;应用场景:翻墙
反向代理是服务器代理:客户端访问的是代理机,不知道real server是谁 ,一般用来做负载均衡和服务器安全
总结
HAProxy 是一款高效、可靠的负载均衡器和反向代理工具,广泛应用于 Web 服务的高可用性和流量管理中。通过了解 HAProxy 的部署、配置、集群模式、常用命令及排错技巧,你可以更好地管理和优化你的服务架构。