
在华为云上买了 ELB,再挂两台 ECS,不等于业务已经高可用。两台后端如果仍在同一可用区,健康检查只测端口存活,发布时直接停进程,故障时依然可能整站中断。
真正可验证的高可用,需要把流量入口、跨可用区部署、后端服务器组、健康检查、安全组、应用状态和发布流程放在一起设计。本文以 Web/API 服务为例,给出一套从架构到故障演练的实施清单。
一、ELB 解决什么问题,不能解决什么问题
华为云官方说明中,弹性负载均衡(ELB)会由监听器接收请求,再按后端服务器组和分配策略把流量转发给健康的后端服务器。独享型支持加权轮询、加权最少连接、源 IP、连接 ID 等策略;具体能力与区域、实例类型应以控制台为准。
参考:ELB 工作原理。
ELB 可以:
- 消除单台 ECS 的入口单点;
- 把请求分散到多个健康后端;
- 配合权重做灰度或逐步摘流;
- 通过健康检查自动停止向异常节点转发流量;
- 配合多可用区部署提升故障隔离能力。
ELB 不能自动修复:
- 数据库单点与连接池耗尽;
- 本地会话、上传文件或定时任务造成的状态不一致;
- 所有 ECS 位于同一可用区的风险;
- 健康检查路径"假健康";
- 发布脚本同时重启全部节点的问题。
二、推荐的跨可用区拓扑

基础生产拓扑可以这样设计:
- 在同一 VPC 内部署 ELB;
- 至少两台 ECS,分布到同一区域的不同可用区;
- 后端 ECS 使用相同镜像、应用版本和运行参数;
- 会话放入共享缓存或数据库,上传文件放入对象存储或共享存储;
- 数据库、缓存与消息队列也要有自己的高可用方案;
- 监控同时覆盖 ELB、后端 ECS 和业务接口。
华为云文档说明,可用区之间物理隔离、同区域内网互通;若目标是提高应用高可用性,建议将 ECS 创建在不同可用区。可用区和规格供应情况以控制台为准。
参考:ECS 自定义购买与可用区说明。
三、选择四层还是七层监听器
四层:TCP、UDP、TLS 等连接级流量
适合自定义 TCP 服务、数据库代理、消息协议或不需要基于 URL 路由的场景。优势是转发路径简单,但健康检查和路由表达能力相对有限。
七层:HTTP、HTTPS 请求级流量
适合网站和 API,可按域名、路径等规则转发,也更适合使用专用健康检查 URL。若需要在 ELB 终止 HTTPS,要统一规划证书、TLS 策略、后端协议和真实客户端 IP 获取方式。
不要只因为"七层功能多"就一律选择七层。先确认协议、加密终止位置、客户端 IP、会话保持和性能需求。
四、健康检查路径必须反映业务是否可服务
官方文档说明,ELB 会定期请求后端;异常节点停止接收业务流量,恢复后再自动加入。健康检查过于频繁也可能增加敏感业务负担,应按实际情况配置间隔、超时和阈值。
参考:华为云 ELB 健康检查介绍。
推荐为应用提供独立端点:
nginx
location = /healthz {
access_log off;
default_type application/json;
return 200 '{"status":"ok"}';
}
但生产环境不应只返回固定的 200。更稳妥的做法是分层:
/livez:进程是否存活;/readyz:是否已加载配置、能处理请求;/healthz:按需检查关键依赖,但设置短超时,避免级联阻塞。
健康检查参数应结合恢复目标设置:
- 协议与业务层次匹配;
- 端口确实由目标进程监听;
- 路径以
/开头且稳定返回期望状态码; - 超时时间小于检查间隔;
- 正常/异常阈值在误判与切换速度之间平衡。
创建后端服务器组时,当前独享型健康检查可选能力及参数范围可能随区域发布,需以控制台实际显示为准。
参考:创建独享型后端服务器组。
五、安全组不放通,后端永远"不健康"
把 ECS 加入后端服务器组后,如果安全组或网络 ACL 阻断健康检查,ELB 会把正常应用判为异常。上线前需要核对:
- 健康检查协议和端口是否放通;
- 业务端口是否允许来自 ELB 的流量;
- 使用共享型或独享型 ELB 时,源地址规则是否符合对应文档;
- 子网网络 ACL 是否允许回程流量;
- 获取客户端 IP 后,应用防火墙规则是否仍正确。
华为云共享型 ELB 文档明确要求检查后端服务器的安全组与网络 ACL,并给出对应源网段规则;不同类型 ELB 的要求不能混用。
参考:配置后端服务器安全组。
在 ECS 内部可验证监听与响应:
bash
ss -lntp
curl -fsS http://127.0.0.1:8080/healthz
curl -fsS http://ECS_PRIVATE_IP:8080/healthz
六、灰度发布:先降权,再摘流,再更新

