做到高可用
高可用的核心是消除单点:单模型多节点 → 单供应商多份 → 多实例共享状态。本页串起网关的相关能力,不重复建 LB 的逐步操作(见 多上游负载均衡)。
目标与失效面
| 失效面 | 典型原因 | 对策 |
|---|---|---|
| 单把上游 key 失效 | 限流、被吊销 | 上游配多 key,失败自动轮换 |
| 单个上游实例不可用 | 上游宕机、网络分区 | 同模型多上游做 LB |
| 单个供应商不可用 | 供应商级故障 | 跨供应商 LB |
| 单个网关进程不可用 | 进程崩溃、主机故障 | 多实例 + 共享存储 |
单模型多节点:负载均衡器
把同一模型的多个上游+模型组合做成一个负载均衡器的 entries,客户端只调 LB name。某节点返回可重试错误(5xx、连接/读取超时)时,网关自动换节点重试。建法见 创建负载均衡器 与 多上游负载均衡 的案例 A。
供应商级容灾
主用 OpenAI、备用 Azure OpenAI 的 LB:两个 entry 不同上游、不同模型名,retry_on_different_node=true。主节点全挂时切到备用。见 多上游负载均衡 的案例 B。
重试与流式的边界
- 重试次数受
MAX_UPSTREAM_RETRIES控制(见 负载均衡字段)。 - 流式重试仅在第一个 SSE 数据块发出之前尝试。一旦客户端开始接收数据,不能中途换节点——否则会破坏已发出的部分状态。因此流式场景的故障转移窗口在「首字节前」。
探针与灰度下线
/health返回 200 即存活。/ready在数据库不可达或网关排空(drain 模式)时返回 503——把外部负载均衡器(Nginx / ALB)的健康检查指向/ready,可在网关排空时自动停止分发流量,实现灰度下线与零停机重启。
多实例共享状态
单机用 SQLite;多实例用 PostgreSQL 共享统计与配置(控制台改动 30s 跨实例同步),并配 Redis 共享会话/限流/IP 封禁/日志广播。字段见 环境变量配置参考 的 STORAGE_MODE / POSTGRES_URL / REDIS_URL。
不配 Redis 的多实例
多实例不配 Redis 时,会话、限流、IP 封禁都退化为每实例独立——一个调用方的失败次数分散到不同实例上,封禁阈值形同虚设。多实例务必配 Redis。
上线前自检
见 上线检查清单。
常见问题
Q:流式响应中途上游断了怎么办? 首块已发出则不换节点,网关记录 body_incomplete 并把已收部分返回客户端。客户端按 SSE 协议处理中断。
Q:备用节点(weight=0)什么时候启用? 仅当所有 weight > 0 的正常节点都不可用时。正常节点恢复后流量自动切回。
Q:多实例的会话怎么共享? 会话存于 Redis(REDIS_URL),所有实例共享;不配 Redis 则每实例独立,登录只对当前实例生效。
