Compartilhar via

有关 Azure Cosmos DB for Table 的常见问题解答

适用对象:

重要

你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑使用 Azure Cosmos DB for NoSQL

比较 Azure Cosmos DB for Table 和 Azure 表存储

API for Table 与 Azure 表存储的行为有哪些不同之处?

想要从 Azure 表存储转而使用 Azure Cosmos DB 的 Table API 来创建表的用户,应当注意以下一些行为差异:

  • Azure Cosmos DB for Table 使用预留容量模型来保障性能,但这意味着,一旦创建了表,就必须立即支付容量费用,即使容量未被使用。 使用 Azure 表存储时,只需为使用的容量付费。 这也说明了,API for Table 在 99% 的时间里为何能够提供 10 毫秒的读取延迟和 15 毫秒的写入延迟 SLA,而 Azure 表存储提供 10 秒的延迟 SLA。 因此,在使用 Table 表的 API 时,即使是没有任何请求的空表,为了达到 Azure Cosmos DB 所提供的 SLA,也必须支付费用以确保有足够的容量来处理发送给这些表的任何请求。

  • API for Table 返回的查询结果未按分区键/行键顺序排序,因为它们在 Azure 表存储中。

  • 行键最多可以包含 255 个字节。

  • 批量最多可以有 2 MB 大小。

  • 目前不支持 CORS。

  • Azure 表存储中的表名不区分大小写,但会出现在 Azure Cosmos DB for Table 中。

  • Azure Cosmos DB 的某些编码信息内部格式,例如二进制字段,目前不如想像的那么有效。 因此,这会导致数据大小受到意外限制。 例如,目前无法使用整整有 1 MB 的表实体来存储二进制数据,因为编码会增大数据大小。

  • Azure Cosmos DB 保留实体属性名称 IDridetagResourceId,它们目前不受支持。

  • TableQuery TakeCount 的限制不为 1000。

  • 在 REST API 方面,Azure 表存储(不包括 Azure Cosmos DB for Table)支持以下终结点/查询选项:

    Rest 方法 REST 终结点/查询选项 文档URL 说明 支持于表存储 受 API for Table 支持
    GETPUT /?Restype=service@comp=properties 设置表服务属性获取表服务属性 此终结点用于设置 CORS 规则、存储分析配置和日志记录设置。 CORS 目前不受支持,在 Azure Cosmos DB 中,分析和日志记录的处理方式与 Azure 存储表不同。
    OPTIONS /<table-resource-name> 预检 CORS 表格请求 这是 Azure Cosmos DB 目前不支持的 CORS 部分。
    GET /?Restype=service@comp=stats 获取表服务统计信息 提供有关主节点与辅助节点之间的数据复制速度的信息。 由于复制是写入的一部分,因此在 Azure Cosmos DB 中不需要此选项。
    GETPUT /mytable?comp=acl 获取表 ACL设置表 ACL 获取和设置用于管理共享访问签名 (SAS) 的存储访问策略。
  • Azure Cosmos DB for Table 仅支持 JSON 格式,而不支持 ATOM。

  • 对于特定的 .NET SDK,Azure Cosmos DB 目前不支持某些类和方法。

    • CloudTableClient
      • \ServiceProperties
      • \ServiceStats
    • CloudTable
      • SetPermissions
      • GetPermissions

其他常见问题解答

是否需要新的 SDK 才能使用 API for Table?

不是,现有的存储 SDK 仍然适用。 但是,我们建议始终使用最新的 SDK,以获得最佳支持,并在许多场合下获得优异的性能。 请参阅 Azure Cosmos DB for Table 简介中的可用语言列表。

连接到 Table API 我需要使用哪个连接字符串?

连接字符串为:

DefaultEndpointsProtocol=https;AccountName=<AccountNamefromCosmosDB;AccountKey=<FromKeysPaneofCosmosDB>;TableEndpoint=https://<AccountName>.table.cosmosdb.azure.cn

可以通过 Azure 门户中的“连接字符串”页获取连接字符串。

如何在 API for Table 的 .NET SDK 中替代请求选项的配置设置?

