Azure Cosmos DB 常见问题解答

Azure Cosmos DB 基础知识

什么是 Azure Cosmos DB?

Azure Cosmos DB 是多区域复制的多模型数据库服务,可针对无架构数据提供丰富的查询,帮助提供可靠的可配置性能,并支持快速开发。 这一切都通过一个托管平台来实现,而该平台有 Azure 强大的功能与影响力作为后盾。

如果 Web、移动、游戏和 IoT 应用程序的关键要求是可预测的吞吐量、高可用性、低延迟和无架构数据模型,那么,Azure Cosmos DB 无疑是最合适的解决方案。 它提供了架构灵活性和丰富的索引,并且对集成的 JavaScript 提供了多文档事务性支持。

有关部署和使用此服务的更多数据库问题、解答及说明,请参阅 Azure Cosmos DB 文档页

DocumentDB API 有哪些变化?

Azure Cosmos DB DocumentDB API 或 SQL (DocumentDB) API 现在称为 Azure Cosmos DB SQL API。 无需进行任何更改即可继续运行使用 DocumentDB API 构建的应用。 功能保持相同。

如果你以前有一个 DocumentDB API 帐户,则现在有一个 SQL API 帐户,费用不会有任何变化。

用作服务 Azure DocumentDB 发生了什么变化?

Azure DocumentDB 服务现在是 Azure Cosmos DB 服务的一部分,自身以 SQL API 形式呈现。 无需针对 Azure Cosmos DB SQL API 进行任何更改,就能运行针对 Azure DocumentDB 生成的应用程序。 此外,Azure Cosmos DB 还支持 MongoDB API。

Azure Cosmos DB 的典型用例有哪些?

对于侧重于以下要求的新 Web、移动、游戏和 IoT 应用程序而言,Azure Cosmos DB 是一个不错的选择:自动缩放、可预测的性能、毫秒响应时间的快速排序,以及查询无架构数据的能力。 Azure Cosmos DB 有助于快速开发,且支持应用程序数据模型的连续迭代。 用于管理用户生成的内容和数据的应用程序就是 Azure Cosmos DB 的常见用例

Azure Cosmos DB 如何提供可预测的性能?

请求单位 (RU) 是 Azure Cosmos DB 中吞吐量的衡量单位。 1 RU 吞吐量相当于通过 GET 操作获取 1 KB 文档的吞吐量。 在 Azure Cosmos DB 中进行的每个操作(包括读、写、SQL 查询和执行存储过程)都具有一个确定的 RU 值,该值基于完成该操作所需的吞吐量。 无需考虑 CPU、IO 和内存,以及它们会怎样影响应用程序吞吐量,只需从单个 RU 度量值的角度进行考虑即可。

可以按照每秒吞吐量的 RU 数来保留每个 Azure Cosmos DB 容器的预配吞吐量。 对于任何规模的应用程序,都可以通过将单个请求设为基准来测量其 RU 值,并通过预配容器来处理所有请求的请求单位总和。 也可以根据应用程序的发展需求,相应地增加或减少容器的吞吐量。 如需请求单位的详细信息以及确定容器需求方面的帮助,请参阅估计吞吐量需求并尝试使用吞吐量计算器。 在这里,术语“容器”是指 SQL API 集合和 MongoDB API 集合。

Azure Cosmos DB 如何支持各种数据模型(例如纵栏表和文档)?

纵栏表和文档数据模型都是原本就支持的,因为 Azure Cosmos DB 是基于 ARS(原子、记录和序列)设计构建的。 原子、记录和序列可以轻松映射和投影到各种数据模型。 现在提供了适用于一部分模型的 API(SQL 和 MongoDB API),将来会提供特定于其他数据模型的其他 API。

Azure Cosmos DB 有一个不受架构影响的索引编制引擎,能够自动为它引入的所有数据编制索引,不会要求开发者提供任何架构或辅助索引。 该引擎依赖于一组逻辑索引布局(倒置、纵栏表、树形),这些布局将存储布局从索引和查询处理子系统中分离出来。 Cosmos DB 还能够以可扩展方式支持一组连网协议和 API 并将它们高效地转换为核心数据模型 (1) 和逻辑索引布局 (2),这使得它具有原本就支持多个数据模型的独特功能。

