Azure Cosmos DB #

什么是 Cosmos DB? #

Azure Cosmos DB 是微软提供的完全托管的 NoSQL 数据库,支持全球分布和多模型数据。

text
┌─────────────────────────────────────────────────────────────┐
│                    Cosmos DB 概览                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  特点                                                        │
│  ├── 全球分布:一键部署到任意区域                           │
│  ├── 低延迟:<10ms 读写延迟                                 │
│  ├── 弹性扩展:无限扩展                                     │
│  ├── 多模型:文档、图、表、键值                             │
│  └── 五个 9:99.999% SLA                                    │
│                                                             │
│  API 选择                                                    │
│  ├── SQL (Core) API: 文档数据库                             │
│  ├── MongoDB API: 兼容 MongoDB                              │
│  ├── Cassandra API: 兼容 Cassandra                          │
│  ├── Gremlin API: 图数据库                                  │
│  └── Table API: 键值存储                                    │
│                                                             │
│  适用场景                                                    │
│  ├── Web 和移动应用                                         │
│  ├── IoT 设备数据                                           │
│  ├── 游戏应用                                               │
│  ├── 实时分析                                               │
│  └── 目录数据                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

API 选择 #

API 对比 #

text
┌─────────────────────────────────────────────────────────────┐
│                    API 选择指南                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  SQL (Core) API                                              │
│  ├── 原生 Cosmos DB API                                     │
│  ├── JSON 文档存储                                          │
│  ├── SQL 查询语法                                           │
│  └── 适合: 新项目、需要 Cosmos DB 特性                      │
│                                                             │
│  MongoDB API                                                 │
│  ├── 兼容 MongoDB 驱动                                      │
│  ├── 无缝迁移现有应用                                       │
│  ├── 支持 3.6, 4.0, 4.2 版本                                │
│  └── 适合: MongoDB 迁移、熟悉 MongoDB                       │
│                                                             │
│  Cassandra API                                               │
│  ├── 兼容 Cassandra 驱动                                    │
│  ├── CQL 查询语法                                           │
│  ├── 宽列存储模型                                           │
│  └── 适合: Cassandra 迁移、大规模写入                       │
│                                                             │
│  Gremlin API                                                 │
│  ├── 图数据库                                               │
│  ├── Gremlin 查询语法                                       │
│  ├── 节点和边关系                                           │
│  └── 适合: 社交网络、推荐系统                               │
│                                                             │
│  Table API                                                   │
│  ├── 兼容 Azure Table Storage                               │
│  ├── 键值存储                                               │
│  ├── 简单 API                                               │
│  └── 适合: 简单键值场景、Table Storage 升级                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

创建 Cosmos DB 账户 #

使用 Azure CLI #

bash
# 创建资源组
az group create --name myResourceGroup --location eastus

# 创建 Cosmos DB 账户 (SQL API)
az cosmosdb create \
  --name myCosmosAccount \
  --resource-group myResourceGroup \
  --locations regionName=eastus failoverPriority=0 \
  --default-consistency-level Session

# 创建数据库
az cosmosdb sql database create \
  --account-name myCosmosAccount \
  --resource-group myResourceGroup \
  --name myDatabase

# 创建容器
az cosmosdb sql container create \
  --account-name myCosmosAccount \
  --resource-group myResourceGroup \
  --database-name myDatabase \
  --name myContainer \
  --partition-key-path /partitionKey \
  --throughput 400

创建 MongoDB API 账户 #

bash
# 创建 MongoDB API 账户
az cosmosdb create \
  --name myMongoAccount \
  --resource-group myResourceGroup \
  --kind MongoDB \
  --locations regionName=eastus failoverPriority=0 \
  --server-version 4.2

# 获取连接字符串
az cosmosdb keys list \
  --name myMongoAccount \
  --resource-group myResourceGroup \
  --type connection-strings

一致性级别 #

五种一致性级别 #

text
┌─────────────────────────────────────────────────────────────┐
│                    一致性级别                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  强一致性 (Strong)                                           │
│  ├── 线性一致性                                             │
│  ├── 最新数据保证                                           │
│  ├── 最高延迟                                               │
│  └── 适合: 金融交易                                         │
│                                                             │
│  有限过期一致性 (Bounded Staleness)                          │
│  ├── 允许一定延迟                                           │
│  ├── 可配置过期时间/版本差                                  │
│  └── 适合: 需要一定一致性的场景                             │
│                                                             │
│  会话一致性 (Session)                                        │
│  ├── 单调读、单调写                                         │
│  ├── 会话内一致                                             │
│  ├── 默认推荐                                               │
│  └── 适合: 用户会话                                         │
│                                                             │
│  一致前缀一致性 (Consistent Prefix)                          │
│  ├── 保证顺序                                               │
│  ├── 可能读到旧数据                                         │
│  └── 适合: 顺序重要场景                                     │
│                                                             │
│  最终一致性 (Eventual)                                       │
│  ├── 最低延迟                                               │
│  ├── 可能读到旧数据                                         │
│  └── 适合: 社交媒体、评论                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

一致性级别选择 #

场景 推荐一致性 原因
金融交易 强一致性 数据准确性关键
用户配置 会话一致性 会话内一致
社交动态 最终一致性 性能优先
库存管理 有限过期 平衡性能和一致性

请求单位 (RU) #

RU 概念 #

text
┌─────────────────────────────────────────────────────────────┐
│                    请求单位 (RU)                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  定义                                                        │
│  └── 1 RU = 读取 1KB 文档的成本                              │
│                                                             │
│  影响因素                                                    │
│  ├── 文档大小                                               │
│  ├── 复杂查询                                               │
│  ├── 索引使用                                               │
│  └── 一致性级别                                             │
│                                                             │
│  示例                                                        │
│  ├── 读取 1KB 文档: 1 RU                                    │
│  ├── 写入 1KB 文档: ~5 RU                                   │
│  ├── 复杂查询: 可能数百 RU                                  │
│  └── 存储过程: 按操作计算                                   │
│                                                             │
│  吞吐量模式                                                  │
│  ├── 手动: 固定 RU/s                                        │
│  └── 自动扩展: 自动调整 RU/s                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

配置吞吐量 #

bash
# 设置手动吞吐量
az cosmosdb sql container update \
  --account-name myCosmosAccount \
  --resource-group myResourceGroup \
  --database-name myDatabase \
  --name myContainer \
  --throughput 1000

# 启用自动扩展
az cosmosdb sql container update \
  --account-name myCosmosAccount \
  --resource-group myResourceGroup \
  --database-name myDatabase \
  --name myContainer \
  --max-throughput 4000

数据操作 #

使用 SQL API #

javascript
// 使用 JavaScript SDK
const { CosmosClient } = require('@azure/cosmos');

const client = new CosmosClient(process.env.COSMOS_CONNECTION_STRING);
const database = client.database('myDatabase');
const container = container.database.container('myContainer');

// 创建文档
const { resource: createdItem } = await container.items.create({
  id: '1',
  name: 'Alice',
  email: 'alice@example.com',
  partitionKey: 'user'
});

// 读取文档
const { resource: item } = await container.item('1', 'user').read();

// 查询文档
const { resources: items } = await container.items
  .query('SELECT * FROM c WHERE c.name = @name', { name: 'Alice' })
  .fetchAll();

// 更新文档
const { resource: updatedItem } = await container.item('1', 'user').replace({
  id: '1',
  name: 'Alice Updated',
  email: 'alice.updated@example.com',
  partitionKey: 'user'
});

// 删除文档
await container.item('1', 'user').delete();

使用 MongoDB API #

javascript
// 使用 MongoDB 驱动
const { MongoClient } = require('mongodb');

const client = new MongoClient(process.env.MONGODB_CONNECTION_STRING);
await client.connect();

const db = client.db('myDatabase');
const collection = db.collection('myCollection');

// 插入文档
await collection.insertOne({
  name: 'Alice',
  email: 'alice@example.com'
});

// 查询文档
const docs = await collection.find({ name: 'Alice' }).toArray();

// 更新文档
await collection.updateOne(
  { name: 'Alice' },
  { $set: { email: 'alice.updated@example.com' } }
);

// 删除文档
await collection.deleteOne({ name: 'Alice' });

分区设计 #

分区键选择 #

text
┌─────────────────────────────────────────────────────────────┐
│                    分区键设计                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  分区键原则                                                  │
│  ├── 高基数:大量不同值                                     │
│  ├── 均匀分布:避免热点                                     │
│  ├── 查询优化:常见查询包含分区键                           │
│  └── 业务相关:按业务逻辑分组                               │
│                                                             │
│  示例                                                        │
│  ├── 用户数据: /userId                                      │
│  ├── 订单数据: /orderId 或 /customerId                      │
│  ├── 日志数据: /date 或 /deviceId                           │
│  └── 多租户: /tenantId                                      │
│                                                             │
│  避免的分区键                                                │
│  ├── 时间戳(热点)                                         │
│  ├── 低基数字段                                             │
│  └── 不均匀分布字段                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

全球分布 #

配置多区域 #

bash
# 添加区域
az cosmosdb update \
  --name myCosmosAccount \
  --resource-group myResourceGroup \
  --locations regionName=eastus failoverPriority=0 \
  --locations regionName=westus failoverPriority=1 \
  --locations regionName=westeurope failoverPriority=2

# 配置多区域写入
az cosmosdb update \
  --name myCosmosAccount \
  --resource-group myResourceGroup \
  --enable-multiple-write-locations true

故障转移策略 #

text
┌─────────────────────────────────────────────────────────────┐
│                    故障转移                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  自动故障转移                                                │
│  ├── 自动检测区域故障                                       │
│  ├── 自动提升次要区域                                       │
│  └── 可配置优先级                                           │
│                                                             │
│  手动故障转移                                                │
│  ├── 手动触发                                               │
│  ├── 计划维护                                               │
│  └── 测试 DR                                                │
│                                                             │
│  故障转移优先级示例:                                         │
│  ├── 0: East US (主要)                                      │
│  ├── 1: West US (次要)                                      │
│  └── 2: West Europe (第三)                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

最佳实践 #

性能优化 #

text
┌─────────────────────────────────────────────────────────────┐
│                    性能最佳实践                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 选择正确的分区键                                         │
│     └── 避免热点,均匀分布                                  │
│                                                             │
│  2. 使用适当的索引策略                                       │
│     └── 包含路径索引                                        │
│                                                             │
│  3. 优化查询                                                 │
│     └── 使用分区键,避免跨分区查询                          │
│                                                             │
│  4. 批量操作                                                 │
│     └── 使用批量 API 提高吞吐量                             │
│                                                             │
│  5. 调整一致性级别                                           │
│     └── 根据需求选择合适的一致性                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

成本优化 #

text
┌─────────────────────────────────────────────────────────────┐
│                    成本优化建议                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 使用自动扩展                                             │
│     └── 按需调整吞吐量                                      │
│                                                             │
│  2. 优化 RU 使用                                             │
│     └── 减少不必要的查询和索引                              │
│                                                             │
│  3. 使用预留容量                                             │
│     └── 长期稳定负载                                        │
│                                                             │
│  4. 合理配置区域                                             │
│     └── 按用户分布选择                                      │
│                                                             │
│  5. 监控 RU 消耗                                             │
│     └── 使用 Azure Monitor                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下一步 #

现在你已经掌握了 Cosmos DB 的使用,接下来学习 网络服务 了解 Azure 网络解决方案!

最后更新:2026-03-29