有些设置是通过 CreateCloudTableClient 方法处理的,还有一些设置是通过客户端应用程序中 appSettings 节的 app.config 处理的。 有关配置设置的信息,请参阅 Azure Cosmos DB 功能

使用现有 Azure 表存储 SDK 的客户是否需要进行任何更改?

无。 使用现有 Azure 表存储 SDK 的现有客户或新客户无需进行任何更改。

如何查看存储在 Azure Cosmos DB 中供 API for Table 使用的表数据?

可以使用 Azure 门户浏览此数据。 也可以使用 API for Table 代码或下一个问题答案中提到的工具。

哪些工具适用于 API for Table?

可以使用 Azure 存储资源管理器

采用之前指定格式的连接字符串的灵活工具可以支持针对表的新的API。 Azure 存储客户端工具页上提供了表工具的列表。

操作的并发性是否受控制?

是,乐观并发是通过使用 ETag 机制提供的。

实体是否支持 OData 查询模型?

是,API for Table 支持 OData 查询和 LINQ 查询。

是否可以在同一应用程序中同时连接到 Azure 表存储和 Azure Cosmos DB API for Table?

是的,可以通过创建两个分别指向其各自 URI 的 CloudTableClient 实例并使用连接字符串来实现连接。

如何将现有 Azure 表存储应用程序迁移到此服务?

支持 AzCopy

如何为此服务扩展存储大小,比如,最初我有“n”GB 的数据,但一段时间后我的数据会增长到 1 TB?

Azure Cosmos DB 旨在通过横向缩放提供无限的存储。 该服务可以监视并有效地增加存储。

如何监视 API for Table 服务?

可以使用 API for Table 的“指标”窗格来监视请求和存储使用情况。

如何计算所需的吞吐量?

可以使用容量估算器来计算操作所需的表吞吐量 (TableThroughput)。 有关详细信息,请参阅估算请求单位和数据存储。 通常,你可以将实体显示为 JSON,并为操作提供相关数据。

是否可以在本地将 API for Table SDK 用于模拟器?

目前没有。

现有的应用程序是否适用于 API for Table?

是的,支持相同的 API。

如果我不想使用 API for Table 功能,是否需要将现有 Azure 表存储应用程序迁移到该 SDK?

否,可以在没有任何干扰的情况下创建和使用现有 Azure 表存储资产。 但是,如果不使用 API for Table,则无法从自动索引、额外的一致性选项或多区域分布中受益。

如何在跨多个 Azure 区域的 API for Table 中添加数据复制?

可以使用 Azure Cosmos DB 门户的多区域复制设置来添加适合应用程序的区域。 若要开发多区域分布式应用程序,还应添加将 PreferredLocation 信息设置为本地区域的应用程序,以提供较低的读取延迟。

如何在 API for Table 中更改帐户的主要写入区域?

可以使用 Azure Cosmos DB 的多区域复制门户窗格来添加区域,并执行故障切换到所需的区域。 有关说明,请参阅使用多区域 Azure Cosmos DB 帐户进行开发

在分发数据时,如何配置首选读取区域以实现较低的延迟?

可使用 app.config 文件中的 PreferredLocation 键,帮助从本地位置进行读取。 对于现有应用程序,如果设置 LocationMode,API for Table 会引发错误。 请删除该代码,因为 API for Table 会从 app.config 文件中选取此信息。

如何理解 API for Table 中的一致性级别?

Azure Cosmos DB 在一致性、可用性和延迟之间提供合理的平衡。 Azure Cosmos DB 为 API for Table 开发人员提供五个一致性级别,因此可以在表级别选择合适的一致性模型,并在查询数据时发出相应的请求。 客户端建立连接后,可以指定一致性级别。 可以通过 CreateCloudTableClient 的 consistencyLevel 参数更改级别。

如果将“有限过时”一致性设置为默认值,API for Table 可通过“读取自己写入的数据”提供低延迟的读取。 有关详细信息,请参阅一致性级别

默认情况下,Azure 表存储在同一区域内提供强一致性,在辅助位置提供最终一致性。

