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

适用对象:

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

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

对于想要使用 Azure Cosmos DB for Table 来创建表的 Azure 表存储用户,应注意以下这些行为差异:

  • Azure Cosmos DB for Table 使用预留容量模型来保障性能,但这意味着,一旦创建了表,就必须立即支付容量费用,即使容量未被使用。 使用 Azure 表存储时,只需为使用的容量付费。 这也说明了,API for Table 在 99% 的时间里为何能够提供 10 毫秒的读取延迟和 15 毫秒的写入延迟 SLA,而 Azure 表存储提供 10 秒的延迟 SLA。 因此,使用 API for Table 表(即使是不带任何请求的空表)时,要达到 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 简介中的可用语言列表。

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

连接字符串为:

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 for Table。 Azure 存储客户端工具页上提供了表工具的列表。

是否能控制并发操作?

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

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

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

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

是,可以创建 CloudTableClient 的两个不同实例并使其通过连接字符串指向其自身的 URI 来实现此目的。

如何将现有 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 中的可优化数据一致性级别。 关键是不能将请求的一致性级别设置为高于表的一致性级别。 例如,不能将表的一致性级别设置为“最终”,而将请求的一致性级别设置为“非常”。

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

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 for Table 的 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 for Table 是否仍然需要 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 的反馈或 Bug?

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