向量数据库

分片、副本与容量规划

进阶工程实践约 25 分钟kp-029

前置知识

一句话定义

分片(sharding)把数据横向切开解決单机容量与吞吐上限,副本(replica)纵向复制解决读扩展与高可用;向量场景的特殊性在于 scatter-gather 查询(每分片各取 top-k 再归并)与过滤感知的分片键选择——切法错了,性能与正确性一起埋雷。

为什么重要

单机内存与 QPS 上限迟早到来(kp-026 的账本决定何时到来),但分布式化的代价(fan-out 延迟、再平衡、运维复杂度)常被低估。分片键选择是向量库里少有的"事后极难更改"的决策——它同时决定查询路由、过滤效率与数据倾斜风险,必须在第一天想清楚。

前置知识

kp-018(分布式谱系)、kp-026(单机容量账)、kp-017 陷阱 3/4(过滤与分片键的耦合)。

核心概念

原理与机制

分片键决策表(最重要的实战内容):

查询模式推荐分片键效果
几乎都带 tenant/org 条件租户键单分片路由,无广播;过滤退化为本地(kp-017)
按时间窗检索为主范围(时间)范围裁剪,老数据可转冷存储
无固定过滤、均匀随机访问哈希(主键)均匀但全广播,需评估 fan-out
多租户+租户大小悬殊租户键+大租户内部二次分片防倾斜

归并与召回:全局 top-k = 归并(每片 top-k')。理论上有"真正的全局近邻集中在某一片"的漏召回风险,工程上取 k' = k × α(α≈2~4)后归并,实测损失可忽略;过度担心而把 α 开到 10+ 只会浪费吞吐。

容量规划公式:

读容量: QPS_max ≈ QPS_per_replica × replicas (广播查询再 ÷ fan-out 惩罚)
数据容量: 总内存 ≈ kp-026 账本 × 副本数
分片数: 初始 = 目标单分片规模的上取整, 预留 2~4 倍增长空间
       (每分片建议 ≤ 数千万向量, 便于单机索引构建与再平衡)

扩容路径:单机 → 只读副本(读扩展)→ 垂直升配(内存机型)→ 水平分片。顺序尽量靠前:副本比分片便宜,垂直比分片简单;分片是最后手段,也是最难回退的手段。

公式或模型

广播查询的延迟下界:

p99_broadcast ≈ max_i(分片p99_i) + 归并开销 ≈ 单分片p99 + 尾部放大
分片数越多, "至少一片慢"的概率越高 → 广播查询的 p99 随分片数对数级恶化
→ 高频广播 = 架构坏味道, 应转租户路由或缓存

图示

租户分片(带路由)                 哈希分片(广播)
 Q(tenant=42)                     Q(无过滤)
    │                                  ├─► shard1 top-k ─┐
    ▼                                  ├─► shard2 top-k ─┼─► 归并top-k
 shard2(仅含租户42)                     └─► shardN top-k ─┘
 单跳, 无归并等待                       延迟=最慢分片+归并

实例或案例

多租户网盘搜索(3000 租户、6 亿向量、租户规模悬殊 1000 倍):初版哈希分片,任何带租户过滤的查询都广播 16 分片,p99 480 毫秒;重设计为"租户分片 + 头部大租户独立二次分片",90% 查询单跳路由,p99 降至 60 毫秒;头部租户的倾斜由二次分片吸收。分片键跟随查询模式,而非数据表结构——这是本篇的第一定律。

直观类比

分片像连锁仓库选址:按客户地域开仓(租户分片)→ 订单直发本地仓;按到货批次随机摆(哈希)→ 每张订单都要问遍全国仓库。副本是"同一仓库开两条流水线"——出货更快、账本要记两份。

常见误区

  1. "分片数越多性能越好"——广播延迟随分片数恶化、运维与再平衡成本上升;分片数服务于"单分片可服务"的目标规模,不是越多越好。
  2. "副本可以替代备份"——副本防机器故障不防误删/逻辑损坏(删除会同步到所有副本,kp-022);备份与 PITR 必须独立建设。
  3. "以后再选分片键也行"——分片键变更=全量重分布;它必须在第一天与过滤/查询模式对齐(kp-017 陷阱 4 的预防式)。
  4. "扩容就加分片"——先试副本与垂直扩容;resharding 期间的双写与迁移降级常常比扩容问题本身更痛。

自测题

  1. 90% 查询带 org 条件、org 数 500、规模 3 亿,怎么分片?
  2. 答:按 org 租户键分片实现单跳路由;org 数远小于分片数时按 org 哈希到分片组,头部大 org 单独成片或内部二次分片防倾斜。

  3. 为什么全局 top-k 各片取 k' > k?
  4. 答:各片 ANN 是独立近似,真实全局近邻可能排在某片局部第 k+1 名;k' = k×(2~4) 的 oversample 让归并后召回损失可忽略,成本仅是少量多余传输。

  5. 副本为什么不能替代备份?
  6. 答:副本是同步的逻辑复制,DELETE/误写会即刻传播到全部副本;只有独立的时间点备份才能恢复误操作前的状态。

与其他知识点的关系

kp-026 提供单机容量账(分片的触发条件);kp-017/014 提供过滤与分片键的耦合依据;kp-019 展示分布式向量库如何内建这些机制;kp-030 运维清单消费本篇的监控项(副本滞后、倾斜)。

延伸阅读

Wang et al., "Milvus: A Purpose-Built Vector Data Management System"(SIGMOD 2021)——分片/副本/一致性在向量负载下的系统化处理,本篇机制的产品级参照。

相关知识点