对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

部署MongoDB Search 和 Vector Search

您可以在Kubernetes集群中部署MongoDB Search 和 Vector Search,直接在应用程序中构建强大的搜索体验。使用MongoDB Search 和 Vector Search,您可以构建传统的文本搜索和AI支持的向量搜索功能,这些功能可自动与本地部署MongoDB 数据库同步。这样一来,在提供高级搜索功能的同时,就无需保持不同的系统同步。要学习;了解详情,请参阅:

要在本地部署中启用全文和语义搜索等搜索功能,必须部署MongoDB搜索和向量搜索进程(mongot),并将其与MongoDB 数据库部署(mongod) 连接。部署 mongot 是可选的,仅当您计划利用其提供的搜索功能时才需要部署。

MongoDB数据库进程 (mongod) 充当 mongot 的所有搜索查询的代理。mongod 将查询转发到 mongot,由其处理该查询。mongot 将查询结果返回给 mongod,然后将结果转发给您。您从不直接与 mongot交互。

每个 mongot进程都有自己的持久卷,不与数据库或其他搜索节点共享。存储用于维护根据持续源自数据库的数据构建的索引。索引定义(元数据)存储在数据库中。

mongot 执行以下操作:

  • 管理索引。

    mongot 负责更新数据库中的索引定义。

  • 从数据库中获取数据。

    mongot 节点与数据库建立永久连接,以便实时更新数据库中的索引。

  • 处理搜索查询。

    mongod 收到 $search$searchMeta$vectorSearch 查询时,它会将查询定向到 mongot 节点之一。接收查询的 mongot 会处理查询、聚合数据,并将结果返回给 mongod,然后再将结果转发给用户。

mongot 组件与单个MongoDB副本集紧密耦合,不能在多个数据库或副本集之间共享。这意味着副本集部署有自己的专用搜索节点。

mongotmongod 之间的网络连接是双向的:

  • mongot 建立与副本集的连接,以获取用于构建索引和运行查询的数据。

  • mongod 连接到 mongot 以转发搜索相关操作,例如索引管理和查询数据。

有或没有Kubernetes Operator 的搜索部署架构没有太大区别。Kubernetes Operator 简化了部署功能齐全的搜索节点所需的步骤,尤其是当数据库也由Kubernetes Operator托管时。

要部署,请应用MongoDBSearch 自定义资源 (CR), Kubernetes 操作符 会选择该资源并开始部署 mongot Pod,并请求 spec 中指定的持久存储。使用Kubernetes Operator部署的MongoDB Search和向量搜索可以针对Kubernetes Operator在同一Kubernetes集群内或完全独立的外部MongoDB数据库中部署的MongoDB副本集。要学习;了解如何部署和配置 mongot 以使用:

为了在以下环境中利用 MongoDB 搜索和向量搜索:

  • MongoDB Community部署,您必须使用Kubernetes 操作符在Kubernetes集群内部署功能齐全的MongoDB 8.2+副本集。

  • MongoDB Enterprise部署,您必须通过以下方式之一部署功能齐全的MongoDB 8.2+副本集:

    • 使用Kubernetes Operator 在Kubernetes集群内部

    • Kubernetes集群外部

  • Cloud Manager或MongoDB Ops Manager实例

开始之前,请考虑以下事项:

描述存储、网络、资源、Kubernetes版本和兼容性、命名空间和RBAC以及集群DNS要求。

  • 您必须有一个有效的 StorageClass,才能在 |k8s| 中创建持久卷。集群。如果没有它,您的 PersistentVolumeClaims 可能会保持待处理状态,并且MongoDB可能没有持久性存储。

  • 您必须具有正确配置的集群网络。ClusterIP、NodePort 或 LoadBalancer 等服务必须能够路由流量。如果外部客户端需要访问权限,设立设置入口或负载负载均衡器。

  • 必须为数据库和搜索节点分配足够的 CPU、内存和磁盘空间,因为 MongoDB 数据库、MongoDB 搜索和向量搜索工作负载属于资源密集型工作负载。我们建议在 Pod 规范中使用请求和限制,以避免驱逐或限制。

  • 您要使用的MongoDB操作符或Helm图表必须支持您的Kubernetes版本。某些 CRD 或 API 因版本而异。要了解更多信息,请参阅Kubernetes 操作符兼容性的 MongoDB 控制器。

  • 您必须创建任何所需的 RBAC 角色和角色绑定,这样 Kubernetes 操作符和 Pod 中运行的进程才能管理资源。

