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

部署MongoDB Search 和 Vector Search

您可以在 Kubernetes 集群中部署 MongoDB 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 实例。

mongot 和 mongod 之间的网络连接是双向的:

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

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

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

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

有无 Kubernetes 操作符 的搜索部署架构没有太大区别。Kubernetes 操作符 简化了部署功能完全的搜索节点所需的步骤,尤其是当数据库也由 Kubernetes 操作符 管理时。

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

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

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

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

    • 使用Kubernetes Operator 在Kubernetes集群内部

    • Kubernetes集群外部

  • Cloud Manager或MongoDB Ops Manager实例

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

下表显示了Kubernetes 操作符 自动执行的配置任务以及您必须执行的操作,才能在Kubernetes中成功部署MongoDB 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 节点进行连接

没有必要

您

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

Kubernetes Operator

Kubernetes Operator

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

您

您

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

您

您

向外部公开负载负载均衡器(外部MongoDB + 托管负载均衡器)

没有必要

您

下图展示了 mongot 进程的安全配置。如果 MongoDB 部署在 Kubernetes 集群内,Kubernetes 操作符会自动设置密钥文件身份验证,以便 MongoDB Search 和向量搜索。如果 MongoDB 部署是外部的,您必须创建一个 kubernetes secret,其中包含副本集的密钥文件凭证,并在 MongoDBSearch CR 中引用它。

mongot 流程使用 mTLS 对 mongod 连接进行身份验证。当您启用 TLS 时,mongot 进程会将 MongoDB 部署的 TLS 证书用作身份验证的客户端证书。此证书根据 mongot 所配置的 CA 证书进行验证。为了使身份验证正常工作,您必须将 mongot 和 mongod 都配置为启用 TLS。

当配置为索引同一 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.clusters[].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 操作符 部署时,根本的mongot 和 mongod 配置主要由Kubernetes 操作符 本身处理。如果将MongoDB副本集部署在Kubernetes集群之外:

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

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

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

如果您配置托管负载负载均衡器(spec.clusters[].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。

每个 mongot pod 都会持续向 pod 内的 /mongot/data/diagnostic.data/ 写入 FTDC 文件。FTDC 是一个二进制诊断流,可以捕获详细的 mongot 内部状态,并且是 MongoDB 支持用于诊断搜索问题的主节点 (primary node in the replica set) 文件。FTDC 默认处于启用状态。要学习如何复制 FTDC 文件以处理支持问题,请参阅 疑难排解 mongot 部署。

Kubernetes 操作符通过在 search StatefulSet 上使用 volumeClaimTemplate 将 PersistentVolumeClaim 挂载到每个 mongot pod 的 /mongot/data 位置,并且 mongot 会将其 FTDC 文件写入到该卷上的 /mongot/data/diagnostic.data/ 中。由于数据驻留在 PersistentVolumeClaim 上,因此它可以在 Pod 重启和重新调度后依然存在:当 StatefulSet 替换 Pod 时,它会重新挂载相同的 PersistentVolumeClaim。您可以使用 spec.clusters[].persistence 配置此卷MongoDBSearch 资源上的设置。