news 2026/5/12 10:08:52

向量库的 48 小时沉默

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
向量库的 48 小时沉默

从一个no available streaming node错误开始,还原一场持续两天的单机 Milvus 离奇停服。

在最近维护智能检索系统时,业务方突然反馈数据写不进去。我打开监控一看,Milvus 端口还在,但所有写入请求全部超时。翻开日志,凌晨 3:10 的几条报错让我后背一凉——服务已经“沉默”了整整两天,而我直到上班后才发现。天真的我以为单机部署、数据量不大就没问题,结果现实给我狠狠上了一课。

一、从“写入卡死”说起:问题浮现

那天登录服务器后,容器看起来一切正常,端口监听也没挂。但一查 Milvus 日志,这几行 WARN 和 ERROR 暴露了真相:

[2026/05/06 03:10:24] [WARN] [balancer/balancer_impl.go:584] "channel of current server id is not healthy or not alive" [serverID=3] [error="streaming node is not alive"] [2026/05/06 03:10:24] [WARN] [balancer/balancer_impl.go:294] "fail to apply balance, start a backoff..." [error="fail to balance: no available streaming node"] [2026/05/06 03:10:24] [ERROR] [sessionutil/session_util.go:649] "confirm the lease is expired, the session is expired without activing closing" [role=streamingnode] [serverID=3]

系统里的流节点(streaming node)失联了,etcd 的租约到期被强制清除。协调器尝试重新分配通道,却发现没有任何可用节点,写入管道全部堵死。而这一“沉默”,就从 5/6 凌晨持续到了 5/8 上午。

这到底是为什么呢?我们来一探究竟。

二、探案过程:48 小时沉默的根源

请教了 GPT 同志,也翻出了 docker-compose 配置,真相逐渐浮出水面。

2.1 脆弱的“单机”设计

这是我的 docker-compose 关键部分:

standalone:container_name:milvus-standaloneimage:milvusdb/milvus:v2.6.11command:["milvus","run","standalone"]environment:ETCD_ENDPOINTS:etcd:2379MINIO_ADDRESS:minio:9000MQ_TYPE:woodpecker# 内嵌消息队列# 没有 mem_limit,没有 restart 策略

standalone模式意味着所有组件都挤在一个容器里。MQ_TYPE: woodpecker是 Milvus 内置的轻量级流存储,WAL 数据和缓冲区全在进程内存中。serverID=3就是这唯一的 streaming node,没有任何备胎可以接管。

更要命的是——没有内存上限,也没有restart: unless-stopped。进程一旦非正常退出,Docker 不会自动重启,只能等人来捞。

2.2 “无声的告别”

日志里最关键的线索是那句session is expired without activing closing。程序如果正常 shutdown,会主动向 etcd 注销 session。这里明确说“没有主动关闭”,说明进程是被外力瞬间终止的——最典型的就是 OOM Killer 或容器被 kill。

我的理解是,凌晨某个批量写入任务触发 Woodpecker 内存暴涨,宿主机内存吃紧后内核的 OOM Killer 选中了milvus-standalone。进程被暴力杀死,来不及向 etcd 道别,租约超时后 session 判死。协调器发现唯一流节点消失,整个写入链路就此瘫痪。因为没有自动重启,服务一躺就是 48 小时。

2.3 日志中的沉默时间线

05/06 03:10:24 流节点失联,balancer 进入退避重试 session 过期,写入通道全部阻塞 05/06 ~ 05/08 容器进程持续死亡,端口无响应 05/08 08:06:11 服务重新启动,加载配置,连接 etcd "Hook avx for go simd distance computation"

整整两天的沉默窗口,没有任何恢复迹象。这 48 小时里,业务方一直在“盲写”,数据全丢了(除非客户端有重试队列)。

三、解决方案:让沉默不再重现

找到了病根,方案就清晰了。

方案一:紧急止血(立刻生效)

给容器加上重启策略和内存限制,防止 OOM 后一躺不起:

standalone:mem_limit:8g# 根据实际负载调整restart:unless-stopped# 挂了自动拉起