描述部署MongoDB Search 和 Vector Search 时的限制。

无法在以下架构上部署MongoDB Search 和 Vector Search:

  • IBM Power (ppc64le)

  • IBM Z (s390x)

下表显示了Kubernetes Operator 自动执行的配置任务,以及要在Kubernetes中成功部署MongoDB Search 和 Vector Search,以及连接到Kubernetes中的MongoDB副本集或外部MongoDB副本集必须采取的操作。

任务
(在 Kubernetes 内)
执行者
(外部 MongoDB)
执行者

在Kubernetes内部署MongoDB Ops Manager

Kubernetes Operator
Kubernetes Operator

在Kubernetes外部部署Cloud Manager或MongoDB Ops Manager

部署MongoDB副本集

Kubernetes Operator

创建 MongoDBSearch 自定义资源

为MongoDB副本集提供连接字符串

Kubernetes Operator

创建 mongot 配置 YAML

Kubernetes Operator
Kubernetes Operator

在每个 mongod进程中设置必要的副本集参数

Kubernetes Operator

mongot 创建具有 searchCoordinator角色的用户

Kubernetes Operator 和您通过应用 MongoDBUser资源

使用具有查询搜索所需权限的用户配置MongoDB副本集

创建MongoDB Search 和 Vector Search 索引

向外部公开搜索Pod,以便从每个 mongod节点进行连接

没有必要

向外部公开mongod Pod,以便从 mongot 节点进行连接

没有必要

在Kubernetes集群中运行的mongod和mongot进程的架构。

下图显示了Kubernetes集群中具有MongoDB Enterprise副本集的单个MongoDB Search 和 Vector Search实例的部署架构。

显示MongoDB Search 和 Vector Search with MongoDB Enterprise在Kubernetes集群中的部署架构的示意图。
点击放大

下图显示了Kubernetes Operator 在Kubernetes集群中为带有MongoDB Enterprise版副本集的MongoDB Search 和 Vector Search 部署的组件。

图表显示了MongoDB Enterprise副本集包含的组件,其中使用了操作符 的MongoDB Search 和 Vector Search部署。
点击放大

mongotmongod 进程同时部署在Kubernetes集群内时, Kubernetes Operator 会自动为这两个进程执行配置。具体来说, Kubernetes Operator 执行以下操作:

  1. 使用 spec.source.mongodbResourceRef 查找 MongoDBSearch 引用的MongoDB CR,或根据命名约定查找与 MongoDBSearch 同名的 MongoDB CR

  2. YAML 文件中生成 mongot 配置,并将其保存到名为 <MongoDBSearch.metadata.name>-search-config 的配置映射中。

    配置映射由搜索Pod 挂载,YAML 配置由 mongot 的进程在初创企业时使用。生成的 YAML 包含有关如何连接到副本集、TLS 设置等的所有信息。

  3. 部署名为 <MongoDBSearch.metadata.name>-search 的MongoDB Search 和 Vector Search 有状态设立,并根据 CR 中的 spec.persistencespec.resourceRequirements 设置配置存储和资源要求。

  4. 通过添加必要的 setParameter 选项(包括mongot主机的主机名和端口号)来更新每个 mongod进程的配置。必要的 setParameter 选项,包括MongoDB副本集的主机名和端口号。

您必须执行以下操作:

  1. 使用 MongoDBUser 自定义资源在副本集创建用户。mongot 使用该用户的凭证连接到副本集以获取数据:

    • 用户名可以是任意的(在示例中,我们使用 search-sync-source-user),但必须设立searchCoordinator角色。

    • 该用户的用户名和密码分别在 MongoDBSearch.spec.source.usernameMongoDBSearch.spec.source.passwordSecretRef 中传递。

      密码密钥可以指用于创建 MongoDBUser 规范(在 MongoDBUser.spec.source.passwordSecretKeyRef 中)的包含用户密码的相同密钥。

  2. 配置并应用MongoDBSearch 自定义资源。

要学习;了解有关 进程的 CR mongot设置的更多信息,请参阅MongoDB搜索和向量搜索设置。

部署在Kubernetes集群中的mongot进程的架构,用于使用在Kubernetes集群外部运行的mongod进程。

下图展示了使用外部MongoDB Enterprise版副本集的Kubernetes集群中MongoDB Search 和 Vector Search 的部署架构。

