创建OpenSearch向量集群
CSS向量数据库通过结合高效索引技术,为高维向量检索提供了高性能、低成本、易扩展的解决方案。OpenSearch向量集群通过将非结构化数据转换为高维向量,并结合向量索引技术(如HNSW图索引、乘积量化等),可实现近似最近邻检索(ANN),在保证高召回率的同时显著降低计算复杂度。
本文主要介绍创建OpenSearch向量集群的要求和内存规划。此处仅介绍向量数据库的内存规划,用于指导集群节点规格的选择,其他可用区之类的规划指导和常规搜索集群无异,详细指导请参见OpenSearch集群规划建议。
内存规划
在创建OpenSearch向量集群时,需根据数据规模、向量维度和索引类型,合理规划集群内存规格。
- 规格类型
CSS向量检索引擎依赖较高的内存计算,向量索引依赖堆外内存,建议选择“内存优化型”的节点规格。
- 内存计算公式
根据索引算法类型、向量维度和数据量,通过公式预估堆外内存需求:
- FLAT索引:mem_size = dim * dim_size * num + delta
- GRAPH索引:mem_size = (dim * dim_size + neighbors * 4) * num + delta
- GRAPH_PQ索引:mem_size = (fragment_num + neighbors * 4) * num + delta
- GRAPH_SQ8索引:mem_size = (dim * 2 + neighbors * 4) * num + delta
- GRAPH_SQ4索引:mem_size = (dim + neighbors * 4) * num + delta
- IVF_GRAPH、IVF_GRAPH_PQ索引无需常驻内存,不涉及估算。
表1 参数注释 参数
说明
mem_size
向量索引所需的堆外内存大小(不含副本,当索引需要副本时,则随副本数翻倍)。
dim
向量维度。
dim_size
每一维度值所需的字节数,默认为float类型,需要4字节。
neighbors
图索引中每个向量的邻居数,默认值为64。
num
向量总条数。
fragment_num
使用PQ量化时的向量分段数。
如果创建索引时没有显示配置fragment_num,则由向量维度“dim”决定。
if dim <= 256: fragment_num = dim / 4 elif dim <= 512: fragment_num = dim / 8 else : fragment_num = 64
delta
元数据大小,该项通常可以忽略。
在选择节点规格时,还需考虑每个节点的堆内存开销。节点的堆内存分配策略:每个节点的堆内存大小为节点物理内存的一半,最大不超过31GB。
示例:
基于SIFT10M数据集(128维向量,1000万条数据)创建GRAPH索引时,假设neighbors设置为32,则堆外内存需求约为“mem_size = (128 x 4 + 32 x 4)x 10000000 + delta ≈ 6GB”。当索引副本数设置为1时,则至少需要堆外内存6*2=12GB,此时建议集群规格选择1台8U32G或2台8U16G。
创建集群
集群创建步骤和常规搜索集群无异,详细指导请参见创建OpenSearch集群(新版)。
重点关注如下关键参数:
- “集群版本”:选择1.3.6或2.19.0,仅这个版本的集群自带CSS向量搜索引擎。
- “节点规格”:按规划的集群内存规格选择。
(可选)配置熔断线
- 防止内存过载:通过限制写入,降低堆外内存的消耗。
- 维持查询性能:避免因内存压力导致向量查询性能下降。
堆外内存熔断默认启用,支持根据业务需要调整熔断开关和熔断线,命令参考如下:
PUT _cluster/settings { "persistent": { "native.cache.circuit_breaker.enabled": "true", "native.cache.circuit_breaker.cpu.limit": "80%" } }
参数名称 |
参数类型 |
描述 |
---|---|---|
native.cache.circuit_breaker.enabled |
Boolean |
控制是否启用堆外内存熔断功能。
取值范围:
|
native.cache.circuit_breaker.cpu.limit |
String |
指定向量索引的堆外内存的使用上限(熔断线)。 当“native.cache.circuit_breaker.enabled=true”时才生效。 取值范围:百分比 默认值:80% 假设使用128GB内存的集群规格,集群所需的堆内存大小为31GB,则默认堆外内存的熔断线为(128 - 31)x 80% = 77.6GB,即堆外内存使用量超过该值将会触发写入熔断。 |