可伸缩性
扩展 Redis 向量集合以处理更大的数据集和工作负载
多实例可伸缩性
向量集合可以通过将数据分片到多个 Redis 实例来实现水平扩展。这是通过在键和节点之间手动划分数据集来完成的。
示例策略
您可以使用一致性哈希进行数据分片
key_index = crc32(item) % 3
key = f"vset:{key_index}"
然后将元素添加到不同的键中
VADD vset:0 VALUES 3 0.1 0.2 0.3 item1
VADD vset:1 VALUES 3 0.4 0.5 0.6 item2
要在所有分片上运行相似性搜索,请向每个键发送 VSIM
命令,然后在客户端合并结果
VSIM vset:0 VALUES ... WITHSCORES
VSIM vset:1 VALUES ... WITHSCORES
VSIM vset:2 VALUES ... WITHSCORES
然后合并结果并按得分排序。
关键特性
- 写操作 (
VADD
,VREM
) 呈线性扩展——您可以在多个实例中并行插入。 - 读操作 (
VSIM
) 不呈线性扩展——您必须查询所有分片才能获得完整结果集。 - 较小的向量集合能带来更快的查询,因此对其进行分发有助于减少每个节点的查询时间。
- 在客户端合并结果保持逻辑简单,且不会增加服务器端开销。
可用性优势
这种分片模型也提高了容错能力
- 如果一个实例宕机,您仍然可以从其他实例检索部分结果。
- 使用超时和部分回退机制来增强弹性。
延迟考量
为避免跨 N 个实例的累加延迟
- 并行向所有分片发送查询。
- 等待最慢的响应。
这使得总延迟接近最差情况下的分片时间,而不是所有分片时间的总和。
总结
目标 | 方法 |
---|---|
扩展插入 | 跨键和实例分割数据 |
扩展读取 | 查询所有分片并合并结果 |
高可用性 | 当某些分片失败时接受部分结果 |
保持性能 | 使用较小的分片以便更快地进行每个节点遍历 |