Qdrant 单机和集群安装部署

2025/07/14

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:

  1. https://qdrant.tech/documentation/guides/installation/
  2. https://qdrant.tech/documentation/guides/security/
  3. https://qdrant.tech/documentation/guides/configuration/
  4. https://qdrant.tech/documentation/guides/distributed_deployment/