当前位置:   article > 正文

一文学会理解HAProxy:概念、架构、原理、搭建过程、常用命令及实战案例

haproxy

引言

    在现代互联网架构中,负载均衡器扮演着至关重要的角色。它能够分发流量,提升系统的性能和可靠性。HAProxy(High Availability Proxy)作为开源、高性能的负载均衡器和代理服务器,广泛应用于各类企业中。本文将详细介绍HAProxy的概念、架构、工作原理,搭建过程,常用命令,以及通过实战案例帮助读者更好地理解和应用HAProxy。

一、HAProxy概念


1.1 什么是HAProxy?


     HAProxy是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器,从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制,是构建高可用性系统的理想选择。

1.2 HAProxy的优势

高性能:HAProxy采用事件驱动模型,能够处理大量并发连接。
灵活性强:支持多种负载均衡算法和调度策略,适应不同的应用场景。
高可用性:通过健康检查和故障转移机制,确保服务的连续性。
丰富的功能:支持SSL终止、HTTP重写、压缩等多种功能。

二、HAProxy架构

2.1 HAProxy整体架构

HAProxy的整体架构主要包括以下部分:

前端(Frontend):接受客户端请求,并根据配置的规则进行处理。
后端(Backend):定义一组服务器,处理前端转发的请求。
服务器(Server):实际处理请求的后端服务器。
监听器(Listener):在前端监听特定的IP和端口,等待客户端的连接请求。

2.2 HAProxy的组件

配置文件(haproxy.):HAProxy的核心配置文件,定义了前端、后端和监听器等组件。
统计报告(Statistics Report):HAProxy提供丰富的统计信息,便于监控和调试。
日志(Log):HAProxy支持详细的日志记录,帮助分析和诊断问题。

2.3 HAProxy的工作流程

HAProxy的工作流程如下:客户端发送请求到HAProxy的前端。
前端根据配置的规则,选择合适的后端。
后端将请求分发到具体的服务器进行处理。
服务器处理请求并返回结果,通过后端和前端返回给客户端。

三、HAProxy工作原理

3.1 负载均衡算法

HAProxy支持多种负载均衡算法,包括:轮询调度(Round Robin):将请求依次分配给每个后端服务器。
最少连接(Least Connections):将请求分配给当前连接数最少的服务器。
源地址哈希(Source Hashing):根据客户端的IP地址分配请求,确保同一客户端的请求总是分配到同一台服务器。
加权轮询(Weighted Round Robin):根据服务器的权重分配请求,权重高的服务器分配更多的请求。


3.2 健康检查

     为了确保请求只被分配到正常工作的服务器,HAProxy提供了健康检查机制。健康检查可以定期检测后端服务器的状态,根据检测结果动态调整服务器的可用性。常见的健康检查类型包括TCP连接检查、HTTP请求检查等。

3.3 会话保持

在某些应用场景中,需要确保同一客户端的所有请求都分配到同一台服务器上,HAProxy提供了会话保持机制来实现这一需求。会话保持可以通过源地址哈希、Cookie等方式实现。

四、HAProxy搭建过程

4.1 准备工作

在开始搭建HAProxy之前,需要准备以下环境:服务器:至少两台服务器,一台作为HAProxy负载均衡器,其他作为后端服务器。
操作系统:推荐使用基于Linux的操作系统,如CentOS、Ubuntu等。

4.2 安装HAProxy

在HAProxy负载均衡器服务器上安装HAProxy:

# CentOS系统

yum install haproxy -y

# Ubuntu系统

apt-get install haproxy -y

4.3 配置HAProxy

编辑HAProxy的配置文件/etc/haproxy/haproxy.,配置前端、后端和监听器。

4.3.1 配置全局参数