显示MongoDB Search 和 Vector Search with MongoDB Enterprise在Kubernetes集群中的部署架构的示意图。
点击放大

下图显示了Kubernetes Operator 在Kubernetes集群中为MongoDB Search 和 Vector Search 部署的组件。

显示使用操作符部署带有MongoDB Search 的MongoDB Enterprise副本集所包含组件的图表。
点击放大

当您在Kubernetes外部MongoDB 部署时,为了利用MongoDB Search 和 Vector Search,您可以使用Kubernetes Operator部署mongot,并且必须手动执行一些步骤。Kubernetes Operator 处理搜索Pod 的配置。但是,当MongoDB副本集位于Kubernetes外部时,您必须重新配置MongoDB节点和网络。

您负责以下手动配置:

  1. 在外部副本集的每个 mongod进程上使用 setParameter 配置以下参数。配置时,将 <search-service-hostname>:27028 替换为 MongoDBSearch 服务的实际可解析主机名和端口。

    setParameter:
    mongotHost: "<search-service-hostname>:27028"
    searchIndexManagementHostAndPort: "<search-service-hostname>:27028"
    skipAuthenticationToSearchIndexManagementServer: false
    searchTLSMode: "disabled" # or "requireTLS" for TLS deployments
    useGrpcForSearch: true
  2. 在外部副本集为搜索同步进程创建一个用户。此用户必须具有 searchCoordinator角色。

    - userName: "search-sync-source"
    password: "<your-search-sync-password>"
    database: "admin"
    roles:
    - role: "searchCoordinator"
    db: "admin"
  1. 配置并应用MongoDBSearch CR,其中 spec.source.external 指向外部MongoDB托管。

  2. 为搜索同步用户的密码创建Kubernetes密钥。

    apiVersion: v1
    kind: Secret
    metadata:
    name: search-sync-source-password
    stringData:
    password: "your-search-sync-password"
  3. 配置网络和 DNS,确保外部MongoDB和搜索Pod 之间存在双向连接。您的外部MongoDB环境必须能够解析您的搜索服务主机名 (<search-service-hostname>)。

要学习;了解有关用于连接到外部 mongod进程的 mongot进程的CR设置的更多信息,请参阅MongoDB搜索和向量搜索设置。

下图说明了 mongot进程的安全配置。如果MongoDB服务器位于Kubernetes集群内部,Kubernetes Operator 会自动为MongoDB 搜索和向量搜索设置密钥文件身份验证。如果MongoDB服务器位于外部,则必须创建一个包含副本集凭证的kubernetes secret,并在 MongoDBSearch CR 中引用它。

显示用于搜索的密钥文件身份验证和 TLS 配置的图表。
点击放大

mongot进程使用 mTLS 对 mongod 连接进行身份验证。启用TLS后,mongot进程将使用MongoDB服务器的TLS证书作为客户端证书进行身份验证。此证书根据配置 mongot 的 CA 证书进行验证。为了使身份验证正常工作,您必须在启用 TLS 的情况下配置 mongotmongod

当配置为索引同一 Kubernetes 集群中的 MongoDB 资源时,Kubernetes 操作符会自动将 mongod CA 证书传播到 mongot,并为搜索查询连接启用 mTLS(如果 MongoDB 和 MongoDBSearch 资源都配置了 TLS)。如果MongoDB副本集部署在Kubernetes外部,则必须创建一个包含副本集 CA 证书的kubernetes secret,并在 MongoDBSearch.spec.source.external.tls.ca字段中引用它,以便为搜索查询请求启用mTLS身份验证。

MongoDBSearch 可以使用 TLS 保护传输中的数据和凭证。对于索引管理命令和搜索查询,请指定(即使是空对象,即 {}spec.security.tls字段,并在 spec.security.tls.certificateKeySecretRef字段的kubernetes secret中提供 TLS 证书。此 TLS 证书必须由颁发 MongoDB 副本集使用的 CA 证书的同一 CA 颁发和签名。

当 MongoDBSearch 和 MongoDB 都由 Kubernetes 操作符 部署时,根本的 mongotmongod 配置主要由 Kubernetes 操作符 本身处理。当MongoDB副本集部署在Kubernetes之外时,.spec.source.external.tls字段必须使用包含与配置 mongod 相同的 CA 证书的kubernetes secret来填充,并且 mongod 配置本身必须将 searchTLSMode 参数设立为requireTLS