独立站负载均衡:多实例部署、健康检查、会话保持与故障转移

独立站上负载均衡的触发点是日访问量稳定超过5万、单台4核8G CPU长期60%以上,或者你已经吃过一次"服务器挂了全站打不开"的亏。合格标准是:至少2个应...

独立站负载均衡:多实例、健康检查与故障转移Load balancing: multi-instance, health check, failover 反直觉:会话保持不是必须的,无状态化才能真正横向扩展Counter-intuitive: sticky sessions hurt scaling; go stateless 负载均衡器 LBLoad Balancer L4 TCP / L7 HTTPL4 TCP / L7 HTTP 应用实例 AApp Instance A 健康 200 · 权重 50%Healthy, weight 50% 应用实例 BApp Instance B 健康 200 · 权重 50%Healthy, weight 50% 应用实例 CApp Instance C 3次失败 · 自动摘除Unhealthy, drained 健康检查:每10秒请求一次 /health,连续3次失败摘除,连续2次成功恢复Health: GET /health every 10s; 3 fails out, 2 oks in 会话保持:默认关闭,登录态放Redis或JWT;只有老系统实在改不动才开cookie粘性Sticky off; sessions in Redis/JWT 故障转移:单台宕机LB在10秒内摘除,流量自动打到健康实例,用户无感知Failover: LB drains dead node in 10s, user sees nothing 至少跨2台不同物理机/可用区;同机房单机断电=白配Spread across AZs, not one rack
负载均衡:健康实例分流,故障实例自动摘除

独立站负载均衡:多实例部署、健康检查、会话保持与故障转移

结论先行:独立站上负载均衡的触发点是日访问量稳定超过5万、单台4核8G CPU长期60%以上,或者你已经吃过一次”服务器挂了全站打不开”的亏。合格标准是:至少2个应用实例跨可用区部署、每10秒一次健康检查、连续3次失败自动摘除、故障转移在10秒内完成。反直觉的一点是,会话保持(sticky session)不是必须开的——把登录态放到Redis或JWT里,让应用真正无状态,才是多实例扩展的前提。开了会话保持,一台机器挂了那台上的用户照样掉线。

一、什么时候需要负载均衡,什么时候是过度设计

负载均衡不是起步就该上的东西。日访问量5000以内,单台2核4G VPS跑Nginx+PHP+MySQL完全够,花几百块买LB只会增加复杂度。真正需要多实例的信号有三个:单台机器CPU长期超过60%、发布时必须停机、你已经因为单机故障丢过询盘。满足其中两个,再上LB。

独立站的典型升级路径是:单VPS跑compose(日访1万以内)→ 拆MySQL到独立机器(日访3万)→ 应用跑2台+云LB(日访5万)→ 应用3到5台+自动扩缩容(日访20万以上)。不要跳步。CDN在LB之前先扛住静态流量,源站压力能降一半,见CDN全球加速。

阶段 部署形态 应用实例数 日访问量参考 月成本增量
起步期 单VPS+compose 1 <1万 0
成长期 应用1台+DB独立1台 1 1万至5万 +150元
稳定期 应用2台+云LB 2 5万至20万 +LB费约100元
峰值期 应用3至5台+自动扩缩容 3至5 >20万 +按小时计费

二、L4还是L7:独立站选哪一层

负载均衡分四层(L4,按TCP/IP转发)和七层(L7,按HTTP路径转发)。L4性能高、配置简单,但只能按端口转发;L7能根据域名、路径、Header做路由,还能做灰度和HTTPS卸载。独立站选L7,因为你需要按路径分流:静态文件走CDN,API走应用,后台走另一组实例。

云厂商的LB选择:AWS用ALB(应用负载均衡器),阿里云用SLB或ALB,腾讯云用CLB。三者功能重叠,价格每月100至200元起。一个判断标准:如果你的需求只是”两台机器轮询”,用最便宜的四层LB;如果需要按路径路由、做灰度、按域名分流,选七层LB。

对比项 L4 TCP负载均衡 L7 HTTP负载均衡
转发依据 IP+端口 域名/路径/Header/Cookie
性能 极高,微秒级 稍低,毫秒级
HTTPS卸载 不支持 支持,证书放LB
灰度发布 不支持按流量比例 支持按权重切流量
独立站适用 简单双机轮询 多路径路由、灰度
月费参考 约80至120元 约150至250元

三、健康检查:怎么配才不会误杀

健康检查是LB的核心。配太松,挂掉的机器还在接流量;配太紧,应用刚启动慢一点就被误摘,导致雪崩。独立站的标准配置是:检查路径/health(只返回200,不查数据库,避免把DB慢传染到LB)、间隔10秒、连续3次失败才摘除、连续2次成功恢复。

/health接口必须轻量。常见错误是让它查一次MySQL连接,结果数据库抖动时所有应用实例都被LB摘光,全站503。正确做法是/health只返回进程存活状态,数据库健康度走独立的/health/db接口,只监控不参与摘除决策。监控告警的阈值见站点监控与告警。

参数 推荐值 说明 常见错误
检查路径 GET /health 不查DB,只返回200 查DB导致全摘
检查间隔 10秒 平衡灵敏和误杀 1秒太激进
超时时间 5秒 超过算一次失败 1秒太短
不健康阈值 连续3次失败 摘除节点 1次失败就摘
健康阈值 连续2次成功 恢复入队 1次成功就恢复
响应码 200算健康 其他码算失败 把503当健康

四、会话保持:能不开就不开

