Amazon DocumentDB 核心概念 #

一、集群架构 #

1.1 集群组成 #

text
DocumentDB集群:
├── 集群(Cluster)
│   ├── 主实例(Primary Instance)
│   └── 只读副本(Replica Instances)
├── 集群存储卷
│   ├── 数据卷
│   └── 日志卷
└── 集群端点
    ├── 集群端点(写入)
    ├── 读取器端点(读取)
    └── 实例端点(特定实例)

1.2 主实例 #

text
主实例职责:
├── 处理所有写操作
├── 管理数据复制
├── 协调故障转移
├── 执行DDL操作
└── 维护索引

1.3 只读副本 #

text
只读副本特点:
├── 处理读请求
├── 数据异步复制
├── 最多15个副本
├── 可跨可用区部署
└── 故障转移候选

1.4 存储架构 #

text
存储特点:
├── 存储计算分离
├── 自动扩展(最大64TB)
├── 6副本跨3个AZ
├── 自动修复
└── 持久性保障

二、数据模型 #

2.1 文档结构 #

javascript
// 文档示例
{
  "_id": ObjectId("65a1b2c3d4e5f67890123456"),
  "name": "张三",
  "age": 30,
  "email": "zhangsan@example.com",
  "address": {
    "city": "北京",
    "street": "朝阳路",
    "zipcode": "100000"
  },
  "hobbies": ["阅读", "游泳", "编程"],
  "createdAt": ISODate("2024-01-15T10:00:00Z"),
  "updatedAt": ISODate("2024-01-16T14:30:00Z")
}

2.2 数据类型 #

类型 说明 示例
String 字符串 “hello”
Integer 32位整数 42
Long 64位整数 NumberLong(“123456789”)
Double 浮点数 3.14
Boolean 布尔值 true
Date 日期时间 ISODate(“2024-01-15”)
ObjectId 对象ID ObjectId(“…”)
Array 数组 [1, 2, 3]
Object 嵌套文档
Null 空值 null
Binary 二进制数据 BinData(0, “…”)

2.3 ObjectId结构 #

text
ObjectId组成(12字节):
├── 4字节:时间戳
├── 5字节:随机值
│   ├── 3字节:机器标识
│   └── 2字节:进程ID
└── 3字节:计数器
javascript
// 解析ObjectId
const objectId = ObjectId("65a1b2c3d4e5f67890123456");

// 获取时间戳
objectId.getTimestamp();  // ISODate("2024-01-12T...")

// 获取字符串表示
objectId.toString();  // "65a1b2c3d4e5f67890123456"

三、数据库和集合 #

3.1 数据库 #

javascript
// 数据库概念
show dbs;  // 显示所有数据库

// 数据库命名规则
// - 不能包含: /\. "$*<>:|?
// - 不能以"system."开头
// - 长度限制:64字节

3.2 集合 #

javascript
// 集合概念
show collections;  // 显示所有集合

// 集合命名规则
// - 不能包含: $ 或 null
// - 不能以"system."开头
// - 不能包含点号(嵌套除外)

3.3 集合选项 #

javascript
// 创建集合
db.createCollection("users", {
  capped: false,
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "必须为字符串"
        },
        email: {
          bsonType: "string",
          pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
          description: "必须为有效邮箱"
        }
      }
    }
  }
});

四、索引机制 #

4.1 默认索引 #

javascript
// 每个集合默认在_id字段上有索引
db.users.getIndexes();

// 输出
[
  {
    "v": 2,
    "key": { "_id": 1 },
    "name": "_id_"
  }
]

4.2 索引类型 #

类型 说明 创建示例
单字段索引 单个字段索引
复合索引 多个字段组合
多键索引 数组字段索引
文本索引 文本搜索索引
地理空间索引 位置数据索引

4.3 索引属性 #

javascript
// 唯一索引
db.users.createIndex(
  { email: 1 },
  { unique: true }
);

// 稀疏索引
db.users.createIndex(
  { nickname: 1 },
  { sparse: true }
);

// TTL索引
db.sessions.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 3600 }
);

// 部分索引
db.orders.createIndex(
  { status: 1 },
  { partialFilterExpression: { amount: { $gt: 100 } } }
);

五、复制机制 #

5.1 复制架构 #