在haproxy.文件中,配置全局参数:

  1. global
  2.     log /dev/log local0
  3.     log /dev/log local1 notice
  4.     chroot /var/lib/haproxy
  5.     stats socket /run/haproxy/admin.sock mode 660 level admin
  6.     stats timeout 30s
  7.     user haproxy
  8.     group haproxy
  9.     daemon
  10. defaults
  11.     log     global
  12.     option  httplog
  13.     option  dontlognull
  14.     timeout connect 5000
  15.     timeout client  50000
  16.     timeout server  50000
  17.     errorfile 400 /etc/haproxy/errors/400.http
  18.     errorfile 403 /etc/haproxy/errors/403.http
  19.     errorfile 408 /etc/haproxy/errors/408.http
  20.     errorfile 500 /etc/haproxy/errors/500.http
  21.     errorfile 502 /etc/haproxy/errors/502.http
  22.     errorfile 503 /etc/haproxy/errors/503.http
  23.     errorfile 504 /etc/haproxy/errors/504.http

4.3.2 配置前端

在haproxy.文件中,配置前端:

  1. frontend http-in
  2.     bind *:80
  3.     default_backend servers

4.3.3 配置后端

在haproxy.文件中,配置后端:

  1. backend servers
  2.     balance roundrobin
  3.     server server1 192.168.1.101:80 check
  4.     server server2 192.168.1.102:80 check

4.3.4 配置统计报告

在haproxy.文件中,配置统计报告:

  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 10s
  6.     stats auth admin:password

4.4 启动HAProxy

启动并启用HAProxy服务:

  1. systemctl start haproxy
  2. systemctl enable haproxy

4.5 验证配置

   在客户端浏览器中访问http://<HAProxy_IP>/stats,可以看到HAProxy的统计报告,验证配置是否正确。

五、HAProxy常用命令

5.1 启动HAProxy

systemctl start haproxy

5.2 停止HAProxy

systemctl stop haproxy

5.3 重启HAProxy

systemctl restart haproxy

5.4 查看HAProxy状态

systemctl status haproxy

5.5 检查HAProxy配置文件

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

5.6 重新加载HAProxy配置

systemctl reload haproxy

5.7 查看HAProxy统计信息

通过浏览器访问http://<HAProxy_IP>/stats,输入配置的用户名和密码,可以查看HAProxy的统计信息。

六、HAProxy实战案例


6.1 实现HTTP负载均衡

假设有两台后端服务器192.168.1.101和192.168.1.102,它们都运行着HTTP服务。我们将使用HAProxy来实现HTTP服务的负载均衡。

6.1.1 环境准备

确保以下环境:负载均衡器的IP:192.168.1.100
后端服务器的IP:192.168.1.101和192.168.1.102
后端服务器安装并运行HTTP服务(如Apache或Nginx)


6.1.2 配置HAProxy

编辑/etc/haproxy/haproxy.文件,配置前端和后端。
配置全局参数和默认参数:

  1. global
  2.     log /dev/log local0
  3.     log /dev/log local1 notice
  4.     chroot /var/lib/haproxy
  5.     stats socket /run/haproxy/admin.sock mode 660 level admin
  6.     stats timeout 30s
  7.     user haproxy
  8.     group haproxy
  9.     daemon
  10. defaults
  11.     log     global
  12.     option  httplog
  13.     option  dontlognull
  14.     timeout connect 5000ms
  15.     timeout client  50000ms
  16.     timeout server  50000ms
  17.     errorfile 400 /etc/haproxy/errors/400.http
  18.     errorfile 403 /etc/haproxy/errors/403.http
  19.     errorfile 408 /etc/haproxy/errors/408.http
  20.     errorfile 500 /etc/haproxy/errors/500.http
  21.     errorfile 502 /etc/haproxy/errors/502.http
  22.     errorfile 503 /etc/haproxy/errors/503.http
  23.     errorfile 504 /etc/haproxy/errors/504.http

配置前端和后端:

  1. frontend http-in
  2.     bind *:80
  3.     default_backend servers
  4. backend servers
  5.     balance roundrobin
  6.     server server1 192.168.1.101:80 check
  7.     server server2 192.168.1.102:80 check

配置统计报告:

  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 10s
  6.     stats auth admin:password

6.1.3 启动并验证HAProxy

启动HAProxy服务:

  1. systemctl start haproxy
  2. systemctl enable haproxy


在客户端浏览器中访问http://192.168.1.100,可以看到请求被分发到不同的后端服务器。访问http://192.168.1.100:8080/stats,可以查看HAProxy的统计报告。

