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

多租户和 Azure 存储

Azure 存储是几乎每个解决方案中都会使用的基础服务。 多租户解决方案通常将 Azure 存储用于 blob、文件、队列和表存储。 在此页上,我们会介绍一些对多租户解决方案非常有用的 Azure 存储功能,然后提供可帮助你规划如何使用 Azure 存储的指导的链接。

支持多租户的 Azure 存储功能

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

共享访问签名

从客户端应用程序使用 Azure 存储时,请务必考虑是否应通过你控制的其他组件(例如内容分发网络或 API)发送客户端请求,或者客户端是否应直接连接到存储帐户。 可能有充分的理由通过其他组件发送请求,包括在网络边缘缓存数据。 但是在某些情况下,客户端终结点可以直接连接到 Azure 存储以下载或上传数据会十分有利。 此连接可帮助提高解决方案的性能,尤其是在使用大型 blob 或大量文件时。 它还可减少后端应用程序和服务器上的负载,并且可减少网络跃点数。 使用共享访问签名 (SAS) 可以安全地向客户端应用程序提供对 Azure 存储中的对象的访问。

共享访问签名可用于限制客户端可以执行的操作范围,以及可以对其执行操作的对象。 例如,如果你将一个共享存储帐户用于所有租户,并且将租户 A 的所有数据存储在名为 tenanta 的 blob 容器中,则可以创建仅允许租户 A 的用户访问该容器的 SAS。 有关详细信息,请参阅隔离模型,了解可用于在存储帐户中隔离租户数据的方法。

附属密钥模式可用于从应用层发出受约束且限定范围的共享访问签名。 例如,假设你有一个允许用户上传视频的多租户应用程序。 你的 API 或应用层可以使用你自己的身份验证系统对客户端进行身份验证。 你随后可以向客户端提供 SAS,允许它们将视频文件上传到指定 blob(上传到指定的容器和 blob 路径中)。 客户端随后将文件直接上传到存储帐户,从而避免 API 上出现额外带宽和负载。 如果尝试从 blob 容器读取数据,或者尝试将数据写入容器的不同部分或存储帐户中的其他容器,则 Azure 存储会阻止请求。 签名会在可配置的时间段后过期。

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

基于标识的访问控制

Azure 存储还使用 Microsoft Entra ID 提供基于标识的访问控制。 此功能还允许你使用基于属性的访问控制,使你可以更精细地访问 blob 路径或使用特定租户 ID 标记的 blob。

生命周期管理

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

请考虑使用生命周期管理策略为所有租户或租户子集设置 blob 生命周期。 生命周期管理策略可以应用于 blob 容器或是应用于容器中的 blob 子集。 但是,生命周期管理策略中可以指定的规则数方面存在限制。 请确保在多租户环境中规划和测试此功能的使用,如果超出限制,请考虑部署多个存储帐户。

不可变存储

使用基于时间的保留策略对存储容器配置不可变 blob 存储时,Azure 存储会阻止在指定时间之前删除或修改数据。 阻止在存储帐户层强制执行,适用于所有用户。 即使是组织的管理员也无法删除不可变数据。

使用具有维护数据或记录的法律或合规性要求的租户时,不可变存储可能非常有用。 但是,应考虑如何在租户生命周期的上下文中使用此功能。 例如,如果租户已登出并请求删除其数据,则可能无法满足其请求。 如果将不可变存储用于租户的数据,请考虑如何在服务条款中解决此问题。

服务器端复制

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

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

如果需要直接从代码使用服务器端复制 API,请考虑在处理较小 blob 时使用从 URL 放置块 API、从 URL 放置页 API、从 URL 追加块 API 以及从 URL 复制 Blob API。

对象复制

对象复制功能自动在源存储帐户与目标存储帐户之间复制数据。 对象复制是异步的。 在多租户解决方案中,如果需要在部署缩放单元之间或是在地理节点模式的实现中持续复制数据,此功能可能非常有用。

加密

通过 Azure 存储可为数据提供加密密钥。 在多租户解决方案中,请考虑将此功能与加密范围相结合,使你可以为不同的租户定义不同的加密密钥,即使数据存储在相同存储帐户中也是如此。 通过将这些功能结合使用,还可以使租户可以控制自己的数据。 如果他们需要停用其帐户,则可以删除加密密钥,其数据不再可访问。

