你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

多租户和 Azure 存储

Azure 存储是几乎每个解决方案都使用的基础服务。 多租户解决方案通常将存储用于 Blob、文件、队列和表存储。 本文介绍多租户解决方案的存储功能。 它提供了可帮助你规划如何使用存储的指南的链接。

支持多租户的存储功能

Azure 存储包含许多支持多租户的功能。

共享访问签名

从客户端应用程序使用存储时,请考虑是否通过你控制的另一个组件(例如内容分发网络或 API)路由客户端请求。 或者,可以允许客户端直接连接到存储帐户。 通过另一个组件发送请求可提供在网络边缘缓存数据等优势。

客户端直接访问存储以下载或上传数据时,可以提高性能,尤其是对于大型 Blob 或大量文件。 它还减少了后端应用程序和服务器上的负载,并降低了网络跃点的数量。

使用共享访问签名(SAS),可以安全地向客户端应用程序提供对存储中对象的访问。

可以使用 SAS 限制客户端可执行的操作范围,以及可操作的对象。 例如,如果您为所有租户拥有一个共享存储帐户,并将租户 A 的数据存储在名为 tenanta 的 Blob 容器中,则可以创建一个 SAS,限制只有租户 A 的用户能够访问该容器。 有关隔离存储帐户中租户数据的方法的详细信息,请参阅 隔离模型

使用附属密钥模式从应用程序层发放受约束和限定的 SAS 令牌。 例如,如果多租户应用程序允许用户上传视频,则 API 或应用程序层可以使用应用程序的身份验证系统对客户端进行身份验证。 然后,可以提供一个 SAS,允许客户端将视频文件上传到指定容器中的特定 Blob 路径。 然后,客户端会将文件直接上传到存储帐户,从而减少 API 上的带宽和负载。 如果客户端尝试从 Blob 容器读取数据或将数据写入存储帐户中的另一个容器,存储会阻止请求。 SAS 将在可配置的时间段后过期。

存储访问策略 扩展 SAS 功能,使你可以定义在发出多个签名时要使用的单个策略。

基于标识的访问控制

Azure 存储还通过 Microsoft Entra ID 提供 基于标识的访问控制 。 此功能支持 基于属性的访问控制,该访问控制提供对 blob 路径的精细访问,或对使用特定租户 ID 标记的 blob 进行精细访问。

生命周期管理

在多租户解决方案中使用 Blob 存储时,租户可能需要不同的策略来保留数据。 存储大量数据时,可能还需要将特定于租户的数据自动移动到 冷存储层或存档存储层 ,以优化成本。

使用 生命周期管理策略 为所有租户或租户子集设置 Blob 生命周期。 可以将生命周期管理策略应用于 Blob 容器或容器中的 blob 子集。 但生命周期管理策略对可以指定的规则数有限制。 在多租户环境中仔细规划和测试配置。 如果您的规则数超过限制,应考虑部署多个存储账户。

不可变存储

使用基于时间的保留策略在存储容器上配置不可变 Blob 存储时,存储会阻止在指定时间之前删除或修改数据。 此强制措施发生在存储帐户层,适用于所有用户,包括组织的管理员。

如果租户必须出于法律或合规性要求而维护数据或记录,请使用不可变存储。 评估此功能如何适应 租户生命周期。 例如,如果租户已解除业务关系并请求删除数据,你可能无法满足他们的请求。 如果对租户数据使用不可变存储,请考虑如何在服务条款中解决此问题。

服务器端复制

在多租户系统中,可能需要将数据从一个存储帐户移到另一个存储帐户。 例如,如果在部署缩放单元之间移动租户或重新平衡存储帐户的分片集,则需要复制或移动特定租户的数据。 如果拥有大量数据,请使用 服务器端复制 API 减少迁移时间。

AzCopy 工具是一个应用程序,可以从计算机或虚拟机运行以管理复制过程。 AzCopy 与服务器端复制功能兼容,它提供可从解决方案运行的可编写脚本的命令行接口。 还可以使用 AzCopy 上传和下载大量数据。

如果需要直接从代码使用服务器端复制 API,请考虑使用以下选项:

对象复制

对象复制 是一项自动和异步复制源存储帐户和目标存储帐户之间的数据的功能。 在多租户解决方案中,使用此功能可在部署标记之间或是在实现地理节点模式时持续复制数据。