这样即使进程被杀,Docker 也会自动重新拉起,沉默时间从 48 小时压缩到几十秒。

方案二:治本(生产环境推荐)

Woodpecker 是为测试设计的,生产环境应替换为独立部署的消息队列:

standalone:environment:MQ_TYPE:pulsarPULSAR_ADDRESS:pulsar://pulsar:6650depends_on:-pulsar

如果想彻底告别单点,应切换到分布式部署,至少两个 streaming node 副本。一个挂了,另一个无缝接管,balancer 再也不用报“no available node”。

注意事项

  • mem_limit时预留 2~4GB 给宿主机系统,别顶满整机内存
  • Woodpecker 换 Pulsar 后,需先停服迁移数据,不能热切换
  • Pulsar 本身也需独立部署和监控,别又引入新的单点

四、工具箱:单机部署自查清单

我整理了一份自查清单,以后每次部署 Milvus 单机版时逐条过一遍:

- [ ] 容器是否配置了 mem_limit?(至少 8GB) - [ ] 是否设置了 restart: unless-stopped? - [ ] MQ_TYPE 是否为独立中间件(Pulsar/Kafka)而非 Woodpecker? - [ ] etcd 的 quota_backend_bytes 和压缩策略是否合理? - [ ] 是否对内存、心跳超时设置了监控告警? - [ ] 是否设置了关键日志的错误报警(如 "no available streaming node")? - [ ] 数据是否有定期备份?

五、我有话说

这次事故让我深刻体会到两件事:第一,“单机版”不是“免维护版”,它反而因为没有冗余而更脆弱;第二,沉默的故障最可怕——服务没报 500、端口没挂、容器也没停,但它就是悄悄地不再干活了。如果没有主动监控,靠用户报告才发现,代价已经太大了。

AI 在这次排查中帮我快速定位了关键错误和根因方向,但填坑的 actions——加内存限制、配自动重启、换掉 Woodpecker——还得我自己来。AI 像一面镜子,照出了问题,但修镜子的人还是工程师自己。

时间静止不是简史,我们下期见。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 10:07:48

2013-2024年上市公司子公司与政府采购数据匹配结果

上市公司子公司与政府采购数据匹配结果2013-2024上市公司子公司数据与政府采购数据匹配结果的时间范围为 2013~2024 年,经过匹配之后一共得到了 100679 条匹配结果:包含的变量如下:zgsid、 cgid、年份、合同名称、详情链接、签订时…

作者头像 李华
网站建设 2026/5/12 10:04:35

开发AI应用时借助Taotoken模型广场轻松进行模型选型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时借助Taotoken模型广场轻松进行模型选型 在构建智能应用的初期,开发者常常面临一个核心问题:市…

作者头像 李华
网站建设 2026/5/12 10:01:43

[具身智能-645]:空间信息用于区分几何形状、位姿、空间位置,这是图像的主要目标;时间信息用于区别动作,包括行为动作和声音动作,前者是视频,后者是语音识别。

这段话视图总结得极其精准,把视觉、语音、行为识别的底层使命彻底拆透。下面我们一起把这套逻辑系统化、公式化、定型化,固化成具身智能多模态感知的底层公理。一、核心定理空间信息 → 负责静态世界理解区分:几何形状、大小、结构、位姿、空…

作者头像 李华
网站建设 2026/5/12 9:58:51

Windows和Office激活难题终结者:KMS智能激活脚本全攻略

Windows和Office激活难题终结者:KMS智能激活脚本全攻略 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾为Windows系统那恼人的激活提醒而烦恼?是否因为Office突然…

作者头像 李华
网站建设 2026/5/12 9:54:32

一次文件打开背后的安全审查:用strace和源码图解LSM Hook的工作流程

从文件打开窥探Linux安全机制:strace与LSM Hook深度解析 当你用cat /etc/passwd查看系统文件时,看似简单的操作背后其实经历了一场严格的安全审查。作为Linux开发者或安全研究员,理解这个过程中的安全机制至关重要。本文将带你用strace工具和…

作者头像 李华