text
复制流程:
├── 主实例接收写操作
├── 写入存储卷
├── 异步复制到副本
├── 副本应用变更
└── 确认写入完成

5.2 写关注 #

javascript
// 写关注级别
db.users.insertOne(
  { name: "张三" },
  { writeConcern: { w: "majority" } }
);

// 写关注选项
{
  w: "majority",  // 写入大多数节点
  j: true,        // 写入日志
  wtimeout: 5000  // 超时时间
}

5.3 读偏好 #

javascript
// 读偏好设置
db.users.find({}).readPref("secondaryPreferred");

// 读偏好选项
{
  "primary": "只从主实例读取",
  "primaryPreferred": "优先主实例",
  "secondary": "只从副本读取",
  "secondaryPreferred": "优先副本",
  "nearest": "延迟最低的节点"
}

六、事务支持 #

6.1 事务基础 #

javascript
// 事务示例
const session = client.startSession();

try {
  session.startTransaction();
  
  const ordersCollection = client.db('shop').collection('orders');
  const inventoryCollection = client.db('shop').collection('inventory');
  
  // 创建订单
  await ordersCollection.insertOne(
    { productId: "p001", quantity: 2 },
    { session }
  );
  
  // 更新库存
  await inventoryCollection.updateOne(
    { productId: "p001" },
    { $inc: { stock: -2 } },
    { session }
  );
  
  await session.commitTransaction();
  console.log('事务提交成功');
} catch (error) {
  await session.abortTransaction();
  console.error('事务回滚:', error);
} finally {
  await session.endSession();
}

6.2 事务限制 #

text
DocumentDB事务限制:
├── 单事务操作数:最多1000个
├── 单事务大小:最大16MB
├── 事务超时:默认60秒
├── 不支持跨分片事务
└── 需要副本集配置

七、端点和连接 #

7.1 集群端点 #

text
端点类型:
├── 集群端点(Cluster Endpoint)
│   ├── 指向主实例
│   ├── 用于写操作
│   └── 故障转移时自动切换
│
├── 读取器端点(Reader Endpoint)
│   ├── 负载均衡到副本
│   ├── 用于读操作
│   └── 自动分配副本
│
└── 实例端点(Instance Endpoint)
    ├── 指向特定实例
    ├── 用于特定场景
    └── 直接访问实例

7.2 连接字符串 #

text
标准连接字符串:
mongodb://[username:password@]host1[:port1][,host2[:port2],...]/[database][?options]

DocumentDB连接字符串:
mongodb://admin:password@my-cluster.cluster-abc123.us-east-1.docdb.amazonaws.com:27017/?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred

7.3 连接选项 #

javascript
// 常用连接选项
const options = {
  ssl: true,                          // 启用SSL
  replicaSet: "rs0",                  // 副本集名称
  readPreference: "secondaryPreferred", // 读偏好
  maxPoolSize: 50,                    // 最大连接池
  minPoolSize: 5,                     // 最小连接池
  connectTimeoutMS: 10000,            // 连接超时
  socketTimeoutMS: 0,                 // Socket超时
  retryWrites: true                   // 重试写入
};

八、容量规划 #

8.1 实例类型 #

实例类 vCPU 内存 适用场景
db.t3.medium 2 4GB 开发测试
db.r6g.large 2 16GB 小型生产
db.r6g.xlarge 4 32GB 中型生产
db.r6g.2xlarge 8 64GB 大型生产
db.r6g.4xlarge 16 128GB 高负载

8.2 存储规划 #

text
存储考虑:
├── 数据大小
├── 索引大小
├── 增长预期
├── 工作集大小
└── 预留空间(建议20%)

8.3 性能指标 #

text
关键指标:
├── CPU使用率
├── 内存使用率
├── 连接数
├── 读/写IOPS
├── 延迟
└── 吞吐量

九、总结 #

9.1 核心概念回顾 #

概念 说明
集群 包含主实例和副本的数据库实例组
文档 BSON格式的数据记录
集合 文档的容器
索引 加速查询的数据结构
复制 数据冗余和高可用机制
事务 多文档ACID操作

9.2 架构要点 #

text
架构优势:
├── 存储计算分离
├── 自动故障转移
├── 弹性扩展
├── 高可用性
└── 完全托管

下一步,让我们学习基础语法!

最后更新:2026-03-27