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