单节点发布流程建议:
- 将目标 ECS 权重逐步调低,或从后端组临时移除;
- 等待已有连接和业务请求自然结束;
- 停止应用、部署新版本并启动;
- 本机检查
/livez、/readyz、核心接口与日志; - 确认 ELB 健康检查恢复正常;
- 小权重放量,观察错误率和 P95;
- 恢复正常权重,再处理下一台。
检查节点是否还有连接:
bash
ss -Hnt state established '( sport = :8080 )' | wc -l
如果应用有 WebSocket、长轮询或大文件上传,应把连接排空时间设得更长,并确保客户端具备重连机制。
七、如何选择分配策略
| 业务特征 | 可优先评估的策略 | 注意事项 |
|---|---|---|
| 请求耗时接近、节点规格相同 | 加权轮询 | 权重应与后端容量匹配 |
| 请求耗时差异大、长连接多 | 加权最少连接 | 仍需观察连接是否等价于负载 |
| 需要源地址粘性 | 源 IP | NAT 后大量用户可能聚合为同一源 |
| 灰度或新旧规格混跑 | 权重分流 | 逐步放量并比较 P95/错误率 |
会话保持不是默认答案。能把会话外置时,优先让后端无状态化,这样扩容、故障切换和灰度发布更容易。
八、故障演练怎么做
在维护窗口或隔离环境逐项演练:
- 停止一台 ECS 的应用进程;
- 观察健康检查从正常变为异常的时间;
- 验证外部请求是否持续成功;
- 恢复应用,记录重新加入所需时间;
- 模拟单个可用区后端全部不可用;
- 检查监控、告警与运维通知是否触发。
外部验证示例:
bash
for i in $(seq 1 100); do
curl -o /dev/null -sS \
-w '%{http_code} %{time_total}\n' \
https://your-domain.example/healthz
done
记录切换窗口内的失败请求数、P95、后端健康状态与连接数,而不是只看"页面最后能打开"。
九、常见误区
- 两台 ECS 放在同一可用区:解决了实例故障,没有解决可用区故障。
- 健康检查只探测端口:进程在监听,不代表数据库连接池和关键依赖可用。
- 所有节点一起重启:ELB 没有健康后端时无法创造可用性。
- 把安全组全部放开:应按官方要求只放通必要来源、协议和端口。
- 开启会话保持后忽略节点状态:粘性会话可能让单节点压力不均。
- 只监控 ELB,不监控业务:入口健康不代表订单、登录和支付链路健康。
十、购买与扩容建议
如果目前只有一台华为云 ECS,且业务需要持续在线,优先评估 ELB 加跨可用区双节点,而不是单纯把一台机器升级得更大。两台后端的规格应由单节点故障时的剩余容量决定:任何一台下线后,其余节点仍需承载关键流量。
对于潮汐业务,可进一步评估 ELB 配合弹性伸缩,华为云官方场景文档说明伸缩新增或移除的 ECS 可与后端服务器组协同。上线前仍要验证镜像一致性、启动时间、健康检查和数据库容量。
参考:华为云 ELB 应用场景。
真正值得购买的高可用方案,不是"有一个 ELB 图标",而是跨可用区 ECS、正确健康检查、最小权限网络规则、无状态应用和可重复故障演练共同构成的系统。