Amazon DocumentDB 故障排除 #

一、故障排除概述 #

1.1 故障分类 #

text
故障类型:
├── 连接问题
│   ├── 连接失败
│   ├── 连接超时
│   └── 认证失败
│
├── 性能问题
│   ├── 查询慢
│   ├── 写入慢
│   └── 资源不足
│
├── 复制问题
│   ├── 复制延迟
│   ├── 副本故障
│   └── 故障转移
│
└── 其他问题
    ├── 存储问题
    ├── 备份问题
    └── 权限问题

1.2 诊断工具 #

text
诊断工具:
├── CloudWatch - 监控指标
├── CloudWatch Logs - 日志分析
├── DocumentDB事件 - 事件查看
├── explain() - 查询分析
├── currentOp() - 操作监控
└── serverStatus() - 状态检查

二、连接问题 #

2.1 连接失败 #

text
症状:
├── 无法连接到集群
├── 连接超时
└── 连接被拒绝

可能原因:
├── 安全组配置错误
├── 网络不通
├── 集群状态异常
├── 端口未开放
└── 认证信息错误

诊断步骤 #

bash
# 1. 检查集群状态
aws docdb describe-db-clusters \
  --db-cluster-identifier my-cluster

# 2. 检查安全组
aws ec2 describe-security-groups \
  --group-ids sg-12345

# 3. 测试网络连通性
telnet my-cluster.cluster-xxx.docdb.amazonaws.com 27017

# 4. 检查DNS解析
nslookup my-cluster.cluster-xxx.docdb.amazonaws.com

解决方案 #

bash
# 修改安全组规则
aws ec2 authorize-security-group-ingress \
  --group-id sg-12345 \
  --protocol tcp \
  --port 27017 \
  --source-group sg-app

# 检查VPC配置
aws ec2 describe-vpcs \
  --vpc-ids vpc-12345

2.2 认证失败 #

text
症状:
├── Authentication failed
├── 用户名密码错误
└── 权限不足

可能原因:
├── 用户名密码错误
├── 用户不存在
├── 认证数据库错误
└── IAM认证配置问题

诊断步骤 #

javascript
// 检查用户
use admin
db.system.users.find()

// 检查用户权限
db.getUser("appuser")

解决方案 #

javascript
// 重置密码
db.changeUserPassword("appuser", "NewPassword123!")

// 创建用户
db.createUser({
  user: "appuser",
  pwd: "SecurePassword123!",
  roles: [
    { role: "readWrite", db: "mydb" }
  ]
})

// 授予权限
db.grantRolesToUser("appuser", [
  { role: "dbAdmin", db: "mydb" }
])

2.3 TLS证书问题 #

text
症状:
├── SSL handshake failed
├── certificate verify failed
└── TLS连接错误

解决方案:
├── 下载正确的证书
├── 配置正确的证书路径
└── 检查TLS配置
bash
# 下载证书
wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

# 连接时指定证书
mongo --ssl \
  --sslCAFile rds-combined-ca-bundle.pem \
  --host my-cluster.cluster-xxx.docdb.amazonaws.com

三、性能问题 #

3.1 查询慢 #

text
症状:
├── 查询响应时间长
├── 超时错误
└── 应用性能下降

可能原因:
├── 缺少索引
├── 索引不合适
├── 查询效率低
├── 数据量大
└── 资源不足

诊断步骤 #

javascript
// 1. 使用explain分析
db.users.find({ email: "test@example.com" }).explain("executionStats")

// 2. 查看慢查询
db.system.profile.find({
  millis: { $gt: 100 }
}).sort({ ts: -1 }).limit(10)

// 3. 检查索引使用
db.users.aggregate([
  { $indexStats: {} }
])

// 4. 检查当前操作
db.currentOp({
  "secs_running": { $gt: 5 }
})

解决方案 #

javascript
// 创建合适的索引
db.users.createIndex({ email: 1 })

// 优化查询
// 使用投影减少返回字段
db.users.find(
  { email: "test@example.com" },
  { name: 1, email: 1 }
)

// 使用索引覆盖查询
db.users.find(
  { email: "test@example.com" },
  { _id: 0, email: 1, name: 1 }
)

3.2 写入慢 #

text
症状:
├── 写入延迟高
├── 写入超时
└── 吞吐量低

可能原因:
├── 索引过多
├── 写关注设置过高
├── 资源不足
├── 网络延迟
└── 并发写入过多

诊断步骤 #

javascript
// 检查写关注设置
db.adminCommand({ getParameter: 1, writeConcern: 1 })

// 检查索引数量
db.users.getIndexes()

// 检查资源使用
db.serverStatus().connections
db.serverStatus().opcounters

解决方案 #

javascript
// 优化写关注
db.users.insertOne(
  { name: "张三" },
  { writeConcern: { w: 1 } }  // 降低写关注级别
)

// 批量写入
db.users.insertMany(documents, { ordered: false })

// 删除不必要的索引
db.users.dropIndex("unused_index")

3.3 资源不足 #

text
症状:
├── CPU使用率高
├── 内存不足
├── 连接数不足
└── IOPS不足

可能原因:
├── 实例规格过小
├── 查询效率低
├── 连接泄漏
└── 工作负载过大

诊断步骤 #

bash
# 查看CloudWatch指标
aws cloudwatch get-metric-statistics \
  --namespace AWS/DocDB \
  --metric-name CPUUtilization \
  --dimensions Name=DBInstanceIdentifier,Value=my-primary \
  --statistics Average \
  --period 300 \
  --start-time 2024-01-15T00:00:00Z \
  --end-time 2024-01-15T23:59:59Z
javascript
// 检查连接数
db.serverStatus().connections

// 检查内存使用
db.serverStatus().mem