Azure Cosmos DB 是否符合 HIPAA?

是的,Azure Cosmos DB 符合 HIPAA。 HIPAA 针对可识别个人身份的健康信息的使用、泄露与保护制定了要求。 有关详细信息,请参阅 信任中心

Azure Cosmos DB 的存储限制是什么?

对于容器可以存储在 Azure Cosmos DB 中的数据总量并没有任何限制。

Azure Cosmos DB 的吞吐量限制是什么?

在 Azure Cosmos DB 中,对于容器能够支持的总吞吐量并没有任何限制。 关键是要让工作负荷大致均匀地分布到足够多的分区键中。

直接连接和网关连接模式是否加密?

是的,两种模式始终完全加密。

Azure Cosmos DB 的费用如何?

有关详细信息,请参阅 Azure Cosmos DB 定价详细信息页。 Azure Cosmos DB 使用费取决于预配的容器数、容器的联机小时数,以及每个容器的预配吞吐量。 在这里,术语“容器”是指 SQL API 集合和 MongoDB API 集合。

有试用帐户吗?

如果不熟悉 Azure,可以注册 Azure 试用帐户,这样可以得到 30 天试用期和信用额度,以便试用所有 Azure 服务。 如果你有 Visual Studio 订阅,则还有资格免费获取 Azure 信用额度,可用于任何 Azure 服务。

也可以使用 Azure Cosmos DB 模拟器在本地免费开发和测试应用程序,无需创建 Azure 订阅。 如果对应用程序在 Azure Cosmos DB 模拟器中的工作情况感到满意,则可以切换到在云中使用 Azure Cosmos DB 帐户。

如何获取 Azure Cosmos DB 的更多帮助?

若要询问技术问题,可以在下述两个问答论坛之一发帖:

若要请求新功能,请在 Uservoice 上提交新的请求。

若要修复帐户问题,请在 Azure 门户中提交支持请求

其他问题可以通过 Azure 支持提交给支持团队;不过,该论坛不是技术支持论坛。

设置 Azure Cosmos DB

如何注册 Azure Cosmos DB?

可以在 Azure 门户中注册 Azure Cosmos DB。 首先,注册 Azure 订阅。 注册后,可将 SQL API 和 MongoDB API 帐户添加到 Azure 订阅。

什么是主密钥?

主密钥是用于访问帐户的所有资源的安全令牌。 拥有此密钥的人对数据库帐户中的所有资源具有读取和写入访问权。 分发主密钥时需谨慎。 Azure 门户的“密钥”边栏选项卡中提供主要主密钥和辅助主密钥。 有关密钥的详细信息,请参阅查看、复制和重新生成访问密钥

可以将 PreferredLocations 设置为哪些区域?

可以将 PreferredLocations 值设置为提供 Cosmos DB 的任何 Azure 区域。 有关可用区域的列表,请参阅 Azure 区域

通过 Azure 数据中心在多个区域分配数据时需要注意什么?

Azure Cosmos DB 存在于所有 Azure 区域,详见 Azure 区域页。 由于 Azure Cosmos DB 是核心服务,每个新数据中心都部署了它。

设置区域时,请记住,Azure Cosmos DB 遵从主权和政府云的要求。 也就是说,如果你在某个主权区域创建了一个帐户,则不能将数据从该主权区域复制到外部区域。 同样,你不能将数据从外部帐户复制到其他主权位置。

是否可以从容器级吞吐量预配切换到数据库级吞吐量预配? 或者反之亦然?

容器级和数据库级吞吐量预配是不同的产品,在这两者之间切换需要将数据从源迁移到目标。 这意味着你需要创建新数据库或新集合,然后使用批量执行程序库迁移数据。

如何使用分区键创建固定集合

目前,可以使用 .Net SDK 的 CreatePartitionedCollection 方法或使用 Azure CLI 创建带有分区键吞吐量的集合。 目前不支持使用 Azure 门户创建固定集合。

