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