Azure Cosmos DB for Table 是否比 Azure 表存储提供更多的一致性级别?

是,有关如何受益于 Azure Cosmos DB 的分布式特性的信息,请参阅一致性级别。 由于为一致性级别提供了保障,因此可以放心使用它们。

启用多区域分布后,需要花费多长时间复制数据?

Azure Cosmos DB 会在本地区域持续提交数据,然后在几毫秒内将数据立即推送到其他区域。 此复制仅依赖于数据中心的往返时间 (RTT)。 若要详细了解 Azure Cosmos DB 的全球分布功能,请参阅 Azure Cosmos DB:Azure 上的多区域分布式数据库服务

是否可以更改读取请求一致性级别?

使用 Azure Cosmos DB 时,可以在容器级别(在表上)设置一致性级别。 使用 .NET SDK,可以通过在 app.config 文件中提供 TableConsistencyLevel 键值来更改级别。 可能的值包括:“强”、“有限不一致性”、“会话”、“一致前缀”和“最终”。 有关详细信息,请参阅 Azure Cosmos DB 中的可优化数据一致性级别。 关键是请求的一致性级别不能设置得高于表的设置。 例如,不能将表的一致性级别设置为“最终一致性”,而将请求的一致性级别设置为“强一致性”。

当某个区域出现故障时,Table API 如何处理故障转移?

API for Table 使用 Azure Cosmos DB 的多区域分布式平台。 若要确保应用程序能够容许数据中心停机,需在 Azure Cosmos DB 门户中至少再为帐户启用一个区域(使用多区域 Azure Cosmos DB 帐户进行开发)。 可以通过使用门户设置区域的优先级(使用多区域 Azure Cosmos DB 帐户进行开发)。

您可以根据需要为账户添加任意数量的区域,并通过设置故障转移优先级来控制账户故障转移的位置。 若要使用数据库,还需要在那里提供一个应用程序。 这样,客户就不会遇到停机情况。 最新的 .NET 客户端 SDK 可自动寻址,但其他 SDK 则不可以。 也就是说,它能够检测到宕机的区域,并自动切换到新区域。

API for Table 是否能够进行备份?

是,API for Table 使用 Azure Cosmos DB 的平台进行备份。 可自动创建备份。 有关详细信息,请参阅使用 Azure Cosmos DB 联机备份和还原

默认情况下,API for Table 是否对实体的所有属性编制索引?

是,默认情况下会对实体的所有属性进行索引。 有关详细信息,请参阅 Azure Cosmos DB:索引策略

这是否意味着,无需创建多个索引来满足查询要求?

是,Azure Cosmos DB for Table 针对所有属性提供自动索引,无需任何架构定义。 此自动化功能使开发人员能够将重心放在应用程序上,而不必担心索引的创建和管理。 有关详细信息,请参阅 Azure Cosmos DB:索引策略

是否可以更改索引策略?

是,可以提供索引定义来更改索引策略。 需要将这些设置进行适当的编码和转义。

只能在门户中设置索引策略,方法是:打开“数据资源管理器”,导航到想要更改的特定表,转到“缩放和设置”-“索引策略”,进行所需的更改,并单击“保存”。>

平台形式的 Azure Cosmos DB 似乎拥有许多功能,例如排序、聚合、分层和其他功能。 是否会将这些功能添加到 API for Table 中?

API for Table 提供与 Azure 表存储相同的查询功能。 Azure Cosmos DB 还支持排序、聚合、地理空间查询、层次结构和各种内置函数。 有关详细信息,请参阅 SQL 查询

更改表格 API 的 TableThroughput 参数的最佳时机是什么时候?

符合以下任一情况时,都应更改 TableThroughput:

  • 要执行数据提取、转换和加载 (ETL) 操作,或者想在短时间内上传大量数据。
  • 需要来自后端容器或容器组的更大吞吐量。 例如,您观察到已用吞吐量超过已预置的吞吐量,因此您受到限流。 有关详细信息,请参阅为 Azure Cosmos DB 容器设置吞吐量