监视

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

Azure 存储提供内置监视功能。 考虑将在 Azure 存储帐户中使用的服务会十分重要。 例如,使用 blob 时,可以查看存储帐户的总容量,但无法查看单个容器。 相反,使用文件共享时,可以查看每个共享的容量,但无法查看每个文件夹的容量。

还可以记录对 Azure 存储发出的所有请求,随后可以聚合并分析这些日志。 这在如何为每个租户聚合和分组数据方面提供了更大的灵活性。 但是,在创建针对 Azure 存储的大量请求的解决方案中,请务必考虑从此方法中获得的好处是否证明捕获和处理这些日志所需的成本是合理的。

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

隔离模型

在处理使用 Azure 存储的多租户系统时,需要在你想要使用的隔离级别方面做出决策。 Azure 存储支持多种隔离模型。

每个租户都具有存储帐户

最强的隔离级别是为租户部署专用存储帐户。 这可确保所有存储密钥都进行隔离,并且可以独立轮换。 通过此方法可以缩放解决方案,以避免适用于每个存储帐户的限制和配额,但是你还需要考虑可部署到单个 Azure 订阅中的最大存储帐户数。

注意

Azure 存储具有许多配额和限制,在选择隔离模型时应进行考虑。 这些配合和限制包括 Azure 服务限制可伸缩性目标以及 Azure 存储资源提供程序的可伸缩性目标

此外,Azure 存储的每个组件为租户隔离提供进一步选项。

Blob 存储隔离模型

下表汇总了 Azure 存储 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 分配访问权限。 但是,Azure 存储提供了列出(枚举)以指定前缀开头的 blob 的功能,这在使用共享 blob 容器并且不需要目录级访问控制时可能十分有用。

通过 Azure 存储的分层命名空间功能能够定义更强大的目录或文件夹概念(包括特定于目录的访问控制)。 这在你具有共享 blob 容器,但是要授予对单个租户数据的访问权限的一些多租户方案中非常有用。

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

使用共享容器时,请考虑是否需要跟踪每个租户的数据和 Azure 存储服务使用情况,并规划执行此操作的方法。 有关详细信息,请参阅监视

每个租户都具有 Blob 容器

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

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

文件存储隔离模型

下表汇总了 Azure 存储文件的主要租户隔离模型之间的差异:

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

共享文件共享

使用文件共享时,可以选择使用共享文件共享,然后使用文件路径分隔每个租户的数据:

租户 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 时,无法授予对目录的访问权限。

使用共享文件共享时,请考虑是否需要跟踪每个租户的数据和 Azure 存储服务使用情况,然后规划执行此操作的方法(根据需要)。 有关详细信息,请参阅监视

每个租户都具有文件共享

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

通过为每个租户创建文件共享,可以使用 Azure 存储访问控制(包括 SAS)为每个租户的数据管理访问权限。 还可以轻松监视每个文件共享使用的容量。

表存储隔离模型

下表汇总了 Azure 存储表的主要租户隔离模型之间的差异:

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

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

将表存储与单个共享表一起使用时,可以考虑使用对分区的内置支持。 每个实体必须包含分区键。 租户标识符通常是用于分区键的好选择。

通过共享访问签名和策略可以指定分区键范围,Azure 存储可确保包含签名的请求只能访问指定分区键范围。 这使你可以实现允许不受信任的客户端访问单个租户的分区,而不会影响其他租户的附属密钥模式

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

每个租户都具有表

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

通过为每个租户创建表,可以使用 Azure 存储访问控制(包括 SAS)为每个租户的数据管理访问权限。

队列存储隔离模型

下表汇总了 Azure 存储队列的主要租户隔离模型之间的差异:

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

共享队列

如果选择共享队列,请考虑适用的配额和限制。 在请求量较高的解决方案中,请考虑每秒 2,000 个消息的目标吞吐量是否足够。

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

每个租户都具有队列

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

通过为每个租户创建队列,可以使用 Azure 存储访问控制(包括 SAS)为每个租户的数据管理访问权限。

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

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

  • John Downs | FastTrack for Azure 首席客户工程师

其他参与者:

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

后续步骤

查看多租户的存储和数据方法