加密

使用 Azure 存储可以为数据 提供加密密钥 。 在多租户解决方案中,请考虑将此功能与 加密范围相结合。 可以将不同的加密密钥分配给不同的租户,即使其数据驻留在同一存储帐户中也是如此。 这些功能共同使租户能够控制自己的数据。 如果他们停用其帐户,则删除加密密钥可确保没有人可以访问其数据。

监测

在多租户解决方案中,考虑是否需要 度量每个租户的消耗量。 定义要跟踪的特定指标,例如每个租户使用的存储容量或每个租户数据执行的操作数。 还可使用成本分配来跟踪每个租户的使用成本并跨多个订阅实现退款。

Azure 存储提供 内置监视功能。 请考虑计划在存储帐户中使用的服务。 例如,使用 Blob 时,可以查看存储帐户的总容量,但不能查看单个容器。 使用文件共享时,可以查看每个共享的容量,但不能查看每个文件夹的容量。

还可以 将所有请求记录到存储,然后聚合和分析这些日志。 在聚合和对每个租户的数据进行分组时,此方法提供灵活性。 但在为存储创建大量请求的解决方案中,请考虑从此方法中获得的好处是否证明捕获和处理这些日志的成本是正当的。

Azure 存储清单 提供了另一种方法来度量 Blob 容器的总大小。

隔离模型

在多租户系统中使用存储时,请确定要应用的隔离级别。 Azure 存储支持多个隔离模型。

每个租户的存储帐户

最强的隔离级别为每个租户使用专用存储帐户。 此模型确保存储密钥的完整隔离,并且可以独立轮换。 它还允许将解决方案扩展到每个存储帐户的限制和配额之外。 但还必须考虑单个 Azure 订阅中允许的最大存储帐户数。

注释

选择隔离模型时,请考虑存储配额和限制。 这些限制包括 Azure 服务限制常规可伸缩性目标和存储资源提供程序的可伸缩性目标

存储的每个组件都提供了租户隔离的进一步选项。

Blob 存储隔离模型

下表总结了存储 Blob 对象的主要租户隔离模型之间的差异。

注意事项 共享 blob 容器 每个租户的 Blob 容器 每个租户的存储帐户
数据隔离 低到中等。 使用路径标识每个租户的数据或分层命名空间。 中等。 使用容器范围的 SAS URL 来支持安全隔离。
性能隔离 低。 大多数配额和限制适用于整个存储帐户。
部署复杂性 中等
操作复杂性 中等
示例方案 每个租户都只有几个 Blob。 发放租户范围的 SAS URL。 每个租户都有自己的部署标识。

共享 blob 容器

使用 Blob 存储时,可以使用包含 Blob 路径的共享 Blob 容器来分隔每个租户的数据。

租户 ID 示例 blob 路径
tenant-a https://contoso.blob.core.windows.net/sharedcontainer/tenant-a/blob1.mp4
tenant-b https://contoso.blob.core.windows.net/sharedcontainer/tenant-b/blob2.mp4

虽然此方法易于实现,但在许多应用场景中,Blob 路径都不会在租户间提供足够的隔离。 Blob 存储不支持真正的目录或文件夹结构,因此无法向指定路径中的所有 Blob 分配访问权限。 但是,存储提供 列出或枚举以指定前缀开头的 blob 的功能。 此功能支持使用共享 Blob 容器且不需要目录级访问控制的方案。

存储中的 分层命名空间 功能提供更强大的目录或文件夹结构,包括特定于目录的访问控制。 此功能支持具有共享 Blob 容器但想要授予对单个租户数据的访问权限的多租户方案。

在某些多租户解决方案中,可能只需要为每个租户存储一个 blob 或一组 blob,例如用于自定义用户界面的租户图标。 单个共享 Blob 容器可能适用于这些方案。 可以使用租户标识符作为 Blob 名称,并读取特定 Blob,而不是枚举 Blob 路径。

使用共享容器时,请考虑是否需要跟踪每个租户的数据和存储使用情况。 有关详细信息,请参阅监视

每个租户的 Blob 容器

可以在单个存储帐户中为每个租户创建单个 Blob 容器。 可以在存储帐户中创建的 Blob 容器数没有限制。

为每个租户创建容器时,可以使用存储访问控制(包括 SAS)来管理每个租户数据的访问。 还可以轻松监视每个容器使用的容量。

