目标
直接关机会切断所有在途请求,用户正是从断成两半的上传里得知你要维护。礼貌的退出是健康检查翻转:节点自报不健康、负载均衡一个间隔内停止新流量、在途请求自然跑完、维护发生在安静的节点上。礼貌的返回走同一扇门:先就绪、再健康,流量由均衡器按自身节奏回灌。
步骤要点
- 给 /healthz 加维护模式分支:maintenanceMode 时返回 503,均衡器随健康检查自动摘除节点。
- 盯 inflight_requests 与 active_connections 指标衰减到零,目送真实请求完成而不是切断它们。
- 检查本节点访问日志不再有新流量,确认其余节点已接住全部请求。
- 在零流量节点上执行维护(停服务、VACUUM、起服务),上层集群全程服务。
- 恢复同样分阶段:先过自身 /readyz 预热检查,再把健康翻回 200,由均衡器按间隔逐步回灌。
排错提示
在途数永不归零是卡死的长上传或 WebSocket,应设最大排水时限并通知客户端后再切;翻健康后仍来流量说明检查间隔与失败阈值太长,临时缩短或直接用均衡器 API 排空;节点提前回归是就绪探针没反映预热,把健康翻转挂在缓存与迁移完成的就绪端点之后。
适用边界
排水保护的是请求不是会话,有状态会话需要协议级连接排空或客户端重连;单节点部署无处可排,本食谱至少需要两个服务实例。
代码示例
// The traffic switch that needs no balancer access
app.get("/healthz", (req, res) => {
if (maintenanceMode) return res.status(503).end();
res.status(200).end();
});