向量数据库运维与故障排查
适用场景:生产环境中运行 Milvus / Chroma 等向量数据库,支撑 RAG、推荐系统、语义搜索等 AI 应用。
1. 向量数据库选型
| 特性 | Milvus | ChromaDB | Pinecone |
|---|---|---|---|
| 部署方式 | 自托管 / 云服务 | 自托管 / Embedding | 纯 SaaS |
| 数据量级 | 十亿级 | 百万级 | 千万级 |
| 索引类型 | HNSW / IVF_FLAT / DiskANN | Flat / HNSW | 专有 |
| 语言支持 | Python / Go / Java | Python / JS | Python / JS |
| 适用场景 | 生产级大规模 | 轻量级 / 原型 | 快速上线 |
选型建议: - 数据量 < 100 万、快速验证 → ChromaDB - 数据量 > 100 万、生产环境 → Milvus - 不想运维 → Pinecone / Weaviate Cloud
2. Milvus 部署与配置
2.1 Docker Compose 部署
# milvus-docker-compose.yml
version: '3.5'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
volumes:
- ./volumes/etcd:/etcd
minio:
image: minio/minio:RELEASE.2024-01-02T13-10-53Z
command: minio server /minio_data --console-address ":9001"
volumes:
- ./volumes/minio:/minio_data
pulsar:
image: apachepulsar/pulsar:2.11.2
volumes:
- ./volumes/pulsar:/pulsar/data
command: bin/pulsar standalone
milvus-standalone:
image: milvusdb/milvus:v2.4.0
command: milvus run standalone
security_opt:
- seccomp:unconfined
environment:
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ADDRESS=minio:9001
- PULSAR_ADDRESS=pulsar:6650
volumes:
- ./volumes/milvus:/var/lib/milvus
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- etcd
- minio
- pulsar
networks:
default:
name: milvus
启动:
2.2 核心配置参数
# server.yaml 关键配置
dataSync:
flushIntervalSecondary: 60s # 数据刷盘频率
coord:
segment:
maxDegree: 30 # HNSW 索引 M 值
efConstruction: 300 # 索引构建 ef
3. ChromaDB 部署
3.1 Docker 部署
# chroma-docker-compose.yml
version: '3.8'
services:
chroma:
image: chromadb/chroma:0.5.0
ports:
- "8000:8000"
volumes:
- chroma_data:/chroma/chroma
environment:
- CHROMA_SERVER_AUTH_CREDENTIALS=admin:secret
- CHROMA_SERVER_AUTH_PROVIDER=chromadb.auth.basic_auth
volumes:
chroma_data:
3.2 持久化路径
4. 监控指标
4.1 Milvus 关键指标
# 集合实体数量
milvus_proxy_col_cache_size{db_name="default",col_name="your_collection"}
# 查询延迟
histogram_quantile(0.99, sum(rate(milvus_proxy_query_cost_duration_seconds_bucket[5m])) by (le))
# 节点 CPU/内存
container_cpu_usage_seconds_total{container_label_com_docker_compose_service="milvus-standalone"}
container_memory_working_set_bytes{container_label_com_docker_compose_service="milvus-standalone"}
4.2 Chroma 监控
Chroma 无内置 Prometheus exporter,可通过以下方式监控:
# 健康检查
import requests
def check_chroma_health():
resp = requests.get("http://localhost:8000/api/v1/heartbeat")
return resp.json()
# 集合统计
def get_collection_stats(collection_name):
resp = requests.get(f"http://localhost:8000/api/v1/collections/{collection_name}")
return resp.json()
4.3 Grafana Dashboard
推荐导入: - Milvus: 官方 Dashboard - Chroma: 自建简易 dashboard,监控端口 8000 请求量
5. 性能调优
5.1 索引类型选择
| 场景 | 推荐索引 | 参数建议 |
|---|---|---|
| 低延迟查询(< 50ms) | HNSW | M=16, efConstruction=200 |
| 大规模数据(> 1 亿) | IVF_FLAT | nlist=1024, nprobe=64 |
| 内存受限 | DiskANN | max_degree=40, search_list_size=100 |
| 高精度召回 | IVF_PQ | nlist=1024, m=8, nbits=8 |
5.2 查询优化
# 批量查询而非单条
collection.query(
query_embeddings=embeddings.embed_documents(questions),
n_results=10,
search_params={"ef": 128} # 动态调整 ef
)
# 限制返回字段
collection.query(
query_embeddings=[query_vec],
n_results=5,
include=["documents", "metadatas"] # 不包含 embeddings 节省带宽
)
5.3 写入优化
# 批量插入
collection.add(
documents=chunk_list,
embeddings=embedding_list,
ids=id_list
)
# 禁用自动刷盘(提高写入吞吐)
# Milvus: set segmentSize to larger value
# Chroma: 定期 batch commit
6. 故障排查
问题 1:索引构建失败
现象:create_index 返回错误。
排查步骤:
# 查看 Milvus 日志
docker logs milvus-standalone --tail 100 | grep -i error
# 检查数据维度
python3 -c "
import requests
r = requests.get('http://localhost:19530/v1/collections/describe', json={'name': 'your_collection'})
print(r.json())
"
解决:
- 确保数据维度与 schema 一致
- 增大 disk_ann 的 max_degree
- 检查磁盘空间(df -h /var/lib/milvus)
问题 2:查询超时
现象:P99 延迟 > 1s。
排查:
# 检查当前索引状态
milvus-cli> show collection your_collection
milvus-cli> show indices
# 查看资源使用
top -p $(pgrep milvus)
解决:
- 增大 nlist(聚类中心数)
- 改用 HNSW 索引
- 增加 mem_limit
- 水平扩容副本
问题 3:数据不一致
现象:插入后查询不到,或返回错误结果。
排查:
# 检查 etcd 状态
docker exec etcd etcdctl endpoint health
# 检查 MinIO 对象存储
curl http://localhost:9001/minio/health/live
解决: - 重启故障节点 - 从备份恢复数据 - 检查网络分区
问题 4:ChromaDB 启动失败
现象:容器启动后立即退出。
排查:
常见原因:
- 权限问题:chown -R 1000:1000 /data/chroma
- 磁盘满:清理旧数据或扩容
- SQLite 损坏:从备份恢复
问题 5:向量维度不匹配
现象:查询时报 Incompatible dimensions。
解决:
# 检查 Embedding 模型输出维度
embeddings = OllamaEmbeddings(model="bge-m3")
test_vec = embeddings.embed_query("test")
print(len(test_vec)) # 应为 1024
# 重建 collection 时确保 dim 一致
7. 备份与恢复
7.1 Milvus 备份策略
#!/bin/bash
# backup_milvus.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/milvus/$DATE"
# 导出 etcd 数据
docker exec etcd etcdctl snapshot save /backup/milvus/$DATE/snapshot.db \
--endpoints=localhost:2379
# 备份 MinIO 数据
docker exec minio mc mirror minio/milvus-data /backup/milvus/$DATE/minio-data/
# 保留最近 7 天
find /backup/milvus -mtime +7 -exec rm -rf {} \;
7.2 ChromaDB 备份策略
#!/bin/bash
# backup_chroma.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/chroma/$DATE"
# 复制数据目录
cp -r /data/chroma/chroma $BACKUP_DIR
# 压缩备份
tar czf /backup/chroma-$DATE.tar.gz -C /backup/chroma $DATE
# 清理旧备份
find /backup -name "chroma-*.tar.gz" -mtime +7 -delete