6.2 实现HTTPS负载均衡

假设有两台后端服务器192.168.1.103和192.168.1.104,它们都运行着HTTPS服务。我们将使用HAProxy来实现HTTPS服务的负载均衡。

6.2.1 环境准备

确保以下环境:负载均衡器的IP:192.168.1.105
后端服务器的IP:192.168.1.103和192.168.1.104
后端服务器安装并运行HTTPS服务(如Apache或Nginx)
获取并配置SSL证书


6.2.2 配置HAProxy

编辑/etc/haproxy/haproxy.文件,配置前端和后端。

配置全局参数和默认参数:

  1. global
  2.     log /dev/log local0
  3.     log /dev/log local1 notice
  4.     chroot /var/lib/haproxy
  5.     stats socket /run/haproxy/admin.sock mode 660 level admin
  6.     stats timeout 30s
  7.     user haproxy
  8.     group haproxy
  9.     daemon
  10. defaults
  11.     log     global
  12.     option  httplog
  13.     option  dontlognull
  14.     timeout connect 5000ms
  15.     timeout client  50000ms
  16.     timeout server  50000ms
  17.     errorfile 400 /etc/haproxy/errors/400.http
  18.     errorfile 403 /etc/haproxy/errors/403.http
  19.     errorfile 408 /etc/haproxy/errors/408.http
  20.     errorfile 500 /etc/haproxy/errors/500.http
  21.     errorfile 502 /etc/haproxy/errors/502.http
  22.     errorfile 503 /etc/haproxy/errors/503.http
  23.     errorfile 504 /etc/haproxy/errors/504.http

配置前端和后端:

  1. frontend https-in
  2.     bind *:443 ssl crt /etc/haproxy/certs/site.pem
  3.     default_backend https-servers
  4. backend https-servers
  5.     balance roundrobin
  6.     server server1 192.168.1.103:443 check ssl verify none
  7.     server server2 192.168.1.104:443 check ssl verify none

配置统计报告:

  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 10s
  6.     stats auth admin:password


6.2.3 启动并验证HAProxy

启动HAProxy服务:

  1. systemctl start haproxy
  2. systemctl enable haproxy

在客户端浏览器中访问https://192.168.1.105,可以看到请求被分发到不同的后端服务器。访问http://192.168.1.105:8080/stats,可以查看HAProxy的统计报告。

6.3 实现TCP负载均衡

假设有两台后端服务器192.168.1.106和192.168.1.107,它们都运行着TCP服务(如MySQL)。我们将使用HAProxy来实现TCP服务的负载均衡。

6.3.1 环境准备

确保以下环境:负载均衡器的IP:192.168.1.108
后端服务器的IP:192.168.1.106和192.168.1.107
后端服务器安装并运行TCP服务(如MySQL)


6.3.2 配置HAProxy

编辑/etc/haproxy/haproxy.文件,配置前端和后端。

配置全局参数和默认参数:

  1. global
  2.     log /dev/log local0
  3.     log /dev/log local1 notice
  4.     chroot /var/lib/haproxy
  5.     stats socket /run/haproxy/admin.sock mode 660 level admin
  6.     stats timeout 30s
  7.     user haproxy
  8.     group haproxy
  9.     daemon
  10. defaults
  11.     log     global
  12.     option  tcplog
  13.     option  dontlognull
  14.     timeout connect 5000ms
  15.     timeout client  50000ms
  16.     timeout server  50000ms
  17.     errorfile 400 /etc/haproxy/errors/400.http
  18.     errorfile 403 /etc/haproxy/errors/403.http
  19.     errorfile 408 /etc/haproxy/errors/408.http
  20.     errorfile 500 /etc/haproxy/errors/500.http
  21.     errorfile 502 /etc/haproxy/errors/502.http
  22.     errorfile 503 /etc/haproxy/errors/503.http
  23.     errorfile 504 /etc/haproxy/errors/504.http

配置前端和后端:

  1. frontend tcp-in
  2.     bind *:3306
  3.     default_backend tcp-servers
  4. backend tcp-servers
  5.     balance roundrobin
  6.     server server1 192.168.1.106:3306 check
  7.     server server2 192.168.1.107:3306 check