是否可以纵向扩展或纵向缩减 API for Table 表的吞吐量?

是,可以使用 Azure Cosmos DB 门户的缩放窗格来缩放吞吐量。 有关详细信息,请参阅设置吞吐量

是否为新预配的表设置了默认的TableThroughput?

是,如果未通过 app.config 替代 TableThroughput,并且未使用 Azure Cosmos DB 中预创建的容器,服务则会创建吞吐量为 400 的表。

对于 Azure 表存储服务的现有客户,定价会有所变化吗?

无。 对于现有的 Azure 表存储客户,价格没有变化。

API for Table 的价格是如何计算的?

价格取决于分配的 TableThroughput。

如何在 API for Table 服务中处理表上的速率限制?

如果请求速率超出了为基础容器或容器组预配的吞吐量的容量,则会出现错误,SDK 会使用重试策略重试调用。

为何除了选择 PartitionKey 和 RowKey 之外,还需要选择吞吐量来利用 Azure Cosmos DB 的 API for Table 服务?

如果未在 app.config 文件中或通过门户提供吞吐量,Azure Cosmos DB 将为容器设置默认的吞吐量。

Azure Cosmos DB 针对操作设置上限,在性能和延迟方面提供保障。 如果引擎可以针对租户的操作实施调控,则可以做到这一点。 设置 TableThroughput 可确保在吞吐量和延迟方面获得保障,因为平台会保留此容量,并保证操作成功。

通过使用吞吐量规范,可以弹性更改吞吐量,以利用应用程序的季节性,满足吞吐量需求并节省成本。

Azure 表存储对我而言非常便宜,因为我只需支付数据的存储费用,并且我很少进行查询。 但是,即使我未执行任何事务或存储任何数据,Azure Cosmos DB for Table 服务似乎也要收费。 是否能解释一下?

根据设计,Azure Cosmos DB 是一个多区域分布式的、基于 SLA 的系统,在可用性、延迟和吞吐量方面提供保证。 在 Azure Cosmos DB 中保留吞吐量时,可以确保这一吞吐量是有保障的,与其他系统的吞吐量不同。 Azure Cosmos DB 根据客户请求提供更多功能,例如辅助索引和多区域分布。

在向 Azure 表存储引入数据时,我从未收到过“配额已满”通知(指示分区已满)。 但使用 API for Table 时会收到此消息。 是此产品有限制,迫使我更改现有的应用程序吗?

Azure Cosmos DB 是基于 SLA 的系统,可提供无限缩放,并在延迟、吞吐量、可用性和一致性方面提供保障。 为了确保获得有保障的高级性能,需确保数据大小和索引可管理且可缩放。 我们对每个分区键的实体数或项数实施 20 GB 限制,以确保提供强大的查找和查询性能。 即使对于 Azure 存储,为确保您的应用程序能够良好地扩展,建议不要通过将所有信息存储在一个分区并查询它来创建热分区。

表格的API是否仍然需要 PartitionKey 和 RowKey?

是的。 由于 API for Table 的表面面积与 Azure 表存储 SDK 类似,所以分区键提供了一个高效分发数据的方法。 行键在该分区中是唯一的。 行键必须存在并且不能为 null,而在标准 SDK 中,行键可以为 null。 RowKey 的长度为 255 个字节,PartitionKey 的长度为 1 KB。

API for Table 的错误消息有哪些?

Azure 表存储和 Azure Cosmos DB for Table 使用相同的 SDK,因此,大多数错误是相同的。

在 API for Table 中尝试一个接一个地创建许多表时,为何会受到限制?

Azure Cosmos DB 是基于 SLA 的系统,在可用性、延迟和吞吐量方面提供保障。 由于它是预配的系统,因此会保留资源来保证满足这些要求。 系统会检测到并限制快速创建表的行为。 我们建议您查看表创建的速率,并将其降低到每分钟少于 5 个。 请记住,API for Table 是预配的系统。 计费从预配那一刻开始。

如何提供有关 SDK 或错误的反馈?

可以通过以下任一方式分享反馈: