Docs 菜单

为 Atlas Vector Search 构建多租户架构

您可以使用 Atlas Vector Search 实现多租户,以便应用程序的单个实例为多个租户提供服务。本页面描述了专门适用于 Atlas Vector Search 的设计建议。这些建议与我们针对 Atlas 的 多租户建议不同。

在为 Atlas Vector Search 设计多租户架构时,请参考以下建议。

重要

本指南假设您可以将租户共置于单个 VPC中。否则,您必须为每个租户维护单独的项目,但我们不建议在 Atlas Vector Search 中这样做。

我们建议将所有租户数据存储在单个集合、单个数据库和集群中。您可以通过在每个文档中包含一个 tenant_id 字段来区分租户。此字段可以是租户的任何唯一标识符,例如 UUID 或租户名称。您可以在 Atlas Vector Search 索引和查询中使用此字段作为预过滤器

这种集中式方法具有以下优点:

  • 易于建模和扩展。

  • 简化维护操作。

  • 通过 tenant_id 预过滤以实现高效的查询路由。

    注意

    我们保证不会为不符合此筛选条件的租户提供服务。

我们建议将每个租户存储在单独的集合中,因为这种方法可能会导致 变更流负载根据集合数量而变化。这可能会对性能和监控功能产生负面影响。Atlas 中的数据隔离保证适用于数据库级别,因此使用多个集合没有额外的数据隔离优点。

相反,对所有租户使用一个集合。有关如何从每个租户一个集合模型迁移到单个集合模型的示例,请参阅从每个租户一个集合模型迁移。

请考虑以下策略,使用推荐的方法缓解潜在的性能问题。

如果您因数据分布不均衡(一些大型租户和许多小型租户)而遇到性能问题,请使用 MongoDB Views 将大型租户与小型租户分开:

  • 大型租户(前 1%)

    • 为每个大型租户创建一个视图。

    • 为每个视图创建一个索引。

    • 维护大型租户的记录,在查询时进行检查,以便相应地路由查询。

  • 小型租户(剩余租户)

    • 为所有小型租户创建单一视图。

    • 为此视图构建单一索引。

    • 使用 tenant_id 字段作为预过滤器来相应地路由查询。

以下示例演示如何使用 mongosh 为大型和小型租户创建视图:

记录您的大型租户及其相应的 tenant_id 值,然后为每个租户创建一个视图:

db.createView(
"<viewName>",
"<collectionName>",
[
{
"$match": {
"tenant_id": "<largeTenantId>"
}
}
]
)

为小型租户创建视图,过滤掉大型租户:

db.createView(
"<viewName>",
"<collectionName>",
[
{
"$match": {
"tenant_id": {
"$nin": [ "<largeTenantId1>", "<largeTenantId2>", ... ]
}
}
}
]
)

创建视图后,为每个视图创建索引。请验证以下内容:

  • 在为索引指定集合名称时,请使用视图名称而非原始集合名称。

  • 确保小型租户视图中的索引包含 tenant_id 字段作为预过滤器。

有关创建索引的说明,请参阅创建索引页面。

如果您有许多租户,每个租户都有大量向量,请考虑使用基于分区的系统,将数据分发到分片上。

您可以使用 tenant_id 字段作为分片键,根据租户 ID 在特定范围内分发数据。有关更多信息,请参阅范围分片。

要从每个租户一个集合的模型迁移到单个集合的模型,请处理每个租户的集合,并将文档插入到一个新的集合中。