Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
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副本集紧密耦合,不能在多个数据库或副本集之间共享。对于副本集部署,由一群组专用搜索节点为副本集提供服务。对于分片集群,每个分片都维护自己独立的 mongot 节点群组。分片不股票mongot 实例。

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

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

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

spec.replicas字段控制Kubernetes Operator 部署的 mongot 实例数量。对于副本集源,spec.replicas 设置 mongot Pod 的总数。对于分片集群源,spec.replicas 设置每个分片的 mongot Pod 数量。

如果将 spec.replicas设立为大于 1 的值,则必须在 mongodmongot Pod 之间放置一个 L7 负载负载均衡器。mongod进程打开一个与 mongot 的长期 TCP 连接,因此 L4 负载负载均衡器无法在多个 mongot 实例之间分配查询 — 所有流量都流经该一个连接。L7 负载负载均衡器支持HTTP /2 和 gRPC,因此可以跨 mongot Pod 分发单个 gRPC 流,同时在查询游标运行期间将每个流固定到单个 mongot

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

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

  • Kubernetes中的MongoDB副本集,请参阅 在Community Edition中安装和使用在MongoDB Enterprise Edition中安装和使用搜索

  • 外部MongoDB副本集,请参阅安装和使用MongoDB Search 以及 Vector Search 与外部MongoDB Enterprise Edition。

要在以下位置使用MongoDB Search 和 Vector Search:

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

  • MongoDB Enterprise部署,必须通过以下方式之一部署功能齐全的MongoDB 8.2 或更高版本的副本集或分片集群:

    • 使用Kubernetes Operator 在Kubernetes集群内部

    • Kubernetes集群外部

  • Cloud Manager或MongoDB Ops Manager实例

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

下表显示了Kubernetes 操作符 自动执行的配置任务以及您必须执行的操作,才能在Kubernetes中成功部署MongoDB Search 和 向量搜索,以及连接到Kubernetes或外部MongoDB 部署中的MongoDB副本集或集群。

任务
(Inside Kubernetes)
Performed by
(External MongoDB)
Performed by

在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 节点进行连接

没有必要

配置托管负载负载均衡器(当 spec.replicas 大于 1 时)

Kubernetes Operator

Kubernetes Operator

配置非托管负载负载均衡器(当 spec.replicas 大于 1 时)

预配每个分片的TLS证书(具有TLS的分片的集群)

向外部公开负载负载均衡器(外部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字段并提供 TLS 证书。您可以将此字段设立为空对象({}),以使用默认设置启用TLS

自版本 1.8.0 起已弃用spec.security.tls.certificateKeySecretRef 已弃用。对于副本集部署, Kubernetes 操作符 仍然支持 certificateKeySecretRef,但您应迁移到 spec.security.tls.certsSecretPrefix。对于分片集群部署,您无法使用 certificateKeySecretRef,因为Kubernetes 操作符 会为每个分片读取单独的 mongot服务器证书密钥。

spec.security.tls.certsSecretPrefix 是可选字段。指定后, Kubernetes 操作符 会在其读取的所有证书密钥名称前加上 <certsSecretPrefix>-。Kubernetes 操作符 读取以下证书密钥:

集群拓扑结构
mongot 证书

副本集

[<certsSecretPrefix>-]<name>-search-cert

分片集群

[<certsSecretPrefix>-]<name>-search-0-<shardName>-cert (per shard)

如果设立spec.loadBalancer.managed,则负载负载均衡器客户端证书为 [<certsSecretPrefix>-]<name>-search-lb-0-client-cert。下表显示了负载负载均衡器服务器证书:

集群拓扑结构
证书

副本集

[<certsSecretPrefix>-]<name>-search-lb-0-cert

分片集群

[<certsSecretPrefix>-]<name>-search-lb-0-<shardName>-cert

TLS 证书必须由颁发MongoDB副本集使用的 CA 证书的同一 CA 颁发和签名。

当 MongoDBSearch 和 MongoDB 都由Kubernetes 操作符 部署时,根本的mongotmongod 配置主要由Kubernetes 操作符 本身处理。如果将MongoDB副本集部署在Kubernetes集群之外:

  • .spec.source.external.tls 字段必须使用Kubernetes密钥填充,该密钥包含您用于配置 mongod 的相同 CA 证书。

  • searchTLSMode 参数必须在 mongod 配置中设立为 requireTLS

在没有负载负载均衡器的情况下,mongod 使用 mTLS 直接连接到 mongotmongod 提供自己的客户端证书,mongot 根据受信任的 CA 对其进行验证。

如果您配置托管负载负载均衡器(spec.loadBalancer.managed),Envoy 代理会终止与 mongod 的 mTLS 连接,并与 mongot 建立新的 mTLS 连接。由于负载负载均衡器会终止并重新建立连接,因此在连接到 mongot 时,它会使用自己的客户端证书,而不是原始的 mongod 证书。mongot CA 必须信任颁发负载均衡器客户端证书的证书颁发机构。Kubernetes 操作符 自动管理 Envoy TLS 配置。它需要以下证书:

  • mongod 连接到的 Envoy 代理的 服务器证书。负载负载均衡器使用此证书终止传入的 mTLS 连接。

  • Envoy 代理的客户端证书,负载负载均衡器在建立上游 mTLS 连接时向 mongot 提供该证书。

遵循 spec.security.tls.certsSecretPrefix 定义的命名约定,将这些证书预配为Kubernetes Secret。有关完整的命名模式,请参阅MongoDB Search 和 向量搜索 Settings

在此页面上