针对 SQL API 进行开发

如何开始针对 SQL API 进行开发?

首先必须注册 Azure 订阅。 注册 Azure 订阅后,即可将 SQL API 容器添加到 Azure 订阅。 有关添加 Azure Cosmos DB 帐户的说明,请参阅创建 Azure Cosmos DB 数据库帐户

SDK 适用于 .NET、Python、Node.js、JavaScript 和 Java。 开发人员也可以利用 RESTful HTTP API,从各种平台使用各种语言与 Azure Cosmos DB 资源进行交互。

是否可以访问一些现成的示例来帮助自己入门?

GitHub 上提供了 SQL API .NETJavaNode.jsPython SDK 的示例。

SQL API 数据库是否支持无架构数据?

是的,SQL API 允许应用程序存储任意 JSON 文档,不需要架构定义或提示。 通过 Azure Cosmos DB SQL 查询接口可立即查询数据。

SQL API 是否支持 ACID 事务?

是的,SQL API 支持以 JavaScript 存储过程和触发器形式表示的跨文档事务。 事务以每个容器内的单个分区为范围,且以 ACID 语义执行,也就是“全有或全无”,与其他并发执行的代码和用户请求隔离。 如果在服务器端执行 JavaScript 应用程序代码的过程中引发了异常,则会回滚整个事务。 有关事务的详细信息,请参阅数据库程序事务

什么是容器?

容器是文档及其关联的 JavaScript 应用程序逻辑的组。 容器是一个计费实体,其成本由吞吐量和已用存储确定。 容器可以跨一个或多个分区或服务器,并且能缩放以处理几乎无限制增长的存储或吞吐量。

  • 对于 SQL 和 MongoDB API 帐户,容器映射到集合。 容器也是 Azure Cosmos DB 的计费实体。 每个容器根据预配的吞吐量和已用的存储空间按小时计费。 有关详细信息,请参阅 Azure Cosmos DB 定价

我如何创建数据库?

可以使用 Azure 门户(详见添加集合中所述)、某个 Azure Cosmos DB SDKREST API 来创建数据库。

我如何设置用户和权限?

可以使用某个 Cosmos DB API SDKREST API 来创建用户和权限。

SQL API 是否支持 SQL?

SQL API 支持的 SQL 查询语言是 SQL Server 支持的查询功能增强子集。 Azure Cosmos DB SQL 查询语言通过基于 JavaScript 的用户定义函数 (UDF),提供丰富的分层和关系运算符以及可扩展性。 JSON 语法允许将 JSON 文档模型化为带标签节点的树状,由 Azure Cosmos DB 的自动索引技术及 Azure Cosmos DB 的 SQL 查询方言使用。 若要了解如何使用 SQL 语法,请参阅 SQL 查询一文。

SQL API 是否支持 SQL 聚合函数?

SQL API 支持通过聚合函数 COUNTMINMAXAVGSUM 通过 SQL 语法实现的任何规模的低延迟聚合。 有关详细信息,请参阅聚合函数

SQL API 如何提供并发性?

SQL API 通过 HTTP 实体标记或 ETag 支持乐观并发控制 (OCC)。 每个 SQL API 资源都有一个 ETag。每次更新文档时,都会在服务器上设置此 ETag。 ETag 标头和当前值包含在所有响应消息中。 ETag 可与 If-Match 标头配合使用,让服务器决定是否应更新资源。 If-Match 值是用作检查依据的 ETag 值。 如果 ETag 值与服务器的 ETag 值匹配,就会更新资源。 如果 ETag 不再是最新状态,则服务器会拒绝该操作,并提供“HTTP 412 不满足前提条件”响应代码。 客户端接着会重新提取资源,以获取该资源当前的 ETag 值。 此外,ETag 可以与 If-None-Match 标头配合使用,以确定是否需重新提取资源。

若要在 .NET 中使用乐观并发,可以使用 AccessCondition 类。 如需 .NET 示例,请参阅 GitHub 上 DocumentManagement 示例中的 Program.cs

如何在 SQL API 中执行事务?

