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