haproxy

  1. 高可用性
  • 能够检测后端服务器的健康状况。如果某台后端服务器出现故障,HAProxy 会自动将其从负载均衡池中移除,直到它恢复正常后再重新加入,从而确保整个系统的持续稳定运行。 - 支持多种故障切换模式,例如主动/被动模式,当主服务器出现故障时,备用服务器能够迅速接管服务,保证业务不中断。
  1. 负载均衡
  • 支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)等。 - 轮询算法会依次将请求分发到后端的每台服务器,适用于后端服务器性能相近的情况。最少连接算法则会将新的请求发送到当前连接数最少的服务器,这样可以更合理地利用服务器资源,适用于服务器性能有差异或者服务器处理请求的时长不同的情况。
  1. 性能卓越
  • 它在网络层进行高效的数据转发,与应用层相比,减少了很多不必要的处理开销。 - 能够处理大量的并发连接,并且具有较低的延迟,特别适用于高流量的网站或应用。
  1. 支持多种协议
  • 对于基于 TCP 的应用,如数据库服务、邮件服务等,HAProxy 可以在不了解应用层协议的情况下进行高效的负载均衡。

  • 对于 HTTP 应用,它可以基于 URL、HTTP 头部等信息进行更精细的负载均衡和请求路由,例如将不同类型的请求分发到不同的后端服务器组。

  1. 安全防护
  • 可以作为应用的前端防护层,提供一些基本的安全功能。例如,它可以限制客户端的连接速率,防止恶意的洪水攻击;还可以通过设置访问控制列表(ACL)来限制对后端服务器的访问,只允许特定的 IP 地址或 IP 段访问。

二、应用场景

  1. 大型网站
  • 对于像电商网站、新闻门户等流量巨大的网站,HAProxy 可以将用户的请求均衡地分发到多台 Web 服务器上,提高网站的响应速度和吞吐量,同时保证网站的高可用性。 - 例如,在促销活动期间,网站流量会急剧增加,HAProxy 能够自动调整负载均衡策略,确保网站不会因为流量过大而崩溃。
  1. Web 应用集群
  • 在构建 Web 应用集群时,HAProxy 可以将前端的 HTTP 请求分发到后端的多个应用服务器上,实现应用的横向扩展。不同的应用服务器可以部署在不同的物理服务器上,也可以通过容器技术部署在同一台物理服务器上,HAProxy 都能有效地管理和均衡它们之间的负载。
  1. 微服务架构
  • 在微服务架构中,有众多的微服务实例。HAProxy 可以作为 API 网关的一部分,负责将外部请求路由到不同的微服务实例上,同时实现负载均衡和服务发现等功能。它可以根据请求的路径、方法等信息将请求准确地转发到相应的微服务,提高微服务系统的整体性能和可靠性。

三、配置和管理

  1. 配置文件
  • HAProxy 的配置主要通过一个文本配置文件进行。在配置文件中,可以定义前端(frontend)和后端(backend)的相关参数。前端部分主要定义了监听的端口、协议等信息,后端部分则定义了后端服务器的列表以及负载均衡算法等。
  1. 管理方式
  • 可以通过命令行工具对 HAProxy 进行管理和监控。常用的命令如`haproxy -f config_file`来启动 HAProxy 并加载指定的配置文件。 - 还有一些第三方的监控工具可以与 HAProxy 集成,实时显示服务器的负载情况、连接数、吞吐量等指标,以便管理员及时了解系统的运行状态并进行调整优化。 总之,HAProxy 是一款功能强大的负载均衡和代理软件,在现代互联网应用和企业级系统中有着广泛的应用,能够有效地提高系统的性能、可用性和可靠性。

(二)实验

主机:haproxy,服务器1、2

1、分别添加地址

在服务器1、2上安装nginx

root@webserver1 \~\]# dnf install nginx -y \[root@webserver2 \~\]# dnf install nginx -y \[root@webserver1 \~\]# echo webserver1 - 172.25.254.10 \> /usr/share/nginx/html/index.html \[root@webserver1 \~\]# systemctl enable --now nginx Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. \[root@webserver2 \~\]# echo webserver2 - 172.25.254.20 \> /usr/share/nginx/html/index.html \[root@webserver2 \~\]# systemctl enable --now nginx Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. 2、在主机haproxy上安装haproxy \[root@haproxy \~\]# dnf install haproxy -y 使用frontend和backend参数配置proxies \[root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg \[root@haproxy \~\]# systemctl restart haproxy.service ###### 用curl检测主机 ![](https://i-blog.csdnimg.cn/direct/b309581d869142069b77b7f275f34fb8.png) 使用 systemctl stop nginx.service命令检测服务器![](https://i-blog.csdnimg.cn/direct/096f95cd2618437487d29771a59c8fd0.png) 全局配置 \[root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg \[root@haproxy \~\]# systemctl restart haproxy.service \[root@haproxy \~\]# pstree -p \| grep haproxy ###### 定义修改日 其核心命令为vim /etc/rsyslog.conf ###### haproxy代理配置 server配置\[root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg 热更新 HAProxy 支持热更新配置,这意味着可以在不中断服务的情况下更新配置。以下是 HAProxy 热更新的方法: 一、使用 HAProxy 的命令行工具 1. 首先,找到 HAProxy 的运行进程 ID(PID)。通常可以在配置文件中指定的 pidfile 路径下找到该文件,文件内容即为 PID。或者通过操作系统的进程查看命令(如\`ps aux \| grep haproxy\`)来查找。 2. 然后,使用\`haproxy\`命令行工具结合\`-f\`参数指定新的配置文件,以及\`-sf\`参数指定要平滑重启的旧进程 ID。例如: - \`haproxy -f new_config.cfg -sf old_process_id\` - 这里的\`new_config.cfg\`是新的配置文件,\`old_process_id\`是旧的 HAProxy 进程 ID。执行这个命令后,HAProxy 会读取新的配置文件,启动新的进程,并将旧进程的连接平滑地迁移到新进程上。 二、发送信号 1. 另一种方法是通过向正在运行的 HAProxy 进程发送信号来实现热更新。可以使用\`kill\`命令发送\`USR2\`信号来触发配置文件的重新加载: - \`kill -USR2 \\` - 这将使 HAProxy 重新加载配置文件。HAProxy 会首先将新的配置文件重命名为\`haproxy.cfg.old.\\`(其中\`\\`是当前时间戳),然后尝试加载新的配置。如果加载成功,它会将新配置文件重命名为\`haproxy.cfg\`,并将旧配置文件保留为备份。如果加载失败,它会继续使用旧的配置文件,并将新配置文件重命名为\`haproxy.cfg.failed\`。 HAProxy 支持多种负载均衡算法 一、轮询(Round Robin)算法 1. 原理: - 轮询算法是最简单且常用的负载均衡算法之一。它按照顺序依次将客户端的请求分发到后端的每一台服务器。例如,假设有服务器 A、B、C,第一个请求会被发送到服务器 A,第二个请求发送到服务器 B,第三个请求发送到服务器 C,然后第四个请求又重新从服务器 A 开始,如此循环。 2. 特点及应用场景: - 特点: - 实现简单,能平均分配请求到各个后端服务器,确保每个服务器都有机会处理请求。 - 不考虑服务器的实际负载情况和性能差异,只要服务器处于健康状态,就会按照顺序分配请求。 - 应用场景: - 适用于后端服务器性能相近,且对请求的处理能力没有明显差异的情况。比如,在一个小型的 Web 应用集群中,服务器的配置基本相同,使用轮询算法可以简单有效地分配请求,提高整个集群的吞吐量。 二、最少连接(Least Connections)算法 1. 原理: - 该算法会将新的请求发送到当前连接数最少的服务器。HAProxy 会实时监控后端服务器的连接状态,当有新的请求到来时,它会选择连接数最少的那台服务器进行分发。例如,服务器 A 当前有 10 个连接,服务器 B 有 5 个连接,服务器 C 有 8 个连接,那么下一个请求会被发送到服务器 B。 2. 特点及应用场景: - 特点: - 能够根据服务器的实际负载情况进行请求分配,更合理地利用服务器资源。 - 相比轮询算法,它考虑了服务器的当前连接数,有助于避免某些服务器因连接过多而负载过高,同时充分利用连接数较少的服务器的处理能力。 - 应用场景: - 适用于服务器性能有差异或者服务器处理请求的时长不同的情况。例如,在一个包含不同配置服务器的集群中,性能较强的服务器可能能够处理更多的连接,而最少连接算法可以根据实际情况将更多请求分配到合适的服务器上,提高整体的处理效率。 三、源地址哈希(Source Hashing)算法 1. 原理: - 根据客户端的 IP 地址进行哈希计算,将得到的哈希值与后端服务器的数量进行取模运算,从而确定将请求分发到哪台服务器。相同的源 IP 地址总是会被分发到同一台后端服务器。例如,假设有 3 台后端服务器,通过对源 IP 地址进行哈希计算并取模,IP 地址为 192.168.1.10 的客户端计算结果为 1,那么它的请求会始终被分发到服务器 B(假设服务器编号从 0 开始)。 2. 特点及应用场景: - 特点: - 可以保证来自相同源 IP 地址的请求都被定向到同一台服务器,实现会话的一致性。这对于一些需要保持会话状态的应用非常重要,例如购物网站的用户会话,如果用户在购物过程中的请求被分发到不同的服务器,可能会导致会话状态丢失,影响用户体验。 - 但是,如果该服务器出现故障,那么来自这些源 IP 地址的请求将无法正常处理,直到服务器恢复。 - 应用场景: - 常用于需要保持用户会话一致性的应用场景,如电子商务网站、在线银行等,确保用户在整个会话期间与同一台服务器进行交互。 四、基于权重的算法(Weighted) 1. 原理: - 在这种算法中,管理员可以为每台后端服务器分配一个权重值。负载均衡器在分发请求时,会根据权重比例来分配请求。例如,服务器 A 的权重为 3,服务器 B 的权重为 2,服务器 C 的权重为 1,那么在总共 6 份的请求中(3+2+1),服务器 A 会分配到 3 份请求,服务器 B 会分配到 2 份请求,服务器 C 会分配到 1 份请求。 2. 特点及应用场景: - 特点: - 灵活性高,可以根据服务器的性能、配置等因素来调整权重。性能较好的服务器可以分配较高的权重,从而承担更多的请求,而性能较弱或新加入的服务器可以分配较低的权重。 - 可以手动调整负载分配比例,以适应不同的业务需求和服务器实际情况。 - 应用场景: - 当集群中服务器的性能、容量等存在差异时,通过权重的设置可以更合理地分配负载。例如,在一个混合服务器集群中,有一些新加入的服务器性能相对较弱,而一些老的服务器性能较强,通过设置合适的权重,可以让性能强的服务器承担更多请求,同时也能让新服务器逐步适应负载,提高整个集群的稳定性和效率。 这些算法各有特点和适用场景,在使用 HAProxy 进行负载均衡时,可以根据实际的应用需求和服务器情况选择合适的算法来达到最佳的负载均衡效果。 自定义错误页面 在 HAProxy 中,您可以自定义错误页面以提供更友好和个性化的用户体验。以下是一般的步骤和示例: 一、准备自定义错误页面 1. 创建错误页面文件 - 使用 HTML 或其他合适的格式创建错误页面, 例如 \`503.html\`(用于服务不可用错误)、\`404.html\`(用于未找到页面错误)等。 2. 设计错误页面内容 - 包含清晰的错误消息、可能的解决建议、联系信息等。 二、配置 HAProxy 指向自定义错误页面 在 HAProxy 的配置文件中,使用 \`errorfile\` 指令来指定错误页面的路径。 例如: errorfile 503 /path/to/503.html errorfile 404 /path/to/404.html 其中 \`/path/to/\` 是您保存错误页面文件的实际路径。 三、示例配置 假设错误页面文件保存在 \`/var/www/errors/\` 目录下: errorfile 503 /var/www/errors/503.html errorfile 404 /var/www/errors/404.html 这样,当出现相应的错误状态时,HAProxy 将向客户端展示自定义的错误页面。 请注意,具体的配置可能因 HAProxy 的版本和实际环境而有所不同。在进行配置更改后,重新加载 HAProxy 以使更改生效。

相关推荐
皮皮哎哟2 小时前
Linux多线程通信:告别数据混乱
linux·互斥锁·进程间通信·信号量
三天不学习2 小时前
Linux inotify 机制详解,解决“用户实例限制”问题
linux·运维·c#
ZFB00012 小时前
【麒麟桌面系统】V10-SP1 2503 系统知识——插入U盘(移动硬盘)为只读状态
linux·运维·kylin
unfeeling_2 小时前
Keepalived实验
linux·服务器·网络
Web极客码3 小时前
解决WordPress后台“外观”菜单消失
linux·服务器·wordpress
熬夜有啥好3 小时前
Linux软件编程——综合小练习
linux·算法·目录遍历·fgets·strcpy·linux内核与用户交互·strtok
qizhideyu3 小时前
LVS(Linux virual server)
linux·运维·lvs
xiaoliuliu123453 小时前
CentOS 7 安装 gcc-4.8.5-44.el7.x86_64.rpm 详细步骤(含依赖解决)
linux·运维·centos
青桔柠薯片3 小时前
Linux软件编程:线程和进程间通信
linux·开发语言·线程·进程