文件存储隔离模型

下表总结了存储文件的主要租赁隔离模型之间的差异。

注意事项 共享文件共享 每个租户的文件共享 每个租户的存储帐户
数据隔离 中-高。 为特定于租户的文件和目录应用授权规则。 中等到高
性能隔离 低到中等。 大多数配额和限制适用于整个存储帐户,但应为每个文件共享设置大小配额。
部署复杂性 中等
操作复杂性 中等
示例方案 应用程序控制对文件的所有访问。 租户访问自己的文件。 每个租户都有自己的部署标识。

共享文件共享

使用文件共享时,可以使用包含文件路径的共享文件共享来分隔每个租户的数据。

租户 ID 示例文件路径
tenant-a https://contoso.file.core.windows.net/share/tenant-a/blob1.mp4
tenant-b https://contoso.file.core.windows.net/share/tenant-b/blob2.mp4

当应用程序通过服务器消息块(SMB)协议进行通信并且在本地或 Azure 中使用 Active Directory 域服务时,文件共享支持共享级别和目录或文件级别的 授权

在其他方案中,请考虑使用 SAS 授予对特定文件共享或文件的访问权限。 SAS 不支持授予对目录的访问权限。

使用共享文件共享时,请考虑是否需要跟踪每个租户的数据和存储使用情况。 有关详细信息,请参阅监视

每个租户的文件共享

可以在单个存储帐户中为每个租户创建单个文件共享。 在存储帐户中创建的文件共享数没有限制。

对于此方案,可以使用存储访问控制(包括 SAS)来管理每个租户数据的访问。 还可以轻松监视每个文件共享使用的容量。

表存储隔离模型

下表总结了存储表的主要租赁隔离模型之间的差异。

注意事项 每个租户具有分区键的共享表 每个租户的表 每个租户的存储帐户
数据隔离 低。 应用程序强制隔离。 低到中等
性能隔离 低。 大多数配额和限制适用于整个存储帐户。
部署复杂性 中等
操作复杂性 中等
示例方案 大型多租户解决方案具有共享应用程序层。 发放租户范围的 SAS URL。 每个租户都有自己的部署标识。

每个租户具有分区键的共享表

使用包含单个共享表的表存储时,请考虑使用 对分区的内置支持。 每个实体都必须包含分区键,例如租户标识符。

使用 SAS 令牌和策略可以指定分区键范围。 Azure 存储可确保包含签名的请求只能访问指定的分区键范围。 可以实现 辅助密钥模式,允许不受信任的客户端访问单个租户的分区,而不会影响其他租户。

对于大规模应用程序,请考虑每个表分区和存储帐户的最大吞吐量。

每个租户的表

可以在单个存储帐户中为每个租户创建单个表。 在存储帐户中创建的表数没有限制。

对于此方案,可以使用存储访问控制(包括 SAS)来管理每个租户数据的访问。

队列存储隔离模型

下表总结了存储队列的主要租赁隔离模型之间的差异。

注意事项 共享队列 每个租户的队列 每个租户的存储帐户
数据隔离 低到中等
性能隔离 低。 大多数配额和限制适用于整个存储帐户。
部署复杂性 中等
操作复杂性 中等
示例方案 大型多租户解决方案具有共享应用程序层。 发放租户范围的 SAS URL。 每个租户都有自己的部署标识。

共享队列

如果您共享队列,请考虑相关的配额和限制。 在请求量较高的解决方案中,请考虑每秒 2,000 条消息的目标吞吐量是否适用于你的方案。

队列不提供分区或子队列,因此所有租户的数据可能会变得令人混合。

每个租户的队列

可以在单个存储帐户中为每个租户创建单个队列。 在存储帐户中创建的队列数没有限制。

对于此方案,可以使用存储访问控制(包括 SAS)来管理每个租户数据的访问。

动态为每个租户创建队列时,请考虑应用程序层如何处理来自每个租户队列的消息。 对于高级方案,请考虑使用支持会话消息自动转发主题和订阅等功能的 Azure 服务总线。 这些功能可以增强多租户解决方案。

供稿人

Microsoft维护本文。 以下参与者撰写了本文。

主要作者:

  • John Downs |Azure 模式和做法的主要软件工程师

其他参与者:

若要查看非公开的LinkedIn个人资料,请登录LinkedIn。