SQL API 通过 JavaScript 存储过程和触发器支持语言集成式事务。 脚本中的所有数据库操作都是在进行快照隔离的情况下执行的。 如果是单分区集合,则执行范围为集合。 如果集合已分区,则执行范围为该集合中具有相同分区键值的文档。 文档版本 (ETag) 的快照是在事务开始时获取的,且只有当脚本成功运行时才会提交。 如果 JavaScript 引发错误,则会回滚事务。 有关详细信息,请参阅 Azure Cosmos DB 的服务器端 JavaScript 编程

如何将文档批量插入到 Document DB 中?

可以通过以下方法之一,将文档批量插入到 Azure Cosmos DB 中:

我将自己的容器设置为使用延迟索引编制,结果发现查询没有返回预期的结果。

如索引编制部分所述,延迟索引编制可能导致此行为。 应该始终对所有应用程序使用一致的索引编制。

是的,因为 Azure Cosmos DB 是 RESTful 服务,而资源链接固定不变,所以可以缓存。 SQL API 客户端可以通过指定“If-None-Match”标头来读取任何资源(例如文档或集合),然后在服务器版本更改后更新本地副本。

SQL API 的本地实例是否可用?

是的。 Azure Cosmos DB 模拟器提供对 Cosmos DB 服务的高保真模拟。 它支持和 Azure Cosmos DB 相同的功能,包括支持创建和查询 JSON 文档、预配集合和调整集合的规模,以及执行存储过程和触发器。 可以使用 Azure Cosmos DB 模拟器开发和测试应用程序,并通过对 Azure Cosmos DB 的连接终结点进行单一配置更改将其部署到多区域范围的 Azure。

当从门户中的数据资源管理器查看时,为何会对文档中的长浮点值进行舍入?

这是 JavaScript 的限制。 JavaScript 根据 IEEE 754 中的规定使用双精度浮点格式的数字,并且只能安全地呈现 -(253 - 1) 和 253-1(即 9007199254740991)之间的数字。

在对象层次结构中的何处启用权限?

可以在容器级别以及其下的级别(例如文档级别、附件级别)使用 ResourceTokens 来创建权限。 这意味着,目前不允许在数据库或帐户级别创建权限。

针对 API for MongoDB 进行开发

Azure Cosmos DB API for MongoDB 是什么?

Azure Cosmos DB API for MongoDB 是一个兼容层,允许应用程序使用现有的、社区支持的 Apache MongoDB API 和驱动程序轻松、透明地与本机 Azure Cosmos DB 数据库引擎通信。 开发人员现在可以使用现有的 MongoDB 工具链和技术,生成能够充分利用 Azure Cosmos DB 的应用程序。 开发人员可以使用 Azure Cosmos DB 的独特功能,其中包括自动索引、备份维护、获得财务支持的服务级别协议 (SLA) 等。

如何连接到 API for MongoDB 数据库?

若要连接到 Azure Cosmos DB API for MongoDB,最快捷的方式是使用 Azure 门户。 转到帐户,然后在左侧导航菜单上单击“快速启动”。 “快速启动”是获取连接到数据库的代码片段的最佳方式。

Azure Cosmos DB 实施严格的安全要求和标准。 Azure Cosmos DB 帐户需要通过 SSL 进行身份验证和安全通信,因此务必使用 TLSv1.2。

有关详细信息,请参阅连接到 API for MongoDB 数据库

MongoDB 的 API 数据库是否有其他错误代码?

除了常见的 MongoDB 错误代码,MongoDB API 还有其独特的错误代码:

错误 代码 说明 解决方案
TooManyRequests 16500 使用的请求单位总数超过了集合的预配请求单位比率,已达到限制。 考虑从 Azure 门户中对分配给一个容器或一组容器的吞吐量进行缩放,或者重试。
ExceededMemoryLimit 16501 作为一种多租户服务,操作已超出客户端的内存配额。 通过限制性更强的查询条件缩小操作的作用域,或者通过 Azure 门户联系技术支持。

示例:    db.getCollection('users').aggregate([
        {$match: {name: "Andy"}},
        {$sort: {age: -1}}
    ])
)