LanceDB 图片库事故复盘:manifest 混链导致 /api/images 与搜图 500 的定位与恢复
这篇文章完整复盘了一次 LanceDB images.lance 快照一致性事故,并给出了从止血到全量恢复的可执行路径。事故现象与影响受影响接口包括 /api/images/:id-or-filename、/api/image-search、/api/image-search-text,均出现大量 500。后端日志核心…
LanceDB 图片库事故复盘:manifest 混链导致 /api/images 与搜图 500 的定位与恢复 Code Version: StaticFlow 6bd6f64 Data Repo Snapshot During Recovery: ce4037b (/mnt/e/static-flow-data/lancedb)1. 事故摘要 本次事故表现为:GET /api/images/:id-or-filename 大面积 500GET /api/image-search / GET /api/image-search-text 大面积 500前端图片卡片和搜图功能不可用 典型错误日志(后端):LanceError(IO): External error: Not found: .../images.lance/data/<file>.lance 核心结论:images.lance 处于“元数据版本链与 data 文件集合不一致”的损坏状态。运行时读取到了 421.manifest(大快照)但 data/ 目录只剩小集合(最初仅约 91 个)421.manifest 实际需要约 386 个 data 分片扫描时命中缺失分片,触发 IO Not Found2. 背景与作用域2.1 关键数据路径内容库:/mnt/e/static-flow-data/lancedb目标表:images.lance版本元数据:images.lance/_versions/*.manifest事务元数据:images.lance/_transactions/*.txn数据分片:images.lance/data/*.lance2.2 与业务接口的对应关系 下列接口都会进入 images 表扫描路径:GET /api/images(分页列表)GET /api/image-search(以图搜图)GET /api/image-search-text(文本搜图)GET /api/images/:id-or-filename(按 ID/文件名取图片) 对应后端入口见:backend/src/handlers.rs:1884 list_imagesbackend/src/handlers.rs:1904 search_imagesbackend/src/handlers.rs:1930 search_images_by_textbackend/src/handlers.rs:1968 serve_image 对应 LanceDB 扫描路径见:shared/src/lancedb_api.rs:874 list_imagesshared/src/lancedb_api.rs:926 search_images_by_textshared/src/lancedb_api.rs:1017 search_imagesshared/src/lancedb_api.rs:1167 查询路径诊断日志 Query path selected3. 时间线(关键节点) | 时间 | 事件 | |------|------| | T0 | 前端反馈图片请求与搜图随机失败,后端日志出现 LanceError(IO): Not found ...images.lance/data/... | | T0+ | 排查确认并非 HTTP/代理问题,而是 LanceDB 数据层缺分片 | | T0+ | 发现 images.lance/_versions 同时存在 421.manifest 与 61.manifest | | T0+ | 首次应急:临时移出 421.manifest + 420.txn,服务回落到 61,接口恢复但图片总量明显变少 | | T0+ | 深挖证据链,确认 421 是大快照(386 行),61 是小快照(30 行) | | T0+ | 发现 421 所需分片大多并未落地,但对应 LFS 对象仍在本地 .git/lfs/objects | | T0+ | 执行全量恢复:从本地 LFS 对象补回 421 需要的分片(恢复 295 个,保留 91 个已存在) | | T0+ | 二次验证:images 恢复到 386 行,/api/images/* 与 image-search* 全部恢复 200 |4. 现象与影响4.1 直接影响首页与文章页部分封面无法加载搜图页功能不可用以图搜图结果无法返回用户体验为“随机可用/不可用”,实质是查询路径触发到缺失分片时才报错4.2 为什么会“有时能用,有时不能用” images 表扫描是按查询路径命中的数据分片来读的:某次查询恰好命中已存在分片:返回 200某次查询命中缺失分片:直接 500 这会造成“随机性”,但本质是数据集…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行