负载均衡设计:多节点集群下的请求分发与资源调度

📅 发布时间:2026/7/6 17:48:07 👁️ 浏览次数:
负载均衡设计:多节点集群下的请求分发与资源调度
当单一节点的算力被榨干DeepSeek服务的QPS仍无法满足业务需求时横向扩展Scale-out是唯一的出路。构建一个包含数十台甚至上百台昇腾服务器的推理集群核心在于设计一套高效、可靠的负载均衡Load Balancing系统。这不仅仅是简单的“轮询分发”在大模型推理场景下我们需要面对长连接保持、KV Cache复用、故障快速剔除等一系列挑战。1. 架构分层流量的漏斗一个典型的生产级推理集群架构流量通常经过三层分发就像一个漏斗逐层筛选和路由1.1 Layer 4: 传输层负载均衡工具LVS, F5, AWS NLB职责处理TCP连接将公网海量流量分发到各个可用区AZ的入口。特点吞吐量极高但不理解HTTP协议无法查看请求内容。1.2 Layer 7: 应用层负载均衡工具Nginx, HAProxy, Kubernetes Ingress职责处理HTTP/gRPC请求解析URL、Header和Body。关键动作鉴权Auth验证API Key。路由Routing根据URL前缀如/v1/chat/completions将请求转发到对应的服务集群。限流Rate Limiting防止恶意DDoS攻击。1.3 Application Router: 智能调度层工具自研网关, Istio VirtualService职责在微服务内部根据模型ID、用户TierVIP/免费用户或缓存命中情况将请求转发到具体的推理Pod。2. 核心挑战与调度算法大模型推理与传统的Web服务如查询用户信息有本质区别这也决定了我们不能直接照搬传统的调度策略。2.1 挑战一请求耗时方差极大请求A用户问“你好”输出5个Token耗时0.1秒。请求B用户让写一篇小说输出2000个Token耗时20秒。如果使用Round Robin轮询算法可能会导致某台机器运气不好连续接到了几个“写小说”的长任务显存和算力被占满而下一台机器却在处理“打招呼”处于空闲状态。这就是著名的Head-of-Line Blocking队头阻塞。推荐算法Peak EWMA (指数加权移动平均)负载均衡器维护每个后端节点的“未完成请求数”和“响应延迟”。如果节点A处理得快说明它负载低或算力强权重自动调高。如果节点B卡住了权重自动降低。这种动态调整机制能让流量像水一样自动流向阻力最小的地方。2.2 挑战二Context Caching与会话保持DeepSeek支持多轮对话。为了降低Prefill开销我们希望同一个用户的后续请求能打到同一台机器上以便复用显存中已经计算好的KV Cache。解决方案Consistent Hashing一致性哈希提取请求Header中的Session-ID或User-ID。计算 Hash 值映射到对应的Pod。注意这与负载均衡有冲突。如果某台机器过热必须打破亲和性将新请求调度到空闲机器虽然会牺牲Prefill性能但保证了可用性。3. Nginx配置实战对于中小型集群50节点一个配置合理的Nginx就能解决80%的问题。http { upstream deepseek_cluster { # 策略最少连接数比轮询更好 least_conn; # 所有的推理节点 server 192.168.1.101:8000 max_fails3 fail_timeout30s; server 192.168.1.102:8000 max_fails3 fail_timeout30s; server 192.168.1.103:8000 max_fails3 fail_timeout30s; # 保持与后端的长连接避免频繁握手 keepalive 64; } server { listen 80; location /v1/chat/completions { proxy_pass http://deepseek_cluster; # --- 关键配置开始 --- # 1. 禁用缓冲支持SSE流式输出 # 如果开启缓冲Nginx会等后端发完所有数据才一次性推给客户端 proxy_buffering off; # 2. 超时设置防止长任务被掐断 proxy_read_timeout 600s; proxy_send_timeout 600s; # 3. HTTP/1.1支持WebSocket和Keep-Alive必需 proxy_http_version 1.1; proxy_set_header Connection ; # --- 关键配置结束 --- } } }4. 动态扩缩容HPA策略在Kubernetes环境中我们希望集群能根据负载自动伸缩Auto Scaling。传统的HPA通常基于CPU利用率。但在推理场景下CPU往往不是瓶颈瓶颈是显存或NPU算力CPU低不代表系统不忙。最佳实践基于自定义指标Custom Metrics扩容我们需要安装prometheus-adapter将业务指标暴露给K8s HPA控制器。4.1 黄金指标Pending Queue Length等待队列长度最直接的指标。一旦队列里有积压例如 5说明现有算力已经处理不过来了必须立即扩容。Average Token Generation Latency平均生成延迟如果生成速度从 50 tokens/s 掉到了 20 tokens/s说明由于Dynamic Batching导致的并发过大需要扩容分摊压力。4.2 HPA配置示例apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:deepseek-hpaspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:deepseek-inferenceminReplicas:2maxReplicas:20metrics:-type:Podspods:metric:name:waiting_queue_size# 自定义指标target:type:AverageValueaverageValue:5# 目标每个Pod的等待队列不超过5个5. 熔断与降级Circuit Breaking当集群过载时必须有保护机制否则会发生雪崩效应。熔断如果某台节点连续返回500错误或超时Nginx/网关应在一段时间内如30秒不再向其转发请求。降级排队当并发达到上限新请求进入全局队列等待。拒绝当队列也满了直接返回429 Too Many Requests保护系统不被压垮。模型降级如果是混合部署可以在高峰期将请求转发给参数量更小、速度更快的模型如DeepSeek-7B - DeepSeek-1.3B。6. 总结负载均衡不仅仅是分发请求更是对计算资源显存、算力的精细化调度。在接入层用Nginx处理长连接和流式响应。在调度层用Peak EWMA解决长尾任务导致的负载不均。在资源层用基于队列长度的HPA实现弹性伸缩。构建这样一套弹性的负载均衡体系DeepSeek服务才能像自来水一样无论用户用水量多大始终保持水流稳定既不枯竭拒绝服务也不爆管雪崩宕机。