更新时间:2025-08-22 GMT+08:00
分享

创建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%"
  }
}
表2 参数说明

参数名称

参数类型

描述

native.cache.circuit_breaker.enabled

Boolean

控制是否启用堆外内存熔断功能。

取值范围:
  • true(默认值):开启堆外内存熔断,当堆外内存达到熔断线时,集群会触发写入熔断。
  • false:关闭堆外内存熔断,当堆外内存过高时,集群可能因内存不足导致OOM。

native.cache.circuit_breaker.cpu.limit

String

指定向量索引的堆外内存的使用上限(熔断线)。

“native.cache.circuit_breaker.enabled=true”时才生效。

取值范围:百分比

默认值:80%

假设使用128GB内存的集群规格,集群所需的堆内存大小为31GB,则默认堆外内存的熔断线为(128 - 31)x 80% = 77.6GB,即堆外内存使用量超过该值将会触发写入熔断。

相关文档