跳到正文

做到高可用

高可用的核心是消除单点:单模型多节点 → 单供应商多份 → 多实例共享状态。本页串起网关的相关能力,不重复建 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 则每实例独立,登录只对当前实例生效。

下一步多租户隔离 看隔离;上线检查清单 看上线自检;负载均衡字段 看字段。