# 准备环境
在CSS向量数据库的环境准备阶段，您需要根据向量维度、数据规模及所选算法（如HNSW或PQ），利用数学公式预估内存需求，并配置合理的熔断保护线，从而构建一个既高性能又具备企业级稳定性的向量检索环境。
 #### 规划内存
在CSS向量数据库节点中，物理内存被划分为两大逻辑区域：
- JVM堆内存：用于业务处理，如索引元数据映射、聚合查询、集群管理等。CSS服务默认分配物理内存的50%给堆内存，但上限不超过31GB。
- 堆外内存：用于向量索引计算。需要常驻内存的图索引结构会直接加载到堆外内存中进行高速并行计算。
在选择集群节点规格前，请根据您预定义的索引算法计算所需的堆外内存。[表1]提供了各索引算法对应的单副本所需的堆外内存预估公式。
 表1预估堆外内存 
| 索引算法类型         | 堆外内存预估公式（单位：Byte）                                              | 算法特性说明                                            |
|:---|:---|:---|
| FLAT            | mem_size = dim \* dim_size \* num + delta                      | 全量暴力计算。适用万级以下的小规模数据，或对召回精度有要求的业务场景。                 |
| GRAPH           | mem_size = (dim \* dim_size + neighbors \* 4) \* num + delta | 内嵌深度优化的HNSW算法。适用亿级以下规模的数据量，对响应时间（毫秒级）和精度要求均较高的业务场景。 |
| GRAPH_PQ        | mem_size = (fragment_num + neighbors \* 4) \* num + delta     | HNSW与乘积量化结合的算法。适用十亿级规模的数据量。                         |
| GRAPH_SQ8    | mem_size = (dim + neighbors \* 4) \* num + delta              | HNSW与8位标量量化结合的算法。适用十亿级规模的数据量。                      |
| GRAPH_SQ4        | mem_size = (dim / 2 + neighbors \* 4) \* num + delta        | HNSW与4位标量量化结合的算法。适用十亿级规模的数据量。                   |
| IVF_GRAPH      | 依赖预构建中心点向量Dict，无需常驻内存                                        | 倒排聚类与HNSW结合的算法。适用于对写入性能要求较高的业务场景。                |
| IVF_GRAPH_PQ | 依赖预构建中心点向量Dict，无需常驻内存                                       | 倒排聚类、HNSW与乘积量化结合的算法。适用于对写入性能要求较高的场景。             |
   
参数解释：
- mem_size：集群所需的堆外内存大小（单副本，当索引需要副本时随副本数翻倍）。
- dim：向量维度。
- dim_size：每一维度值所需的字节数，默认为float类型，需要4字节。
- num：向量数据总条数。
- delta：元数据大小，可以忽略不计。
- neighbors：图索引中每个向量的邻居数，默认值为64。
- fragment_num：使用PQ量化时的向量分段数。 如果创建索引时没有配置fragment_num，则由向量维度"dim"决定。
  ```
  if dim <= 256:
      fragment_num = dim / 4
  elif dim <= 512:
      fragment_num = dim / 8
  else:
      fragment_num = 64
  ```
  
 
**选型示例**
业务场景：使用SIFT10M数据集（128维向量，1000万条数据），选择GRAPH算法，neighbors是64，有1个副本。
1. 单副本堆外内存：mem_size = （128 \* 4 + 64 \* 4）x 10000000 + delta ≈ 7.7 GB
2. 多副本堆外内存：7.7 \* 2 = 15.4 GB
3. 熔断安全余量（假设熔断线为默认值80%）：15.4 / 80% = 19.3 GB
4. 最终节点规格选型：由于JVM堆内存占用物理内存的50%（不超过31GB），建议选择一个64GB内存的节点（如8U64G），或者2个32GB内存的节点（如8U32G）。
 
#### 创建集群
向量数据库是基于Elasticsearch/OpenSearch集群实现的，您可以根据业务需求选择创建Elasticsearch或OpenSearch集群，关键参数配置如[表2]所示。
 表2创建集群的关键参数说明 
|   集群类型   |                                                                          Elasticsearch                                                                           |                                                                          OpenSearch                                                                           |
|---|---|---|
| **集群版本** | 选择"7.6.2"或"7.10.2"，其他版本不支持CSS向量检索引擎。 建议选择"7.10.2"，功能更全面。                                                        | 选择"1.3.6"、"2.19.0"或3.4.0（镜像版本不低于3.4.0_26.6.0_xxx），其他版本不支持CSS向量检索引擎。 建议选择"2.19.0"或"3.4.0"，功能更全面。               |
| **CPU架构**  | 推荐选择"x86计算"。                                                                                                                                                       | 推荐选择"x86计算"。                                                                                                                                                  |
| **节点规格**   | 推荐选择"内存优化型"的节点规格，其内存与CPU的配比较高，更适合向量计算特征。 集群的物理内存选择需满足[规划内存]。 | 推荐选择"内存优化型"的节点规格，其内存与CPU的配比较高，更适合向量计算特征。 集群的物理内存选择需满足[规划内存]。 |
| **指导文档**  | [创建集群（新版）](https://support.huaweicloud.com/usermanual-css/css_01_0011.html)。                                                                                     | [创建集群（新版）](https://support.huaweicloud.com/usermanual-css/css_01_0275.html)。                                                                                 |
   
#### （可选）配置熔断线
为避免集群节点的堆外内存过载并保障向量查询性能，系统在堆外内存使用率超过阈值时会触发写入熔断机制，暂停向量数据的写入操作。
堆外内存熔断机制的目的：
- 防止内存过载：通过限制写入，降低堆外内存的消耗。
- 维持查询性能：避免因内存压力导致向量查询性能下降。
 
堆外内存熔断默认启用，支持根据业务需要调整熔断开关和熔断线。
在Kibana或Dashboards的Dev Tools中执行以下命令：
```
PUT _cluster/settings
{
  "persistent": {
    "native.cache.circuit_breaker.enabled": "true",
    "native.cache.circuit_breaker.cpu.limit": "80%"
  }
}
```
表3熔断线参数说明 
| 参数                                                                | 类型     | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| native.cache.circuit_breaker.enabled   | Boolean | true   | 控制是否启用堆外内存熔断功能。 取值范围： - true：开启堆外内存熔断，当堆外内存达到熔断线时，集群会触发写入熔断。  - false：关闭堆外内存熔断，当堆外内存过高时，集群可能因内存不足导致OOM。          |
| native.cache.circuit_breaker.cpu.limit | String    | 80% | 指定向量索引的堆外内存的使用上限（熔断线）。 当"native.cache.circuit_breaker.enabled=true"时才生效。 取值范围：百分比 假设使用128GB内存的集群规格，集群所需的堆内存大小为31GB，则默认堆外内存的熔断线为"（128 - 31）x 80% = 77.6GB"，即堆外内存使用量超过该值将会触发写入熔断。 |
   
