Azure Cosmos DB 中的数据库、容器和项
适用对象: NoSQL MongoDB Cassandra Gremlin 表
Azure Cosmos DB 是完全托管的平台即服务 (PaaS)。 若要开始使用 Azure Cosmos DB,请在订阅的 Azure 资源组中创建一个 Azure Cosmos DB 帐户。 然后,在帐户中创建数据库和容器。
Azure Cosmos DB 帐户包含唯一的域名系统 (DNS) 名称。 可以使用许多工具管理 DNS 名称,包括:
- Azure 门户
- Azure 资源管理器模板
- Bicep 模板
- Azure PowerShell
- Azure CLI
- Azure 管理 SDK
- Azure REST API
要在多个 Azure 区域之间复制数据和吞吐量,可随时在帐户中添加和删除 Azure 区域。 可将帐户配置为使用单区域或多个写入区域。 有关详细信息,请参阅使用 Azure 门户管理 Azure Cosmos DB 帐户。 可以为帐户配置默认一致性级别。
Azure Cosmos DB 帐户中的元素
目前,在一个 Azure 订阅下最多可以创建 50 个 Azure Cosmos DB 帐户。 可以通过发出支持请求来提高此上限。
可以使用单个 Azure Cosmos DB 帐户管理几乎无限量的数据和预配吞吐量。 若要管理数据和预配吞吐量,可以在帐户中创建一个或多个数据库,然后创建一个或多个容器用于存储数据。
下图显示了 Azure Cosmos DB 帐户中的元素层次结构。
下图显示了 Azure Cosmos DB 帐户中的实体层次结构。
Azure Cosmos DB 数据库
在 Azure Cosmos DB 中,数据库类似于命名空间。 数据库只是一组容器。 下表显示如何将数据库映射到各种特定于 API 的实体:
Azure Cosmos DB 实体 | API for NoSQL | API for Apache Cassandra | 适用于 MongoDB 的 API | API for Apache Gremlin | API for Table |
---|---|---|---|---|---|
Azure Cosmos DB 数据库 | 数据库 | 密钥空间 | 数据库 | 数据库 | 不适用 |
注意
对于 API for Table 帐户,Azure Cosmos DB 中的表创建于帐户级别,以维护与 Azure 表存储的兼容性。
Azure Cosmos DB 容器
Azure Cosmos DB 容器用于存储数据。 与大多数通过虚拟机的大尺寸纵向扩展的关系数据库不同,Azure Cosmos DB 采用横向扩展。
数据存储在一个或多个称为分区的服务器上。 若要增加分区,可以增加吞吐量;分区也会随着存储的增加而自动增长。 此关系为容器提供了几乎无限量的吞吐量和存储。
创建容器时,需要提供分区键。 分区键是从项中选择的属性,可帮助 Azure Cosmos DB 跨分区有效地分发数据。 Azure Cosmos DB 会应用此属性的值,将数据路由到要写入、更新或删除的合适分区。 还可以在查询中使用WHERE
子句中的分区键来高效检索数据。
Azure Cosmos DB 中数据的基础存储机制称为物理分区。 物理分区的吞吐量可达每秒 10,000 个请求单位,且最多可以存储 50 GB 的数据。 Azure Cosmos DB 使用可存储多达 20 GB 数据的逻辑分区对此分区概念进行抽象。
随着更多分区的添加,逻辑分区允许服务为基础物理分区上的数据提供更大的弹性和更好的管理。 若要了解有关分区和分区键的详细信息,请参阅在 Azure Cosmos DB 中进行分区和水平缩放。
创建容器时,会在以下某种模式下配置吞吐量:
专用吞吐量:容器的吞吐量专门保留给该容器使用。 有两种类型的专用吞吐量:标准和自动缩放。 要了解更多信息,请参阅在 Azure Cosmos DB 容器上预配标准(手动)吞吐量。
共享吞吐量:吞吐量是在数据库级别指定的,最多可与数据库中 25 个容器共享。 吞吐量共享不适用于本身已配置了专用吞吐量的容器。
如果数据库中的所有容器具有类似的请求和存储需求,或者不需要可预测数据性能,则共享吞吐量可能是一个不错的选择。 要了解更多信息,请参阅在 Azure Cosmos DB 中的数据库上预配标准(手动)吞吐量。
注意
不能在专用吞吐量和共享吞吐量之间切换。 在共享吞吐量数据库中创建的容器不能更新为具有专用吞吐量的容器。 若要将容器从具有共享吞吐量改为具有专用吞吐量,必须创建新的容器,并将数据复制到该容器。 Azure Cosmos DB 中的容器复制功能可以简化此过程。
容器与架构无关。 容器中的项可以具有任意架构或不同的实体,只要它们共享相同的分区键。 例如,容器可以包含具有客户个人资料信息的项或文档,以及表示所有客户销售订单的一个或多个项或文档。 可以将所有客户的相似信息放在同一个容器。
默认情况下,添加到容器中的所有数据都会自动编制索引,而无需显式索引。 可以通过配置容器的索引策略来自定义容器的索引。
为避免影响性能,可以针对容器中的选定项或整个容器设置生存时间 (TTL),以在未使用吞吐量的情况下,在后台自动删除这些项。 但是,过期的数据即使未删除,也不会出现在任何读取操作中。 若要了解详细信息,请参阅在 Azure Cosmos DB 中配置生存时间。
Azure Cosmos DB 提供了一项内置功能,即更改源,可以实现变更数据捕获。 可以使用它订阅对容器内数据的所有更改。
可为容器注册存储过程、触发器、用户定义的函数 (UDF) 和合并过程。
容器中的每个文档都必须具有一个属性,此id
属性在该容器的逻辑键属性值内是唯一的。 可以使用这种属性组合在容器中提供唯一约束,而无需显式定义一个约束。
还可以在使用一个或多个属性的 Azure Cosmos DB 容器上指定唯一键约束。 唯一键约束可确保每个逻辑分区键一个或多个值的唯一性。 如果使用唯一键策略创建容器,则任何新项或更新的项的值不能与唯一键约束指定的值重复,否则无法创建。
容器专用于 API 特定的实体,如下表所示:
Azure Cosmos DB 实体 | API for NoSQL | API for Cassandra | 适用于 MongoDB 的 API | API for Gremlin | API for Table |
---|---|---|---|---|---|
Azure Cosmos DB 容器 | 容器 | 表 | 集合 | Graph | 表 |
注意
请确保不要创建两个具有相同名称但大小写不同的容器。 Azure 平台的某些部件不区分大小写,这种命名可能会让针对容器的诊断数据和操作出现混淆或冲突。
Azure Cosmos DB 容器的属性
Azure Cosmos DB 容器具备一组系统定义的属性。 根据所用的 API,某些属性可能不会直接公开。 下表介绍了系统定义属性:
系统定义的属性 | 由系统生成或用户可配置 | 目的 | API for NoSQL | API for Cassandra | 适用于 MongoDB 的 API | API for Gremlin | API for Table |
---|---|---|---|---|---|---|---|
_rid |
系统生成 | 容器的唯一标识符。 | 是 | 否 | No | No | 否 |
_etag |
系统生成 | 用于乐观并发控制的实体标记。 | 是 | 否 | No | No | 否 |
_ts |
系统生成 | 容器上次更新的时间戳。 | 是 | 否 | No | No | 否 |
_self |
系统生成 | 容器的可寻址 URI。 | 是 | 否 | No | No | 否 |
id |
用户可配置 | 容器名。 | 是 | 是 | 是 | 是 | 是 |
indexingPolicy |
用户可配置 | 用于生成容器索引的策略。 | 是 | No | 是 | 是 | 是 |
TimeToLive |
用户可配置 | 在设置的时间段后自动从容器中删除项。 有关详细信息,请参阅生存时间。 | 是 | 否 | No | No | 是 |
changeFeedPolicy |
用户可配置 | 用于读取对容器中的项所做更改的策略。 有关详细信息,请参阅更改源。 | 是 | 否 | No | No | 是 |
uniqueKeyPolicy |
用户可配置 | 用于确保逻辑分区中一个或多个值唯一性的策略。 有关详细信息,请参阅唯一键约束。 | 是 | 否 | No | No | 是 |
AnalyticalTimeToLive |
用户可配置 | 在分析存储的上下文中,在设置时间段后自动从容器中删除项。 有关详细信息,请参阅分析存储。 | 是 | No | 是 | 否 | 否 |
Azure Cosmos DB 项
根据所使用的 API,各个数据实体可以通过多种方式表示:
Azure Cosmos DB 实体 | API for NoSQL | API for Cassandra | 适用于 MongoDB 的 API | API for Gremlin | API for Table |
---|---|---|---|---|---|
Azure Cosmos DB 项 | 项目 | 行 | 文档 | 节点或边缘 | 项目 |
项的属性
每个 Azure Cosmos DB 项都具有以下系统定义的属性。 根据所用的 API,其中的某些属性可能不会直接公开。
系统定义的属性 | 系统生成或用户定义 | 目的 | API for NoSQL | API for Cassandra | DB API for MongoDB | API for Gremlin | API for Table |
---|---|---|---|---|---|---|---|
_rid |
系统生成 | 项的唯一标识符 | 是 | 否 | No | No | 否 |
_etag |
系统生成 | 用于乐观并发控制的实体标记 | 是 | 否 | No | No | 否 |
_ts |
系统生成 | 项上次更新的时间戳 | 是 | 否 | No | No | 否 |
_self |
系统生成 | 项的可寻址 URI | 是 | 否 | No | No | 否 |
id |
任一个 | 逻辑分区中用户定义的唯一名称 | 是 | 是 | 是 | 是 | 是 |
任意用户定义的属性 | 用户定义的 | 用户定义的属性,表示为 API 本机表示形式(包括 JSON、BSON 和 CQL) | 是 | 是 | 是 | 是 | 是 |
注意
id
属性的唯一性在每个逻辑分区中强制实施。 多个文档可以具有相同的id
属性值,但具有不同的分区键值。
对项执行的操作
Azure Cosmos DB 项支持以下操作。 可以使用任一 Azure Cosmos DB API 来执行这些操作。
操作 | API for NoSQL | API for Cassandra | 适用于 MongoDB 的 API | API for Gremlin | API for Table |
---|---|---|---|---|---|
插入、替换、删除、更新插入、读取 | 是 | 是 | 是 | 是 | 是 |
后续步骤
了解如何管理 Azure Cosmos DB 帐户及其他概念: