它们在架构中的分工是 “主备双保险(高可用容灾)”,本质上是为了解决 负载均衡器自身的“单点故障”。

我们可以把它们的作用和工作模式拆解为以下三个层面:

1. 为什么一台不够,非要两台?(解决什么痛点)

在只有 lb01 时,架构最大的隐患是:

  • 即使你后端的 web01 和 web02 做得再好,只要 lb01 这台机器电源一掉、系统崩溃或服务假死,外部所有的访问入口就瞬间全部瘫痪了。

  • 这种“只要它挂了,全盘皆输”的节点叫 单点故障(SPOF)。

  • lb02 的出现,就是给入口加一条“备用命”。

2. 两台机器的分工角色

配合 Keepalived + VIP(虚拟浮动 IP) 运行后,它们的分工如下:

节点名称

内部运行的服务

承担的角色

实际分工状态

lb01

Nginx + Keepalived

主节点(MASTER)

平时上班干活。持有虚拟 IP(VIP),所有来自外部的博客访问流量都先经过它,再分发给后端 Web。

lb02

HAProxy + Keepalived

备节点(BACKUP)

平时待命监控。不绑定 VIP,默默监听 lb01 的心跳状态,随时准备“顶上去”。

3. 它们在真实故障时是如何配合的?

场景 A:平时一切正常

  • 外部用户访问博客(通过 VIP 请求)。

  • lb01 拿着 VIP 接收流量,由上面的 Nginx 把请求分给 web01 和 web02。

  • lb02 处于热备状态(上面的 HAProxy 也在实时探测 Web 节点健康,随时可以无缝接管)。

场景 B:lb01 突然故障(如宕机、断网或进程挂掉)

  1. lb02 的 Keepalived 发现来自 lb01 的心跳包中断。

  2. lb02 瞬间抢占 VIP,把这个虚拟 IP 挂载到自己的网卡上。

  3. 外部发往该 VIP 的流量立刻自动打到 lb02 上的 HAProxy。

  4. HAProxy 接管流量后,继续把请求分发给 web01 和 web02。

  5. 用户感知:浏览器刷新依然秒开,完全不知道背后的负载均衡器已经从 lb01 换成了 lb02。

场景 C:lb01 修好恢复

  • lb01 重新开机上线,由于配置了更高的优先级,它会重新收回 VIP 成为主节点,lb02 自动切回备用待命状态。

从企业生产环境的规范标准来看,你的直觉非常敏锐:确实有点“多余”,甚至算是一种“反模式(Anti-Pattern)”。

但在个人学习、实训项目以及求职面试的语境下,这种设计不仅不多余,反而是最具性价比的“神仙组合”。

我们需要分两种视角来理性看待:

一、 为什么在“真实生产环境”中不会这么配?

在真正的企业生产运维中,主备节点几乎要求 100% 镜像对称(主是 Nginx,备必定也是 Nginx;或者主备全用 HAProxy),绝不会一边用 Nginx、一边用 HAProxy。原因有三:

  1. 配置无法同步,运维成本翻倍:

    • 后端加了一台 Web 服务器,或者改动了一个转发路径、更新了 SSL 证书;

    • 你既要写一遍 Nginx 语法(upstream、server、proxy_pass),又要跑去备机写一遍 HAProxy 语法(backend、server ... check)。长此以往极易漏配,导致主备配置不一致。

  2. 故障切换时行为不一致:

    • Nginx 和 HAProxy 的底层调度算法细节、超时时间(timeout)、重试逻辑、健康检查敏感度都不完全一样。

    • VIP 漂移过去后,可能平时主节点没问题的连接,备节点直接超时断开,增加排障难度。

  3. 备用机器资源浪费:

    • 主备模式下,备机平时 99% 的时间都在空跑耗电,利用率低。

二、 为什么在“学习和面试项目”中,这样配反而是最优解?

回到你当前的场景和你的简历:

  1. 最大化榨干有限的虚拟机资源:

    • 你的电脑开着 lb01、lb02、web01、web02、db01、nfs 等多台机器,内存和 CPU 已经比较紧张了。

    • 如果按标准规范搞“纯 Nginx 高可用”加“纯 HAProxy 高可用”,你需要开 4 台 LB 虚拟机;

    • 而通过这种“异构主备”设计,你在仅有的 2 台 LB 虚拟机上,同时把 Nginx、HAProxy、Keepalived 三大组件全部实操打通。

  2. 完美撑起你的简历内容:

    • 你的项目里既写了 “Nginx 反向代理、负载均衡”,又写了 “HAProxy + Keepalived 高可用、VIP 漂移、健康检查”。

    • 如果你的环境里只有 Nginx,面试官深挖 HAProxy 的语法和配置时你容易心虚;

    • 现在的环境让你对两者的配置结构、监控大盘(Stats)以及底层机制都有第一手实操经验。

三、 面试时被问到这个点,如何“化被动为主动”?

如果面试官很敏锐地问你:

“我看你主节点用 Nginx,备节点用 HAProxy,生产中一般保持一致,你为什么这么设计?”

你可以用极其专业的口吻这样回答,瞬间转化为加分项:

高情商/专业应答套路:

“在实验和方案调研阶段,我是刻意采用异构主备进行技术验证的。一方面是为了横向对比 Nginx 在七层动静分流的灵活性,以及 HAProxy 在原生高并发调度与可视化监控(Stats)上的优势;另一方面也借此验证 Keepalived 对不同代理服务的健康检查脚本(chk_script)兼容性。

当然我也清楚在实际生产交付中,为了保证配置的一致性、降低维护成本并避免配置漂移,团队会保持主备负载均衡组件的统一(例如统一采用 HAProxy+Keepalived 或统一使用 Nginx 双机热备,甚至采用云厂商的负载均衡)。这种设计主要是我在技术选型与故障切换压测时的一个对比实践。”

这样一答,面试官不仅挑不出毛病,还会觉得你既有扎实的动手能力,又有清晰的架构全局观和生产意识。