配置统计报告:

  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 10s
  6.     stats auth admin:password

6.3.3 启动并验证HAProxy

启动HAProxy服务:

  1. systemctl start haproxy
  2. systemctl enable haproxy

使用数据库客户端连接192.168.1.108,可以看到请求被分发到不同的后端服务器。访问http://192.168.1.108:8080/stats,可以查看HAProxy的统计报告。

七、HAProxy的高级功能

7.1 SSL终止

SSL终止是指在HAProxy上处理SSL加密和解密,从而减轻后端服务器的负担。通过配置HAProxy,可以实现SSL终止。

7.1.1 配置SSL终止


编辑/etc/haproxy/haproxy.文件,配置SSL终止:

  1. frontend https-in
  2.     bind *:443 ssl crt /etc/haproxy/certs/site.pem
  3.     default_backend servers
  4. backend servers
  5.     balance roundrobin
  6.     server server1 192.168.1.101:80 check
  7.     server server2 192.168.1.102:80 check


7.1.2 验证SSL终止

在客户端浏览器中访问https://<HAProxy_IP>,可以看到请求被分发到不同的后端服务器。

7.2 HTTP重写和重定向

HAProxy支持HTTP请求的重写和重定向,可以在配置文件中添加相关规则。

7.2.1 配置HTTP重写

编辑/etc/haproxy/haproxy.文件,配置HTTP重写规则:

  1. frontend http-in
  2.     bind *:80
  3.     acl is_root path /
  4.     http-request redirect location /index.html if is_root
  5.     default_backend servers
  6. backend servers
  7.     balance roundrobin
  8.     server server1 192.168.1.101:80 check
  9.     server server2 192.168.1.102:80 check

7.2.2 配置HTTP重定向

编辑/etc/haproxy/haproxy.文件,配置HTTP重定向规则:

  1. frontend http-in
  2.     bind *:80
  3.     http-request redirect scheme https if !{ ssl_fc }
  4.     default_backend servers
  5. frontend https-in
  6.     bind *:443 ssl crt /etc/haproxy/certs/site.pem
  7.     default_backend servers
  8. backend servers
  9.     balance roundrobin
  10.     server server1 192.168.1.101:80 check
  11.     server server2 192.168.1.102:80 check

在上述配置中,所有的HTTP请求将被重定向到HTTPS,确保所有的通信都是加密的。

7.3 使用ACL和条件路由

ACL(访问控制列表)和条件路由可以根据请求的特定条件来决定路由规则。

7.3.1 配置ACL和条件路由


编辑/etc/haproxy/haproxy.文件,配置ACL和条件路由规则:

  1. frontend http-in
  2.     bind *:80
  3.     acl is_api path_beg /api
  4.     acl is_static path_beg /static
  5.     use_backend api_servers if is_api
  6.     use_backend static_servers if is_static
  7.     default_backend web_servers
  8. backend api_servers
  9.     balance roundrobin
  10.     server api_server1 192.168.1.103:80 check
  11.     server api_server2 192.168.1.104:80 check
  12. backend static_servers
  13.     balance roundrobin
  14.     server static_server1 192.168.1.105:80 check
  15.     server static_server2 192.168.1.106:80 check
  16. backend web_servers
  17.     balance roundrobin
  18.     server web_server1 192.168.1.101:80 check
  19.     server web_server2 192.168.1.102:80 check

在上述配置中,不同类型的请求(API请求、静态文件请求、普通网页请求)将被分别路由到不同的后端服务器池。

7.4 自定义错误页面

HAProxy允许为不同的HTTP错误状态码配置自定义的错误页面。

7.4.1 配置自定义错误页面


首先,创建自定义的错误页面文件,例如/etc/haproxy/errors/503.http:

  1. html
  2. HTTP/1.0 503 Service Unavailable
  3. Cache-Control: no-cache
  4. Connection: close
  5. Content-Type: text/html
  6. <html>
  7.   <head><title>503 Service Unavailable</title></head>
  8.   <body>
  9.     <h1>Service Unavailable</h1>
  10.     <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</p>
  11.   </body>
  12. </html>