// 检查缓存命中率
db.serverStatus().metrics.cursor

解决方案 #

bash
# 扩展实例规格
aws docdb modify-db-instance \
  --db-instance-identifier my-primary \
  --db-instance-class db.r6g.xlarge \
  --apply-immediately

# 添加只读副本
aws docdb create-db-instance \
  --db-instance-identifier my-replica-2 \
  --db-instance-class db.r6g.large \
  --engine docdb \
  --db-cluster-identifier my-cluster

四、复制问题 #

4.1 复制延迟 #

text
症状:
├── 副本数据落后
├── 读取数据不一致
└── 复制延迟告警

可能原因:
├── 写入负载高
├── 网络延迟
├── 副本资源不足
└── 大事务

诊断步骤 #

bash
# 查看复制延迟指标
aws cloudwatch get-metric-statistics \
  --namespace AWS/DocDB \
  --metric-name ReplicationLag \
  --dimensions Name=DBClusterIdentifier,Value=my-cluster \
  --statistics Average \
  --period 60
javascript
// 检查副本状态
rs.status()

// 检查复制进度
db.printSlaveReplicationInfo()

解决方案 #

text
解决方法:
├── 优化写入负载
├── 增加副本规格
├── 检查网络状况
├── 避免大事务
└── 分散写入时间

4.2 故障转移问题 #

text
症状:
├── 故障转移失败
├── 主实例切换慢
└── 应用连接中断

可能原因:
├── 副本数量不足
├── 副本状态异常
├── 网络问题
└── 配置问题

诊断步骤 #

bash
# 查看集群状态
aws docdb describe-db-clusters \
  --db-cluster-identifier my-cluster

# 查看实例状态
aws docdb describe-db-instances \
  --db-cluster-identifier my-cluster

# 查看事件
aws docdb describe-events \
  --source-type db-cluster \
  --source-identifier my-cluster

解决方案 #

bash
# 设置故障转移优先级
aws docdb modify-db-instance \
  --db-instance-identifier my-replica-1 \
  --promotion-tier 1 \
  --apply-immediately

# 手动故障转移
aws docdb failover-db-cluster \
  --db-cluster-identifier my-cluster \
  --target-db-instance-identifier my-replica-1

五、存储问题 #

5.1 存储空间不足 #

text
症状:
├── 写入失败
├── 存储空间告警
└── 性能下降

可能原因:
├── 数据增长过快
├── 索引过多
├── 未清理无用数据
└── 存储配额限制

诊断步骤 #

bash
# 查看存储使用
aws cloudwatch get-metric-statistics \
  --namespace AWS/DocDB \
  --metric-name VolumeBytesUsed \
  --dimensions Name=DBClusterIdentifier,Value=my-cluster \
  --statistics Average \
  --period 3600
javascript
// 查看数据库大小
db.stats()

// 查看集合大小
db.users.stats()

// 查看索引大小
db.users.totalIndexSize()

解决方案 #

javascript
// 删除无用数据
db.logs.deleteMany({
  createdAt: { $lt: new Date("2023-01-01") }
})

// 删除无用索引
db.users.dropIndex("unused_index")

// 压缩数据
db.runCommand({ compact: "users" })

六、错误代码参考 #

6.1 常见错误代码 #

错误代码 说明 解决方案
6 主机不可达 检查网络和安全组
18 认证失败 检查用户名密码
11000 重复键错误 检查唯一索引
112 写冲突 重试事务
50 超时错误 优化查询或增加超时
59 命令不存在 检查命令兼容性

6.2 错误处理示例 #

javascript
// 错误处理
try {
  await db.users.insertOne({ _id: 1, name: "张三" });
} catch (error) {
  switch (error.code) {
    case 11000:
      console.log("文档已存在");
      break;
    case 18:
      console.log("认证失败");
      break;
    case 50:
      console.log("操作超时");
      break;
    default:
      console.log("未知错误:", error.message);
  }
}

七、监控和告警 #

7.1 关键监控指标 #

text
关键指标:
├── CPUUtilization - CPU使用率
├── FreeableMemory - 可用内存
├── DatabaseConnections - 连接数
├── ReadLatency/WriteLatency - 读写延迟
├── ReplicationLag - 复制延迟
├── VolumeBytesUsed - 存储使用
└── BufferCacheHitRatio - 缓存命中率

7.2 告警配置 #

bash
# 创建告警
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 \
  --dimensions Name=DBInstanceIdentifier,Value=my-primary \
  --alarm-actions arn:aws:sns:us-east-1:123:my-alerts

八、最佳实践 #

8.1 预防措施 #

text
预防措施:
├── 定期监控和告警
├── 合理配置资源
├── 优化查询和索引
├── 定期备份
├── 测试故障转移
└── 文档记录

8.2 故障恢复 #

text
故障恢复步骤:
├── 1. 确认故障现象
├── 2. 查看监控指标
├── 3. 分析日志
├── 4. 定位问题原因
├── 5. 执行修复措施
├── 6. 验证修复效果
├── 7. 记录故障处理
└── 8. 改进预防措施

九、总结 #

9.1 故障排除要点 #

问题类型 诊断方法 解决方案
连接问题 检查网络、安全组 修正配置
性能问题 explain、监控 优化查询、扩展资源
复制问题 检查延迟、状态 优化负载、扩展副本
存储问题 检查使用量 清理数据、优化索引

9.2 最佳实践总结 #

text
故障排除最佳实践:
├── 建立监控告警体系
├── 定期检查系统状态
├── 准备应急预案
├── 记录故障处理过程
├── 持续改进优化
└── 培训相关人员

恭喜你完成了Amazon DocumentDB的学习之旅!

最后更新:2026-03-27