很多人第一次上多实例时第一反应是”用户在A机登录,下一个请求打到B机不就掉线了”,于是开了会话保持。这是个短期省事、长期还债的做法。会话保持的问题在于:一旦A机挂了,所有粘在A机上的用户全部掉线,故障转移的意义被抵消一半。

正确做法是把会话从应用内存里拿出来。PHP用Redis存session,Node用JWT无状态token,登录态全部集中到一个共享存储里。这样任何一个应用实例都能处理任何用户的请求,挂掉任意一台不影响在线用户。只有两种情况才开会话保持:老系统改不动、或者第三方插件强依赖本地session。

会话方案 扩展性 故障影响 迁移成本 推荐度
本地文件session 差,必须sticky 单机挂=用户掉线 低 不推荐
Redis集中session 好 无感切换 中,改配置即可 推荐
JWT无状态token 最好 无感切换 高,要改鉴权 新项目推荐
LB cookie粘性 差 粘的机器挂则掉线 低,开开关即可 仅临时过渡

五、故障转移:怎么验证你的LB真的会切

配完LB不等于故障转移生效。很多团队上线后从没主动杀过一台机器,直到真挂了才发现LB根本没配健康检查,或者安全组没放行。上线前必须做一次主动故障演练:在生产环境(或预发)手动杀掉应用A,观察LB是否在30秒内把流量切到B,用户请求是否无感。

另一个常见坑是两台应用实例在同一台物理机或同一个电源机架上,整机架断电等于两台一起挂。至少跨两个可用区(AZ)部署,或者至少跨两台不同宿主机。备份与恢复演练的完整方法论见网站备份与恢复演练。

场景示例:某B2B站原来单台VPS跑WordPress,一次凌晨宿主机维护断电,站点宕机4小时,期间错过3封欧洲客户询盘。事后加了第二台应用实例挂到云LB,session改存Redis,跨可用区部署。再一次维护窗口,实例B自动接走全部流量,客户和销售都没察觉。多花的每月300元实例费,远低于一次宕机丢的询盘价值。

演练场景 操作 预期结果 不通过怎么办
杀应用进程 systemctl stop app 30秒内LB摘除,流量切B 查健康检查路径
断应用网络 iptables阻断端口 10秒内摘除 查安全组放通LB网段
机器重启 reboot 启动后自动恢复入队 查启动脚本和health
数据库抖动 慢查询注入 应用不被误摘 health不能查DB
全流量切B 权重调100到B B独自扛住5分钟 压测B的承载能力

FAQ 常见问题

日访多少需要上负载均衡?
没有绝对数字,但三个信号出现两个就该上:单台4核8G CPU长期超60%、发布必须停机、已经因为单机故障丢过询盘。独立站的现实是日访5万以内单台机器加CDN足够。先把CDN配上、把静态资源剥离,源站压力能降一半,很多时候根本不需要多实例。
会话保持到底要不要开?
默认不要开。把session挪到Redis或改成JWT,让应用无状态,这样任何实例都能处理任何请求,单机故障用户无感。开了sticky session,挂掉那台机器上的用户全部掉线,等于故障转移白做。只有老系统实在改不动本地session依赖时,才临时开cookie粘性过渡。
健康检查为什么不能查数据库?
因为数据库抖动会传染到LB。如果/health接口里查了一次MySQL,慢查询超过5秒,LB会判定这台应用不健康;所有应用实例同时查DB,就会同时被判定不健康,全站503。正确做法是/health只返回进程存活,DB健康度走独立监控指标,不参与LB摘除决策。
两台实例放在同一台物理机上行不行?
不行,等于没做故障转移。同一台物理机断电或宿主机故障,两个实例一起挂。至少跨两个可用区(AZ),或者至少跨两台不同宿主机。云厂商通常允许在创建实例时指定不同物理机策略。如果预算只能买两台,那就选不同可用区。
云厂商的LB月费多少?
L4大约每月80至120元,L7大约150至250元,另外按流量计费每GB约0.5元。独立站月流量通常几百GB,总LB费用控制在200元以内。AWS ALB稍贵,基础费约20美元/月+流量费。预算紧张可以用Nginx自建LB,月成本省下来,但要自己维护高可用。
怎么验证故障转移真的生效?
上线前做一次主动演练:在预发或生产低峰期,手动stop应用A进程,用curl持续打LB,观察请求是否在30秒内无错误地切到B。再测试机器重启后是否自动恢复入队。如果演练不通过,不要上线——真实故障时没人给你30秒排错时间。

写在最后

负载均衡对独立站的价值,一半是扛流量,另一半是扛故障。前者很多人能算清,后者常被忽略——多一台应用实例的成本,换来的是”一台机器挂了用户无感”,这在B2B询盘场景里就是钱。

落地三步:第一步把应用无状态化,session进Redis;第二步起第二台实例,挂到云LB后面,健康检查配好;第三步做一次杀进程演练,确认30秒内流量切走。三步走完,多实例架构才算真正可用。配套的监控告警见站点监控与告警,自动扩缩容的进阶见自动扩缩容。

一句可以记住的话:负载均衡的意义不是分流,是让任何一台机器挂掉时,用户和询盘都察觉不到。

环形山
环形山 环形山专家

机构官方 · 环形山 Crater

环形山(Crater)是一家专注 WordPress 独立站开发 + Google SEO + GEO 全域增长的出海服务公司,服务智能硬件、工业装备、SaaS、新能源等赛道。

产品能力方法论白皮书行业报告
965篇分享
78篇知识库