- 初步总结
- 1)WAL delta 传输在之前 full transfer 中止后导致副本损坏
- 2)瞬时磁盘 I/O 错误导致 flush 丢失变更、潜在数据损坏
- 3)删除不相关 shard 时,错误中止了正在进行的 shard 传输
- 4)Gridstore 在快速交替插入/删除时 flush 错误,导致潜在数据损坏
- 5)Gridstore 在并行清理存储时出现 flush 数据竞争,导致潜在数据损坏
- 6)带“奇怪字符”的集合名导致快照传输失败等问题
- 7)快照相关 metrics 在值为 0 时不上报
- 8)panic 时遥测错误地报告优化(optimization)错误
- 9)优化运行时收到 SIGINT 关闭很慢
- 10)Qdrant 在 Windows ARM64 上无法构建
- 11)开发版中保留 RocksDB 支持到 1.18.0
- 整体判断:这些 Bug “实际运维决策”的意义
- 总结:一句话概括 v1.16.3 的 bug 修复价值
初步总结
下面是基于 v1.16.3 官方 Release Notes 已有信息,对“每个 Bug 的触发场景、影响、以及具体解决了什么问题”的系统性分析,重点放在你作为使用/运维 Qdrant 的人,什么时候会踩坑、会出什么问题、升级后具体避免了什么。
地址:https://github.com/qdrant/qdrant/releases/tag/v1.16.3
从官方变更记录看,v1.16.3 的 Bugfix 高度集中在三块:
- 数据一致性 & 持久化(最关键,可能导致数据损坏/丢失)
- WAL 增量传输(delta transfer)在中断后的错误恢复
- flush(刷盘)在瞬时 I/O 错误或并发场景下丢数据 / 数据竞争
- Gridstore 底层存储在高并发 insert/delete、并行清理时的数据损坏
- 集群传输和运维稳定性
- 删除分片时误中止其他分片的传输
- 优化任务运行中收到 SIGINT 关闭很慢
- 快照、监控和平台兼容性等“边缘但实用”的问题
- 特殊字符集合名导致快照传输失败
- 快照相关 metrics 在为 0 时不报
- panic 时遥测误报优化错误
- Windows ARM64 构建失败
- RocksDB 支持在开发构建中保留到 1.18.0
下面按官方列出的 11 条 bugfix,逐条拆解:触发场景 → 影响 → 修复点 / 实际解决的问题。
1)WAL delta 传输在之前 full transfer 中止后导致副本损坏
PR: #7787, #7791
触发场景
典型在 集群 / 多节点复制场景 中出现:
- 节点 A 想把某个 shard 的数据完整同步给节点 B:
- 先做一次 full transfer(全量传输)。
- full 过程中因为网络波动、节点重启、资源不足等原因被中止。
- 之后系统尝试用 WAL delta transfer(增量传输) 继续同步差异。
- 由于逻辑缺陷,在 full 没真正成功/完成的前提下就开始用 delta 接着往上“补”。
影响
- 副本节点上的数据是基于“不完整的基线”+“增量日志”组合出来的:
- 最终副本和主节点数据不一致;
- 查询结果可能错误;
- 在采用多副本投票/一致性策略时,可能出现“脑裂式”的不一致行为。
- 对你来说,表现可能是:
- 同一个集合在不同节点查询结果不同;
- 某些点查得到、某些查不到,甚至 payload 不一致。
修复点 / 实际解决的问题
- 修正 WAL 传输状态机:在上一次 full transfer 已被中止且未完成的情况下,不允许直接基于这个状态做 delta。
- 增强完整性检查,保证:
- 只有当 full transfer 达到可接受的一致性点后,才会继续使用 delta。
- 实际上解决的是:“中断后的错误接续”导致的副本数据损坏问题,让你在节点迁移/扩容/恢复时,不会因为一次中断就悄悄造出一个坏副本。
2)瞬时磁盘 I/O 错误导致 flush 丢失变更、潜在数据损坏
PR: #7801, #7805
触发场景
出现在任何需要刷盘的场景,尤其是:
- 磁盘有短暂抖动 / I/O 错误(云环境、虚拟化环境中非常常见):
- I/O timeout、临时忙、短暂 read/write error 等。
- 写入频繁、flush 频繁触发时,恰好被这些短时 I/O 错误打断。
影响
- flush 逻辑在这类瞬时错误下处理不当,会出现:
- 内存里已经“认为写成功”的修改,其实没真正落盘;
- 进程重启/崩溃后,从磁盘恢复时,发现部分数据回退到了“旧状态”;
- 极端情况还可能导致元数据与实际内容不一致,引发数据损坏。
- 换句话说:你以为 Qdrant 写进去了,其实没落盘,重启后“数据凭空消失或错乱”。
修复点 / 实际解决的问题
- 改进 flush 错误处理逻辑,针对瞬时磁盘 I/O 错误:
- 做更安全的重试或回退;
- 确保不会“悄悄丢数据”;
- 避免将未安全落盘的数据标记为“已持久化”。
本质上,这是一个**“在不稳定磁盘环境下,刷盘丢数据”的核心数据一致性问题**,v1.16.3 把它修正了。
3)删除不相关 shard 时,错误中止了正在进行的 shard 传输
PR: #7792
触发场景
- 你在集群中做分片管理操作,例如:
- 删除某个集合/某个 shard;
- 手动/自动做 rebalance;
- 此时另一个 shard 正在执行传输(迁移/复制);
- 由于逻辑 bug,删除某个 shard 时,会误把“本不相关的传输任务”也当作要中止的目标。
影响
- 本该成功完成的 shard 传输被 错误中止:
- 传输长期卡住;
- 副本永远“未完成 / 不就绪”;
- 甚至导致新节点无法完全接手数据,影响高可用。
- 对你来说,表现为:
- 集群有 shard 长时间处于 transferring / partial;
- 某些节点启动或收缩操作一直“卡”;
- 某些集合一直无法变为完全 green。
修复点 / 实际解决的问题
- 细化/修正“删除 shard 时影响范围”的逻辑:
- 只中止与 目标 shard 直接关联 的传输;
- 避免误杀其他 shard 的传输任务。
- 实际上解决的是:集群在频繁分片操作下,“无辜的 shard 传输被杀死”的稳定性问题。
4)Gridstore 在快速交替插入/删除时 flush 错误,导致潜在数据损坏
PR: #7741
触发场景
典型是高并发/高 churn 场景:
- 某集合上对同一范围的数据:
- 快速、大量交替执行 insert / delete / upsert;
- 如导入 → 纠错删除 → 再导入的流水线场景。
- 底层使用 Gridstore 存储(Qdrant 的一个存储后端)。
- 在这种“瞬时数据状态不断变化”的情况下触发了 flush 错误。
影响
- flush 在 Gridstore 中出错,会造成:
- 索引/存储的数据结构被写坏;
- 某些点“幽灵化”——看起来存在/不存在与预期不符;
- 高危时会出现 segment 无法正确读取。
- 直观表现可以是:
- 查询突然大量 500 / panic;
- 某些向量或 payload 无法访问,或返回奇怪结果。
修复点 / 实际解决的问题
- 修复 Gridstore 内部的刷盘逻辑,使其在 高频 insert/delete 交替场景 下依然:
- 正确跟踪当前数据状态;
- 安全写出一致视图;
- 不在中途发生结构破坏。
- 实际上解决的是:在 write-churn 很高的场景下,Gridstore 结构被 flush 写坏 的问题。
5)Gridstore 在并行清理存储时出现 flush 数据竞争,导致潜在数据损坏
PR: #7702
触发场景
- 同时发生:
- 某些线程在对 Gridstore 做 flush(写出当前状态);
- 其他线程在做 storage clear / wipe / cleanup 等并行操作。
- 由于并发控制不足,产生数据竞争(data race)。
影响
- 不同线程对同一部分存储的理解不同步:
- 一个线程认为“我要 flush 当前数据”,另一个线程认为“我在清空这块区域”;
- 结果是写入/清理互相踩踏;
- 最严重时直接造成数据损坏。
- 在你侧的表现:
- 在“删除集合/清理数据 + 高并发写入”的组合场景中,之后再访问该集合或相关 segment 可能异常。
修复点 / 实际解决的问题
- 修复 flush 过程中的数据竞争:
- 明确 flush 与 clear 操作的互斥关系;
- 或以更安全的方式进行顺序化/锁定;
- 从效果上看,v1.16.3 让 Gridstore 在“清理 + 写入并发”场景下更安全,不再因为数据竞争导致结构破坏。
6)带“奇怪字符”的集合名导致快照传输失败等问题
PR: #7759, #7782
触发场景
- 你的集合名中包含:
- 特殊字符(例如空格、非 ASCII、某些符号等);
- 在进行:
- snapshot 创建 / 下载 / 传输;
- 集群间 snapshot 恢复或迁移;
- 在这些路径上,对集合名的处理不一致或未正确 escape,导致操作失败。
影响
- 快照相关操作失败 / 中断:
- 无法成功导出 / 传输某些集合的快照;
- 无法在另一集群/节点上恢复;
- 这直接影响你做:
- 备份 / 恢复;
- 集群迁移 / 灰度环境复制。
修复点 / 实际解决的问题
- 统一并修正对集合名的处理(解析、序列化、路径拼接等):
- 能正确识别并处理“奇怪字符”;
- snapshot 操作不再被这些字符卡死。
- 对你来说,就是:以后集合名不那么“干净”也不会导致快照链路挂掉。
7)快照相关 metrics 在值为 0 时不上报
PR: #7788
触发场景
- 你监控 Prometheus 等 metrics 时,发现:
snapshot_creation_running/snapshot_recovery_running/snapshot_created_total等指标,在某些情况下 “消失”;
- 尤其在这些值为 0 时,指标并不总是被上报。
影响
- 监控与告警体系会误判:
- 无法区分“没有值” vs “值是 0”;
- 对基于“某值为 0 即健康”的规则不友好;
- 对排查问题、做 SLO/SLA 可观测性有负面影响。
修复点 / 实际解决的问题
- 修复 metrics 报告逻辑,即使为 0 也稳定上报:
- 方便你在监控面板中准确看到 snapshot 相关状态;
- 让告警更可靠。
- 实际上解决的是:“快照相关 metrics 在 0 值时不报,观测断层” 的问题。
8)panic 时遥测错误地报告优化(optimization)错误
PR: #7783
触发场景
- 系统发生 panic(崩溃)时:
- 遥测数据中会错误地把一些错误归因为“优化失败”;
- 例如某些与 optimizer 无关的问题,也被打上了 optimization error 的标签。
影响
- 运营/排障时容易被误导:
- 看到 telemetry / 日志说是 optimization error;
- 实际上根因可能在别处(I/O、存储、网络、其他逻辑)。
- 对构建内部监控、自动化告警也会造成噪音。
修复点 / 实际解决的问题
- 修正 panic 场景下的错误归因逻辑:
- 让优化错误真实地代表 optimizer 的问题;
- 减少误报。
- 本质是一个**“观测和告警质量”的修复**,避免你浪费时间在错误的方向排查。
9)优化运行时收到 SIGINT 关闭很慢
PR: #7765
触发场景
- 后台正在执行:
- segment merge、索引构建等优化任务;
- 此时你对进程发送 SIGINT(例如
Ctrl+C/ 容器优雅停止等),期望“较快停机”。
影响
- 由于优化过程阻塞或未合理响应 SIGINT:
- Qdrant 关闭变得很慢;
- 容器编排(K8s / docker)在等待 shutdown,超时后可能强制 kill;
- 部署/滚动升级体验变差。
修复点 / 实际解决的问题
- 调整优化任务对 SIGINT 的响应:
- 能更快中断或进入安全退出路径;
- 降低 shutdown 时长。
- 对你来说,升级后 服务停止/重启更可控,不容易因为优化卡死停机流程。
10)Qdrant 在 Windows ARM64 上无法构建
PR: #7690
触发场景
- 在 Windows ARM64 环境(例如部分开发机/CI/CD)上尝试构建 Qdrant。
影响
- 构建失败,无法在该平台本地编译运行或做测试。
修复点 / 实际解决的问题
- 修正构建脚本和相关依赖,使 Windows ARM64 成为一等公民平台之一。
- 如果你团队有这类环境需求,这个修复是“能不能用”的区别。
11)开发版中保留 RocksDB 支持到 1.18.0
PR: #7683
严格说这更像是行为调整而非典型“Bug 修复”,但 Release Notes 归在 bugfix 部分。
触发/背景
- Qdrant 一直在从 RocksDB 迁移/收口到新的存储后端;
- 出于兼容与迁移窗口考虑,在开发构建中延长 RocksDB 的支持周期到 1.18.0。
影响
- 使用 RocksDB 的旧环境在迁移过程中:
- 有更充裕的版本窗口;
- 可在 1.16.x – 1.18.x 之间逐步平滑迁移,而不是被迫一次性完成。
实际解决的问题
- 避免“升级某版本后 RocksDB 突然不可用”的兼容性风险;
- 对你来说,是 迁移存储引擎的“安全缓冲期”。
整体判断:这些 Bug “实际运维决策”的意义
结合上面分析,可以归纳成几个关键结论,方便你做版本决策:
- 如果你在生产使用 Qdrant 集群(尤其是多副本 + 大量写入)
- v1.16.3 修复的 WAL delta + flush + Gridstore 并发问题,都是实实在在的数据一致性风险点;
- 一旦踩中,后果是“静默数据损坏”或“副本不一致”,代价极高;
→ 强烈建议把 v1.16.3 作为 1.16.x 系列的最低生产版本。
- 如果你大量做导入/删除、并喜欢在写入时同时做清理/重建集合
- #7741、#7702 这两条 Gridstore 相关的修复,直接针对快速插入+删除、高并发+并行清理的情况;
→ v1.16.3 对这类“高变动 workload”会显著降低出现“写入越多越容易把自己写坏”的概率。
- #7741、#7702 这两条 Gridstore 相关的修复,直接针对快速插入+删除、高并发+并行清理的情况;
- 如果你依赖 snapshot 备份迁移,并且集合名不一定规整(含特殊字符)
- #7759, #7782 解决的是“带奇怪字符集合名 → 快照传输挂掉”的典型坑;
→ 升级后备份/迁移链路更稳,不容易在大规模迁移时被一些命名细节卡死。
- #7759, #7782 解决的是“带奇怪字符集合名 → 快照传输挂掉”的典型坑;
- 如果你对监控和告警质量有要求
- 快照 metrics 为 0 不上报(#7788)、panic 时误报优化错误(#7783),在大规模运维中会造成噪音与盲点;
→ 1.16.3 让这些指标更可信,更适合你构建基于指标的自动化运维体系。
- 快照 metrics 为 0 不上报(#7788)、panic 时误报优化错误(#7783),在大规模运维中会造成噪音与盲点;
- 平台/兼容性方面
- Windows ARM64 构建修复(#7690)、RocksDB 支持延长(#7683),让某些特定环境/迁移路径更平滑;
→ 如果你或团队在这些方向有计划,1.16.3 是更好的起点。
- Windows ARM64 构建修复(#7690)、RocksDB 支持延长(#7683),让某些特定环境/迁移路径更平滑;
总结:一句话概括 v1.16.3 的 bug 修复价值
- 从触发场景来看:
这些 bug 并非“极端罕见角落”,而是在真实生产中很容易遇到的场景(集群迁移中断、磁盘短时 I/O 问题、高并发 insert/delete、并行清理、复杂集合命名等)。 - 从影响来看:
多个问题的共同点是——静默的数据一致性和持久性风险,而不是简单的 4xx/5xx 可见报错。 - 从修复效果来看:
v1.16.3 把复制链路、flush 机制、Gridstore 并发控制这几块“最容易出大事”的地方补齐了短板,使 1.16.x 系列达到一个相对成熟稳定的状态。
如果你已经在用 1.16.x 或即将升级到 1.16 系列,实务上建议:
直接以 v1.16.3 作为基线版本,而不要停留在早期的 1.16.0/1.16.1/1.16.2。
- 本文固定链接: http://www.jiagou.cc/1706/
- 转载请注明: 摘星怪 于 架构迷 发表
