Qdrant 是一款比较新的大规模高性能向量搜索引擎,可以为 AI 应用提供底层支撑,目前已经有较为广泛的应用。
Qdrant 使用 Rust 编写,因此具备高性能和内存安全性的特点,同时采用独创的可过滤的 HNSW 索引,可以有效加速向量标量混合检索的性能,可以在性能和召回率方面有比较好地兼顾。
Qdrant 官网:https://qdrant.tech/
1. 单节点安装
推荐使用 Docker 方式安装 Qdrant,单节点的安装特别简单,我们首先拉取镜像:
docker pull qdrant/qdrant:v1.11.4
由于 Qdrant 更新比较快,所以当前使用的 v1.11.4 版本和最新的 v1.14.0(截止 20250714)有两个版本的差距,但是用法上应该是差不多的。
在运行之前我们需要准备配置文件,默认的配置文件可以从源码仓库中获取 https://github.com/qdrant/qdrant/blob/master/config/config.yaml
或者我们也可以复制配置文档页面的示例配置 https://qdrant.tech/documentation/guides/configuration/
这两种方法获取的配置基本上都是一样的,然后创建 Qdrant 的项目目录并将配置复制到项目目录下的 config/config.yaml
中,然后进行简单的修改。
为了基本的访问安全我们配置下 service
下的 api_key
以及 read_only_api_key
:
service:
api_key: xxxxxxxx
read_only_api_key: xxxxxxxx
其中 api_key
具备全部的管理权限,read_only_api_key
仅用于查询使用。
其他的暂时保持默认,我们在项目目录下创建 Docker Compose 配置文件:
services:
qdrant:
image: qdrant/qdrant:v1.11.4
restart: always
container_name: qdrant
ports:
- 6333:6333
- 6334:6334
- 6335:6335
expose:
- 6333
- 6334
- 6335
configs:
- source: qdrant_config
target: /qdrant/config/production.yaml
volumes:
- /data/qdrant:/qdrant/storage
configs:
qdrant_config:
file: ./config/config.yaml
Qdrant 主要监听 3 个端口,其中 6333 是 HTTP 端口,6334 是 gRPC 端口,6335 是集群间通信的端口。
在 configs
中我们将外部的配置文件映射到了容器内部,并且使用 volumes
映射外部的数据目录。
最后我们启动 Qdrant 服务:
docker compose up -d
启动之后查看日志没有问题,我们就可以访问 http://<ip>:6333/dashboard
查看管理页面。
我们可以点击 Tutorial
中的栏目,快速进行一些简单的 Collection 创建、写入数据和查询等操作。点击 Collections
菜单我们可以看到创建的 Collection 以及详细信息。点击 Console
可以运行一些简单的查询等。
以上就是 Qdrant 单节点的基本安装过程。
2. 分布式部署
如果是要配置集群部署,那么则至少需要 3 个以上的节点组成集群,集群的一致性使用 Raft 协议实现。
假如我们现在有 3 个节点,IP 地址如下:
10.22.1.21 node1
10.22.1.22 node2
10.22.1.23 node3
我们稍微修改下配置,就可以启动一个集群了,修改如下:
cluster:
enabled: true
开启集群的配置,然后每个节点都同步配置文件。
在第一个节点上,我们修改下 Docker Compose 配置文件如下:
services:
qdrant:
image: qdrant/qdrant:v1.11.4
command: ./entrypoint.sh --uri 'http://10.22.1.21:6335'
# ...
其实就是添加 command
传进去了 --uri
参数,这个参数就是当前节点的 IP 和端口,表示其他节点用什么样的 URI 来连接当前节点。
然后第二个节点和第三个节点分别为:
# node2
services:
qdrant:
image: qdrant/qdrant:v1.11.4
command: ./entrypoint.sh --uri 'http://10.22.1.22:6335' --bootstrap 'http://10.22.1.21:6335'
# ...
# node3
services:
qdrant:
image: qdrant/qdrant:v1.11.4
command: ./entrypoint.sh --uri 'http://10.22.1.23:6335' --bootstrap 'http://10.22.1.21:6335'
# ...
后面两个节点除了 --uri
要指定之外,还要指定 --bootstrap
表示使用哪个节点来引导,从而建立通信。
正常启动之后第一个节点就作为 Leader,启动时 Leader 可能会在连接时报一行错误,这是由于端口还没有开启导致的,只要不一直报错就没有什么影响。
注意 --uri
和 --bootstrap
要写 IP,因为我们使用的是容器网络,写主机名程序无法识别。
后面再次启动的时候,由于本地已经保存集群的状态,所以去掉后面的 --bootstrap
参数再启动也是没有问题的。
启动后可以查看集群的状态:
curl -H 'api-key: xxxxx' http://10.22.1.21:6333/cluster | python3 -m json.tool
可以看到节点列表以及当前节点的角色,如果其他节点有挂掉的并且被当前节点感知到,那么在 consensus_thread_status
中会有对应的报错信息。
Reference: