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