Amazon DocumentDB 集群架构 #
一、架构概述 #
1.1 整体架构 #
text
DocumentDB架构:
├── 集群层
│ ├── 主实例(Primary)
│ └── 只读副本(Replicas)
│
├── 存储层
│ ├── 存储卷(跨3个AZ)
│ ├── 6份数据副本
│ └── 自动扩展
│
└── 网络层
├── VPC
├── 安全组
└── 集群端点
1.2 架构特点 #
text
架构优势:
├── 存储计算分离
├── 自动故障转移
├── 弹性扩展
├── 高可用性
├── 数据持久性
└── 完全托管
二、集群组件 #
2.1 主实例 #
text
主实例职责:
├── 处理所有写操作
├── 管理数据复制
├── 协调故障转移
├── 执行DDL操作
├── 维护索引
└── 管理事务
2.2 只读副本 #
text
只读副本特点:
├── 处理读请求
├── 数据异步复制
├── 最多15个副本
├── 可跨可用区部署
├── 故障转移候选
└── 独立扩展
2.3 集群存储 #
text
存储特点:
├── 自动扩展(最大64TB)
├── 6副本跨3个AZ
├── 自动修复
├── 存储加密
├── 独立于实例
└── 按使用付费
三、存储架构 #
3.1 存储卷 #
text
存储卷结构:
├── 数据卷
│ ├── 集合数据
│ └── 索引数据
│
├── 日志卷
│ ├── 操作日志
│ └── 事务日志
│
└── 系统卷
├── 元数据
└── 配置信息
3.2 数据复制 #
text
复制机制:
├── 同步写入存储卷
├── 异步复制到副本
├── 6副本跨3个AZ
├── 自动故障检测
└── 自动数据修复
3.3 存储扩展 #
text
自动扩展:
├── 无需预分配
├── 按需增长
├── 最大64TB
├── 不影响性能
└── 自动管理
四、复制机制 #
4.1 写操作流程 #
text
写入流程:
├── 1. 客户端发送写请求
├── 2. 主实例接收请求
├── 3. 写入存储卷(同步)
├── 4. 返回确认给客户端
├── 5. 异步复制到副本
└── 6. 副本应用变更
4.2 读操作流程 #
text
读取流程:
├── 主实例读取
│ ├── 通过集群端点
│ └── 读取最新数据
│
└── 副本读取
├── 通过读取器端点
├── 负载均衡到副本
└── 可能存在延迟
4.3 复制延迟 #
text
复制延迟因素:
├── 写入负载
├── 网络状况
├── 副本数量
├── 实例规格
└── 数据大小
监控指标:
├── ReplicationLag
├── DMLThroughput
└── NetworkThroughput
五、故障转移 #
5.1 故障检测 #
text
故障检测机制:
├── 健康检查(定期)
├── 心跳检测
├── 存储层检测
├── 网络检测
└── 自动触发故障转移
5.2 故障转移流程 #
text
故障转移流程:
├── 1. 检测到主实例故障
├── 2. 选择新的主实例
├── 3. 提升副本为主
├── 4. 更新集群端点
├── 5. 重新配置副本
└── 6. 客户端自动重连
5.3 故障转移时间 #
text
故障转移时间:
├── 检测时间:30-60秒
├── 提升时间:10-30秒
├── 端点更新:30秒内
├── 总时间:通常<2分钟
└── 自动恢复
5.4 故障转移配置 #
bash
# 设置故障转移优先级
aws docdb modify-db-instance \
--db-instance-identifier my-replica-1 \
--promotion-tier 1
# 优先级说明
# 0-15:数字越小优先级越高
# 0:最高优先级
# 15:最低优先级
六、集群端点 #
6.1 端点类型 #
text
端点类型:
├── 集群端点(Cluster Endpoint)
│ ├── 指向主实例
│ ├── 用于写操作
│ ├── 故障转移时自动切换
│ └── 格式:cluster-xxx.docdb.amazonaws.com
│
├── 读取器端点(Reader Endpoint)
│ ├── 负载均衡到副本
│ ├── 用于读操作
│ ├── 自动分配副本
│ └── 格式:cluster-xxx-us-east-1.docdb.amazonaws.com
│
└── 实例端点(Instance Endpoint)
├── 指向特定实例
├── 用于特定场景
├── 直接访问实例
└── 格式:instance-xxx.docdb.amazonaws.com
6.2 端点使用 #
javascript
// 连接集群端点(写操作)
const writeClient = new MongoClient(
"mongodb://user:pass@my-cluster.cluster-xxx.docdb.amazonaws.com:27017"
);
// 连接读取器端点(读操作)
const readClient = new MongoClient(
"mongodb://user:pass@my-cluster.cluster-xxx-us-east-1.docdb.amazonaws.com:27017"
);
6.3 端点管理 #
bash
# 查看集群端点
aws docdb describe-db-clusters \
--db-cluster-identifier my-cluster
# 输出
{
"Endpoint": "my-cluster.cluster-xxx.docdb.amazonaws.com",
"Port": 27017,
"ReaderEndpoint": "my-cluster.cluster-xxx-us-east-1.docdb.amazonaws.com"
}
七、扩展策略 #
7.1 读扩展 #
text
读扩展方法:
├── 添加只读副本
├── 使用读取器端点
├── 配置读偏好
├── 分散读负载
└── 最多15个副本
7.2 写扩展 #
text
写扩展方法:
├── 纵向扩展主实例
├── 优化写入模式
├── 批量写入
├── 使用分片(全局集群)
└── 合理设计索引
7.3 存储扩展 #
text
存储扩展:
├── 自动扩展
├── 无需手动干预
├── 最大64TB
├── 按使用付费
└── 不影响性能
八、全局集群 #
8.1 全局集群概述 #
text
全局集群特点:
├── 跨区域部署
├── 主区域可写
├── 辅助区域只读
├── 低延迟全球访问
└── 灾难恢复能力
8.2 创建全局集群 #
bash
# 创建全局集群
aws docdb create-global-cluster \
--global-cluster-identifier my-global-cluster \
--source-db-cluster-identifier arn:aws:rds:us-east-1:123:cluster:my-cluster
# 添加辅助集群
aws docdb create-db-cluster \
--db-cluster-identifier my-cluster-eu \
--global-cluster-identifier my-global-cluster \
--region eu-west-1
8.3 全局集群使用 #
javascript
// 连接不同区域
const usClient = new MongoClient(
"mongodb://user:pass@my-cluster.cluster-xxx-us-east-1.docdb.amazonaws.com"
);
const euClient = new MongoClient(
"mongodb://user:pass@my-cluster-eu.cluster-xxx-eu-west-1.docdb.amazonaws.com"
);
九、高可用配置 #
9.1 多可用区部署 #
text
多可用区配置:
├── 主实例:AZ-1
├── 副本1:AZ-2
├── 副本2:AZ-3
└── 存储:跨3个AZ
9.2 可用区选择 #
bash
# 指定可用区
aws docdb create-db-instance \
--db-instance-identifier my-replica-1 \
--db-cluster-identifier my-cluster \
--availability-zone us-east-1a
9.3 高可用最佳实践 #
text
高可用建议:
├── 至少部署2个副本
├── 跨多个可用区
├── 配置故障转移优先级
├── 使用集群端点
├── 实现应用重连机制
└── 定期测试故障转移
十、性能优化 #
10.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 | 高负载 |
10.2 副本数量规划 #
text
副本数量建议:
├── 开发环境:0-1个副本
├── 小型生产:1-2个副本
├── 中型生产:2-3个副本
├── 大型生产:3-5个副本
└── 高可用要求:至少2个副本
10.3 连接池配置 #
javascript
// 连接池配置
const client = new MongoClient(uri, {
maxPoolSize: 100,
minPoolSize: 10,
maxIdleTimeMS: 60000,
waitQueueTimeoutMS: 5000,
connectTimeoutMS: 10000
});
十一、监控与告警 #
11.1 关键指标 #
text
监控指标:
├── CPUUtilization
├── FreeableMemory
├── DatabaseConnections
├── ReadIOPS/WriteIOPS
├── ReadLatency/WriteLatency
├── ReplicationLag
├── BufferCacheHitRatio
└── NetworkThroughput
11.2 CloudWatch告警 #
bash
# 创建CPU告警
aws cloudwatch put-metric-alarm \
--alarm-name docdb-high-cpu \
--metric-name CPUUtilization \
--namespace AWS/DocDB \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2
十二、总结 #
12.1 架构要点 #
| 组件 | 说明 |
|---|---|
| 主实例 | 处理写操作 |
| 只读副本 | 处理读操作 |
| 存储 | 自动扩展,跨AZ |
| 端点 | 集群、读取器、实例 |
| 故障转移 | 自动检测和恢复 |
12.2 最佳实践 #
text
架构最佳实践:
├── 理解存储计算分离
├── 合理配置副本数量
├── 使用正确的端点
├── 实现故障转移处理
├── 监控关键指标
└── 定期测试高可用
下一步,让我们学习变更流!
最后更新:2026-03-27