# 多租户策略
随着 ChatGPT 的普及,越来越多的开发人员正在使用 CVP(ChatGPT、向量数据库、Prompt)堆栈创建自己的 SaaS 服务。本指南介绍了如何在 Milvus 上实现多租户,Milvus 是世界上使用最广泛的向量数据库之一,以适应这一趋势。
多租户是一种架构,其中单个 Milvus 实例为多个租户提供服务。区分租户的最简单方法是将其数据和资源与其他租户分开。每个租户都有自己的专用资源或与其他租户共享资源,用于管理 Milvus 对象,如数据库、集合和分区。基于这些对象,有相应的方法可以实现 Milvus 的多租户。
面向数据库的多租户
自 Milvus 2.2.9 版本以来,现在可以使用对象数据库。你可以在单个 Milvus 集群中创建多个数据库。通过为每个租户分配一个数据库,可以实现面向数据库的多租户,以便他们可以创建自己的集合和分区,以充分利用其数据。然而,此策略确保租户的数据隔离和搜索性能,但闲置租户可能会浪费资源。
面向集合的多租户
有两种实现面向集合的多租户的可能方法。
所有租户一个集合
通过向一个集合添加租户字段来实现多租户的一个简单选项。在为特定租户进行近似最近邻(ANN)搜索时,添加一个过滤表达式,以过滤掉属于其他租户的所有实体。这是实现多租户的最简单方法。但是,请注意,过滤器的性能可能成为 ANN 搜索的瓶颈。
每个租户一个集合
另一种方法是为每个租户创建一个集合来存储其自己的数据,而不是在单个集合中存储所有租户的数据。这提供了更好的数据隔离和查询性能。然而,请记住,如果租户的数量超过了单个 Milvus 集群支持的集合的最大数量,这种方法就不适用了,因为它需要更多的资源调度、操作能力和成本投入。
面向分区的多租户
还有两种实现面向分区的多租户的可能方法:
每个租户一个分区
管理单个集合要比管理多个集合容易得多。与其创建多个集合,不如考虑为每个租户分配一个分区,以实现灵活的数据隔离和内存管理。面向分区的多租户的搜索性能要比面向集合的多租户好得多。然而,请注意,一个集合的租户数量不应超过集合可以容纳的分区的最大数量。
基于分区键的多租户
Milvus 2.2.9 引入了一个名为分区键的新功能。在创建集合时,指定一个租户字段并将其指定为分区键字段。Milvus 将基于分区键字段中的值将实体存储在一个分区中。在进行 ANN 搜索时,Milvus 根据指定的分区键切换到相应的分区,根据分区键过滤实体,并在过滤后的实体中进行搜索。
一旦为集合设置了分区键,就不能将实体批量插入集合。
这种策略解除了 Milvus 集合可以支持的最大租户数量的限制,并极大地简化了资源管理,因为 Milvus 会自动为你管理分区。
总之,你可以使用上述的任何一种或多种多租户策略来构建自己的解决方案。以下表格比较了这些策略在数据隔离、搜索性能和最大租户数量方面的差异。
数据隔离 | 搜索性能 | 最大租户数量 | 推荐场景 | |
---|---|---|---|---|
面向数据库 | 强 | 强 | 64 | 对于需要集合因项目而异的情况,特别适用于组织内部部门之间的数据隔离。 |
所有租户一个集合 | 弱 | 中 | 无 | 对于资源有限且对数据隔离不敏感的情况。 |
每个租户一个集合 | 强 | 强 | 小于 10,000 | 对于每个集群的租户数量不超过 10,000 的情况。 |
每个租户一个分区 | 中 | 强 | 4,096 | 对于每个集合的租户数量不超过 4,096 的情况。 |
基于分区键 | 中 | 强 | 10,000,000+ | 对于预计会迅速增加到数百万个租户的情况。 |