深入解析 Qdrant:Rust 编写的高性能向量数据库——从部署实操到核心特性与源码架构
【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant
Qdrant 是一个用 Rust 编写的向量相似度搜索引擎与向量数据库,面向语义匹配、推荐、Faceted Search 等 AI 应用场景,提供存储、检索和管理"点(带 payload 的向量)"的生产级服务。本文以仓库根目录 README.md 为主线,结合 Cargo.toml、config/config.yaml、src/main.rs 等真实源码与配置,完整覆盖本地部署、客户端接入、Qdrant Edge 嵌入式用法、REST/gRPC 双接口、混合检索融合策略、量化与分布式配置等实战内容,帮助读者在跑通服务的同时理解其背后的实现结构。
一、Qdrant 是什么:定位与技术栈
README 对 Qdrant 的定义是:一个向量相似度搜索引擎 + 向量数据库,提供生产级服务与便捷 API,用于存储、搜索和管理"点"(point,即带附加 JSON payload 的向量),并针对**扩展过滤(extended filtering)**深度优化,适用于神经网络/语义匹配、Faceted Search 等应用。
从仓库可以确认几个关键实现事实:
- 语言与版本:Cargo.toml 显示当前版本为
1.18.3,edition = "2024",rust-version = "1.97",许可证为 Apache-2.0(与 LICENSE 一致)。 - 服务端框架:Cargo.toml 依赖
actix-web(REST)与tonic(gRPC),并依赖tikv/raft-rs的raft实现集群共识(Cargo.toml)。 - 内存分配器:src/main.rs 在 x86_64/aarch64 上使用
Jemalloc作为全局分配器。 - 核心库分层:工作区由
lib/下的一系列内部 crate 组成——segment(段与索引)、shard(分片)、collection(集合)、storage(存储与共识)、api(REST/gRPC 契约)、quantization(量化)、wal(预写日志)、gpu(GPU 加速索引)等,入口逻辑位于 src/main.rs。
二、快速开始:Client-Server 模式
README 给出的最简体验方式是直接运行容器(注意:该方式为无认证的明文部署,绑定所有网络接口,生产环境前必须参照官方安装与安全指南加固):
docker run -p 6333:6333 qdrant/qdrant仓库内 tools/compose/docker-compose.yaml 提供了更完整的 compose 部署样例,可结合 tests/consensus_tests/docker-compose.yaml 观察多节点集群的编排方式。
启动后,用任意官方客户端连接,例如 Python:
from qdrant_client import QdrantClient client = QdrantClient(url="http://localhost:6333")对应地,config/config.yaml 中的service段定义了服务默认行为:http_port: 6333、grpc_port: 6334(置为null可禁用 gRPC)、host: 0.0.0.0、max_request_size_mb: 32、max_workers: 0(0 表示等于可用核心数)。
2.1 从源码运行:CLI 参数全解
Qdrant 的 CLI 由 src/main.rs 中的clap定义,常用参数如下:
| 参数 | 环境变量 | 说明 |
|---|---|---|
--bootstrap <URI> | QDRANT_BOOTSTRAP | 多节点部署时,从哪个 peer 引导;不填则本节点视为全新部署的首节点 |
--uri <URI> | QDRANT_URI | 本 peer 对外地址;首节点必填,后续节点可省略(自动推导) |
--snapshot <PATH:NAME> | — | 从快照恢复集合,格式<snapshot_file_path>:<target_collection_name>;已有分布式集群中请改用/collections/<name>/snapshots/recoverAPI |
--storage-snapshot <PATH> | — | 恢复整个存储(多集合)快照 |
-f, --force-snapshot | — | 强制用快照覆盖已有集合 |
--config-path <PATH> | — | 指定配置文件,默认config/config.yaml |
--disable-telemetry | — | 关闭使用统计上报(对应 config.yaml 的telemetry_disabled) |
--stacktrace | — | 运行栈追踪收集器,调试用 |
--reinit | — | 重置共识状态(行为取决于是否带 bootstrap URI) |
config/config.yaml 定义了数据落盘路径:storage.storage_path: ./storage、storage.snapshots_path: ./snapshots,临时快照目录默认在storage/snapshots_temp/。
三、客户端生态
README 列出以下客户端,可集成到应用栈中(各客户端为独立仓库,此处仅列名称):
- 官方:Python、Rust、Go、JavaScript/TypeScript、Java、.NET/C# 客户端
- 社区:Kotlin(Kdrant)、PHP 客户端
接入形态上,客户端统一走 REST(OpenAPI 3.0)或 gRPC 两种接口,见下一节。
四、Qdrant Edge:进程内的轻量向量引擎
README 中的 Qdrant Edge 章节介绍了一个与 Server 形态互补的组件:它运行在应用进程内而非客户端-服务器架构,数据本地存储与查询,并可与 Qdrant Server 同步;面向边缘设备与资源受限环境,提供与客户端-服务器版相同的向量检索能力,但体积更小、延迟更低、可离线。
仓库中 Edge 的 Python 绑定位于 lib/edge/python,核心实现位于 lib/edge/src(EdgeShard、edge_shard、read_view等模块),其 lib/edge/python/README.md 明确定位为"面向嵌入式设备、自主系统与移动 agent 的进程内向量搜索引擎"。README 中的最小示例:
from qdrant_edge import Distance, EdgeConfig, EdgeVectorParams, EdgeShard, Point, UpdateOperation shard = EdgeShard.create("./shard", EdgeConfig( vectors={"my-vector": EdgeVectorParams(size=4, distance=Distance.Cosine)} )) shard.update(UpdateOperation.upsert_points([ Point(id=1, vector={"my-vector": [0.1, 0.2, 0.3, 0.4]}, payload={"color": "red"}) ]))EdgeShard暴露的数据管理、查询与快照恢复方法与 Server 的 collection 操作语义对齐;lib/edge/python/examples/下还有 13 个可运行示例,例如混合检索(含 DBSF 融合)的 hybrid_search_dbsf.py。
五、API:REST 与 gRPC 双接口
5.1 REST(OpenAPI 3.0)
Qdrant 提供 REST API 及 OpenAPI 3.0 规范,支持为几乎任何语言/框架生成客户端。仓库内可直接查阅:
- 完整的 OpenAPI JSON 定义:docs/redoc/master/openapi.json(
docs/redoc/下还保留了 v0.4.2 至 v1.18.x 各历史版本的规范,便于对比 API 演进) - OpenAPI 源由 openapi/ 目录下的 ytt 模板(
openapi-main.ytt.yaml、openapi-points.ytt.yaml、openapi-cluster.ytt.yaml等)维护 - REST 契约类型定义在 lib/api/src/rest,例如查询参数中的融合策略枚举 lib/api/src/rest/schema.rs
5.2 gRPC
面向更快、生产级检索场景,Qdrant 同时提供 gRPC 接口。gRPC 契约位于 lib/api/src/grpc,含 17 个.proto文件(points.proto、collections.proto、qdrant.proto等),其中points.proto定义了包括Fusion在内的查询相关消息。Cargo.toml 中的tonic与tonic-reflection依赖对应这一运行时,gRPC 端口默认6334(见 config/config.yaml)。
六、核心特性深度解析
6.1 稠密、稀疏与多向量检索
README 声明 Qdrant 同时支持三类向量:稠密向量(语义相似度)、稀疏向量(全文检索)、多向量(late interaction 模型如 ColBERT 或一个对象多组嵌入)。仓库佐证:
- 稀疏向量独立成 crate:lib/sparse(含
index、search_scratch模块与tests/openapi/test_sparse_vector_large.py等大文件集成测试) - 稀疏向量存储、倒排类结构还可参见 lib/posting_list(
builder.rs、iterator.rs、view.rs) - 稠密向量主检索走 HNSW 图索引,实现位于 lib/segment/src/index,相关基准测试在 lib/segment/benches(
hnsw_search_graph.rs、vector_search.rs等) - BM25 全文分词器位于 lib/bm25,对应测试 tests/openapi/test_bm25.py
6.2 Payload 过滤
任意 JSON payload 可附加在向量上,并支持关键词匹配、全文、数值范围、地理位置等条件组合,配合should/must/must_not布尔子句。仓库中过滤能力有专门的测试与基准:tests/openapi/test_filter.py、lib/segment/benches/boolean_filtering.rs、lib/segment/benches/range_filtering.rs,过滤查询的执行计划优化(Query Planning)利用已建 payload 索引选择最优检索路径(lib/segment/src/index内的 payload 索引与 lib/collection/src/collection 的读路径)。
6.3 混合检索与融合策略(RRF / DBSF)
README 的 Hybrid Search 一节指出:可在单次查询中组合多路向量(prefetch),结果通过可配置的融合策略合并,明确点名Reciprocal Rank Fusion (RRF)与Distribution-Based Score Fusion (DBSF)。
源码层面,REST 契约中直接定义了该枚举(lib/api/src/rest/schema.rs):
/// * `rrf` - Reciprocal Rank Fusion (with default parameters) /// * `dbsf` - Distribution-Based Score Fusion pub enum Fusion { Rrf, Dbsf, }其中Rrf结构体还支持可选的k参数与每路 prefetch 的weights权重。gRPC 侧的对应枚举见 lib/api/src/grpc/proto/points.proto 中的Fusion。融合后的重排与聚合在 lib/collection/src/collection/query.rs 与分片层 lib/shard/src/query 中完成;端到端验证可看 tests/openapi/test_query.py(其中包含 RRF/DBSF 的融合用例),Edge 侧同样内置 hybrid_search_dbsf.py 示例。
6.4 向量量化与磁盘存储
README 声明"内置量化最多可削减 97% 的 RAM 占用,并可在检索速度与精度之间调节"。仓库的量化实现集中于 lib/quantization,从源码文件名可确认覆盖四种编码形态:
- encoded_vectors_binary.rs:二进制量化
- encoded_vectors_pq.rs:乘积量化(PQ)
- encoded_vectors_u8.rs:标量(u8)量化
- encoded_vectors_tq.rs 与 turboquant/:TurboQuant 量化
配套基准在 lib/quantization/benches(pq.rs、binary.rs、encode.rs等),端到端测试见 tests/openapi/test_turboquant.py 与 tests/openapi/test_turbo4_storage.py。磁盘侧存储方面,config/config.yaml 的on_disk_payload: true(默认)与hnsw_index.memory: cached/cold等"内存放置"参数共同决定数据驻留策略。
6.5 分布式部署
README 列出"分片与副本实现水平扩展、集合可零停机扩缩"。实现依据:
- 共识基于 Raft:Cargo.toml 引入
tikv/raft-rs的raft与raft-proto;共识状态管理位于 lib/storage/src/content_manager,入口装配在 src/main.rs(Consensus、ConsensusManager、TableOfContent等) - 集群配置集中在 config/config.yaml:
cluster.enabled: false(单机默认)、cluster.p2p.port: 6335(节点间 gRPC,可开 TLS)、cluster.consensus.tick_period_ms: 100(心跳周期,官方注释明确"除非确知后果否则不要修改")、compact_wal_entries: 128(共识 WAL 压缩阈值,让新节点经快照快速加入) - 集合默认
replication_factor: 1、write_consistency_factor: 1(config/config.yaml) - 分片传输方法可全局指定:
shard_transfer_method支持stream_records/snapshot/wal_delta(config/config.yaml) - 多节点行为有大量集成测试:tests/consensus_tests 下 80+ 个场景(副本迁移、resharding、快照恢复、共识压缩等)
6.6 其他高亮特性(README Features 与源码对照)
| README 特性 | 仓库佐证 |
|---|---|
| Faceting(按 payload 值聚合) | lib/shard/src/facet.rs、lib/segment/benches/facets.rs |
| Recommendation(正/负样本推荐) | lib/collection/src/recommendations.rs、tests/openapi/test_recommend.py |
| Discovery(向量空间区域约束检索) | lib/collection/src/discovery.rs、tests/openapi/test_discover.py |
| MMR / Relevance Feedback 调优 | tests/openapi/test_query_formula.py、tests/openapi/test_relevance_feedback.py |
| 多租户(Multitenancy) | 多租户数据分区实践见 tests/consensus_tests/test_tenant_promotion.py |
| 可观测性(指标/遥测/审计) | prometheus依赖(Cargo.toml)、src/common/telemetry.rs、lib/storage/src/audit.rs 与 config.yaml 的audit段 |
| SIMD 硬件加速(x86/x64、Neon) | lib/segment/src/spaces(距离计算内核)、lib/quantization/cpp(avx2.c、neon.c、sse.c) |
| GPU 加速索引(NVIDIA/AMD) | lib/gpu(Vulkan 设备/管线/着色器封装),以 Cargo featuregpu开启(Cargo.toml) |
异步 I/O(io_uring) | config/config.yaml 的async_scorer/io_uring参数;集成测试 tests/consensus_tests/test_io_uring_eintr.rs |
| 预写日志(WAL) | lib/wal crate,storage.wal.wal_capacity_mb: 32、wal_segments_ahead: 0(config/config.yaml) |
README 同时指出 Web UI 提供可视化交互(浏览集合、管理数据、直接操作 REST API)。Web 界面静态资源由 tools/sync-web-ui.sh 同步,服务路由位于 src/actix/web_ui.rs(仓库内无该界面的截图素材,故本文不配图)。
七、核心配置文件解读(config/config.yaml)
config/config.yaml 是单文件覆盖几乎所有生产参数的权威参考,按段说明关键项:
storage 段(数据与吞吐)
storage_path/snapshots_path/temp_path:数据、快照与临时文件位置on_disk_payload(默认true):payload 不落内存,按需从磁盘读取,省 RAM 换轻微延迟;参与过滤且已索引的字段仍驻留 RAMlow_memory_mode:启动期内存恢复旋钮,disabled/no_resident/no_populate三档,用于节点 OOM 崩溃循环时的降级加载update_concurrency:分片副本并发更新上限(null为最大并发)node_type:Normal(正常节点)或Listener(只接收更新、不答查询的备份节点)
storage.performance 段
max_search_threads: 0(0=自动)、optimizer_cpu_budget: 0(优化作业 CPU 预算)、update_rate_limit(防分布式模式下高并发更新 DDoS)async_scorer/io_uring:Linux 下用 io_uring 做异步打分与磁盘读- 集合/分片/段的并发加载上限(
max_concurrent_*_loads)
storage.optimizers 段(段优化器)
deleted_threshold: 0.2:删除比例达到 0.2 才触发段优化vacuum_min_vector_number: 1000、default_segment_number: 0(按 CPU 自动选择,建议设为搜索线程数的因子)max_segment_size_kb(索引速度 vs 段大小的权衡)、indexing_threshold_kb: 10000(超过该体积建索引,设 0 禁用)、flush_interval_sec: 5、max_optimization_threadsoptimizers_overwrite:全局强制覆盖所有集合的优化参数
storage.hnsw_index 段
m: 16(图每节点边数,越大越准越占空间)、ef_construct: 100(建图时考虑邻居数)、full_scan_threshold_kb: 10000(低于阈值的全量扫描优先于 HNSW 走查)、max_indexing_threads: 0(0=自动,官方建议 8~16 之间)、on_disk/memory: cached|cold|pinned(内存放置)、payload_m(payload 索引专用 M)
service 段(服务与安全)
- 端口与 worker:
http_port: 6333、grpc_port: 6334(null禁用)、max_workers - 安全:
enable_tls、verify_https_client_certificate、api_key/read_only_api_key(启用 API key 必须同时启用 TLS)、jwt_rbac(细粒度 RBAC)、enforce_internal_auth(升级期间保持关闭以便旧 peer 兼容)、enable_snapshot_url_recovery(禁用远程 URL 恢复可缓解 SSRF 风险)
quotas 段(集群级资源配额)
max_resident_memory_percent/max_disk_usage_percent:进程内存与存储文件系统使用率上限,超限拒绝更新release_margin_percent(默认 5):回落到上限以下 5 个百分点才重新接单,避免在噪声区间反复进出服务- 配置仅在首次启动写入种子,之后以存储目录中的
quota.json为准,经共识在集群同步,并可由PUT /quotasAPI 修改(对应 lib/storage/src/quota.rs 与 tests/openapi/test_global... 相关端到端测试 tests/consensus_tests/test_global_quota.py)
cluster / tls / audit 段
- 如前所述:p2p 端口 6335、共识 tick 100ms、WAL 压缩 128 条
- TLS 证书三件套(
cert/key/ca_cert)与cert_ttl: 3600(HTTPS 端点的证书热轮换,不支持 gRPC 集群内通信) audit:结构化 JSON 审计日志,按日轮转,trust_forwarded_headers仅在可信反代后开启(防止客户端伪造 IP)
另有 config/development.yaml、config/production.yaml、config/deb.yaml 三种环境预设,可对照差异调整。
八、仓库结构速览与集成测试入口
围绕 README 的能力宣称,仓库目录可这样对应理解:
- src/:进程入口与 HTTP/gRPC 装配(
actix/REST 路由、tonic/gRPC、consensus.rs、settings.rs、startup.rs、snapshots.rs),以及wal_inspector/segment_inspector/wal_pop等诊断子命令入口 - lib/segment:最底层——向量存储、HNSW/payload 索引、ID 跟踪、距离空间实现
- lib/shard:分片抽象(更新、查询、优化器、代理段、快照、配额)
- lib/collection:集合层——副本集、分片路由、查询聚合(含融合)、遥测
- lib/storage:Table of Contents、共识内容管理、RBAC、审计
- lib/api:REST/gRPC 契约与 proto
- tests/openapi:基于 OpenAPI 的 90+ 端到端 API 测试(
conftest.py统一起服务),是验证 README 所列特性行为的最直接依据 - tests/consensus_tests:分布式/共识场景的黑盒集成测试
- tests/e2e_tests:快照、TLS、低资源、配额等更重的端到端场景
九、贡献与生态提示
- 开发前请阅读 docs/CONTRIBUTING.md;README 特别强调:开发分支是
dev而非master,fork 后从dev拉分支并向dev提 PR - 开发环境可用 Nix(shell.nix、tools/nix),本地开发配置见 config/development.yaml
- 遥测默认开启(config/config.yaml
telemetry_disabled: false),可用--disable-telemetry或配置项关闭 - 路线图文档位于 docs/roadmap/(2022–2024 各年度版本)
十、小结
以 README.md 为骨架可以完整勾勒 Qdrant 的产品面:Docker 一条命令起步、多语言官方客户端、进程内轻量版 Edge、REST/gRPC 双接口、稠密/稀疏/多向量检索、丰富 payload 过滤、RRF/DBSF 混合融合、最高 97% 的量化内存削减、分片副本的分布式部署,以及 Faceting、推荐、发现、多租户、GPU/SIMD 加速、io_uring 异步 I/O 与 WAL 持久化等工程特性。而 config/config.yaml 与lib/、src/下的实现代码则给出了每一项特性可核对的落点:从 HNSW 参数、优化器阈值到共识与配额配置,读者可以按本文给出的文件路径逐一深入,形成"配置—实现—测试"三层闭环的理解。
【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考