然后,编辑/etc/haproxy/haproxy.文件,配置自定义错误页面:

  1. defaults
  2.     log     global
  3.     option  httplog
  4.     option  dontlognull
  5.     timeout connect 5000ms
  6.     timeout client  50000ms
  7.     timeout server  50000ms
  8.     errorfile 503 /etc/haproxy/errors/503.http

在上述配置中,当返回503错误时,HAProxy将显示自定义的错误页面。

7.5 使用Stick Table实现会话保持

Stick Table用于实现会话保持,即同一个客户端的请求总是被分发到同一台后端服务器。

7.5.1 配置Stick Table

编辑/etc/haproxy/haproxy.文件,配置Stick Table:

  1. frontend http-in
  2.     bind *:80
  3.     default_backend servers
  4. backend servers
  5.     balance roundrobin
  6.     stick-table type ip size 200k expire 30m
  7.     stick on src
  8.     server server1 192.168.1.101:80 check
  9.     server server2 192.168.1.102:80 check

在上述配置中,Stick Table根据客户端的IP地址实现会话保持。

八、HAProxy的监控与调试
8.1 启用HAProxy统计页面

HAProxy提供了一个内置的统计页面,可以用来监控和调试HAProxy。

8.1.1 配置统计页面

编辑/etc/haproxy/haproxy.文件,配置统计页面:

  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 10s
  6.     stats auth admin:password


8.1.2 访问统计页面

在客户端浏览器中访问http://<HAProxy_IP>:8080/stats,输入配置的用户名和密码,可以查看HAProxy的统计信息。

8.2 日志配置

HAProxy支持详细的日志记录,可以帮助分析和诊断问题。

8.2.1 配置日志

编辑/etc/haproxy/haproxy.文件,启用日志记录:

  1. global
  2.     log /dev/log local0
  3.     log /dev/log local1 notice
  4. defaults
  5.     log global
  6.     option httplog
  7.     option dontlognull

8.2.2 查看日志

HAProxy的日志文件通常位于/var/log/haproxy.log,可以使用以下命令查看日志:

tail -f /var/log/haproxy.log

九、HAProxy的高可用性配置

9.1 使用Keepalived实现HAProxy的高可用性

为了确保HAProxy的高可用性,可以使用Keepalived来实现主备HAProxy负载均衡器。

9.1.1 安装Keepalived

在HAProxy主备服务器上安装Keepalived:

# CentOS系统

yum install keepalived -y

# Ubuntu系统

apt-get install keepalived -y


9.1.2 配置Keepalived

编辑Keepalived的配置文件/etc/keepalived/keepalived.conf,配置高可用性。

主服务器的配置:

  1. vrrp_instance VI_1 {
  2.     state MASTER
  3.     interface eth0
  4.     virtual_router_id 51
  5.     priority 100
  6.     advert_int 1
  7.     authentication {
  8.         auth_type PASS
  9.         auth_pass 1111
  10.     }
  11.     virtual_ipaddress {
  12.         192.168.1.200
  13.     }
  14. }

备服务器的配置:

  1. vrrp_instance VI_1 {
  2.     state BACKUP
  3.     interface eth0
  4.     virtual_router_id 51
  5.     priority 90
  6.     advert_int 1
  7.     authentication {
  8.         auth_type PASS
  9.         auth_pass 1111
  10.     }
  11.     virtual_ipaddress {
  12.         192.168.1.200
  13.     }
  14. }


9.1.3 启动Keepalived
启动并启用Keepalived服务:

  1. systemctl start keepalived
  2. systemctl enable keepalived


现在,当主HAProxy服务器出现故障时,Keepalived将自动切换到备服务器,确保服务的高可用性。

十、总结

  
     通过本文,我们详细介绍了HAProxy的概念、架构、工作原理,搭建过程,常用命令,以及一些高级功能和实战案例。HAProxy作为一款高性能的负载均衡器,具有广泛的应用场景和强大的功能,是构建高可用、高性能系统的理想选择。希望本文能帮助读者更好地理解和应用HAProxy,提高系统的可靠性和性能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/987878
推荐阅读
相关标签
  

闽ICP备14008679号