关于 rds
面向数据库管理员和开发者的 Amazon RDS 运维参考技能,涵盖 CLI 与 boto3 示例,以及备份、高可用、安全、性能和故障排查建议。
主要功能
- 01创建与修改实例
- 02只读副本与 Multi-AZ 模式
- 03快照与时间点恢复
- 04安全和性能建议
- 05CLI 与 boto3 示例
适用场景
- 01规划 PostgreSQL RDS 部署
- 02使用副本扩展读取能力
- 03数据丢失后恢复数据库
- 04排查连接或性能问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill rds安装后在 Claude Code 中输入/rds确认已加载。
附带文件administration.md
详细介绍
AWS RDS
Amazon Relational Database Service(RDS)提供托管式关系数据库,包括 MySQL、PostgreSQL、MariaDB、Oracle、SQL Server 和 Aurora。RDS 负责资源配置、补丁更新、备份和故障转移。
目录
核心概念
数据库实例类
| 类别 | 示例 | 用途 |
|---|---|---|
| 标准型 | db.m6g.large | 通用型 |
| 内存优化型 | db.r6g.large | 内存需求较高的工作负载 |
| 可突增型 | db.t3.medium | 可变工作负载、开发/测试 |
存储类型
| 类型 | IOPS | 用途 |
|---|---|---|
| gp3 | 3,000-16,000 | 大多数工作负载 |
| io1/io2 | 最高 256,000 | 高性能 OLTP |
| magnetic | 不适用 | 旧版类型,建议避免使用 |
Multi-AZ 部署
- Multi-AZ 实例:在不同 AZ 中配置同步备用实例
- Multi-AZ 集群:一个写入实例、两个读取实例(类似 Aurora)
只读副本
用于扩展读取能力的异步副本。可以跨区域部署。
常见模式
创建 PostgreSQL 实例
AWS CLI:
# Create DB subnet group
aws rds create-db-subnet-group \
--db-subnet-group-name my-db-subnet-group \
--db-subnet-group-description "Private subnets for RDS" \
--subnet-ids subnet-12345678 subnet-87654321
# Create security group (allow PostgreSQL from app)
aws ec2 create-security-group \
--group-name rds-postgres-sg \
--description "RDS PostgreSQL access" \
--vpc-id vpc-12345678
aws ec2 authorize-security-group-ingress \
--group-id sg-rds12345 \
--protocol tcp \
--port 5432 \
--source-group sg-app12345
# Create RDS instance
aws rds create-db-instance \
--db-instance-identifier my-postgres \
--db-instance-class db.t3.medium \
--engine postgres \
--engine-version 16.1 \
--master-username admin \
--master-user-password 'SecurePassword123!' \
--allocated-storage 100 \
--storage-type gp3 \
--db-subnet-group-name my-db-subnet-group \
--vpc-security-group-ids sg-rds12345 \
--multi-az \
--backup-retention-period 7 \
--storage-encrypted \
--no-publicly-accessible
boto3:
import boto3
rds = boto3.client('rds')
response = rds.create_db_instance(
DBInstanceIdentifier='my-postgres',
DBInstanceClass='db.t3.medium',
Engine='postgres',
EngineVersion='16.1',
MasterUsername='admin',
MasterUserPassword='SecurePassword123!',
AllocatedStorage=100,
StorageType='gp3',
DBSubnetGroupName='my-db-subnet-group',
VpcSecurityGroupIds=['sg-rds12345'],
MultiAZ=True,
BackupRetentionPeriod=7,
StorageEncrypted=True,
PubliclyAccessible=False
)
创建只读副本
aws rds create-db-instance-read-replica \
--db-instance-identifier my-postgres-replica \
--source-db-instance-identifier my-postgres \
--db-instance-class db.t3.medium \
--availability-zone us-east-1b
创建快照
aws rds create-db-snapshot \
--db-snapshot-identifier my-postgres-snapshot-2024-01-15 \
--db-instance-identifier my-postgres
从快照还原
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier my-postgres-restored \
--db-snapshot-identifier my-postgres-snapshot-2024-01-15 \
--db-instance-class db.t3.medium \
--db-subnet-group-name my-db-subnet-group \
--vpc-security-group-ids sg-rds12345
时间点恢复
aws rds restore-db-instance-to-point-in-time \
--source-db-instance-identifier my-postgres \
--target-db-instance-identifier my-postgres-pitr \
--restore-time 2024-01-15T10:30:00Z \
--db-instance-class db.t3.medium
修改实例
# Change instance class (with downtime)
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--db-instance-class db.m6g.large \
--apply-immediately
# Scale storage (no downtime)
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--allocated-storage 200 \
--apply-immediately
使用 IAM 身份验证连接
import boto3
import psycopg2
rds = boto3.client('rds')
# Generate auth token
token = rds.generate_db_auth_token(
DBHostname='my-postgres.abc123.us-east-1.rds.amazonaws.com',
Port=5432,
DBUsername='iam_user',
Region='us-east-1'
)
# Connect
conn = psycopg2.connect(
host='my-postgres.abc123.us-east-1.rds.amazonaws.com',
port=5432,
database='mydb',
user='iam_user',
password=token,
sslmode='require'
)
CLI 参考
实例管理
| 命令 | 说明 |
|---|---|
aws rds create-db-instance | 创建实例 |
aws rds describe-db-instances | 列出实例 |
aws rds modify-db-instance | 修改设置 |
aws rds delete-db-instance | 删除实例 |
aws rds reboot-db-instance | 重启实例 |
aws rds start-db-instance | 启动已停止的实例 |
aws rds stop-db-instance | 停止实例 |
备份
| 命令 | 说明 |
|---|---|
aws rds create-db-snapshot | 手动创建快照 |
aws rds describe-db-snapshots | 列出快照 |
aws rds restore-db-instance-from-db-snapshot | 从快照还原 |
aws rds restore-db-instance-to-point-in-time | 时间点还原 |
aws rds copy-db-snapshot | 复制快照 |
副本
| 命令 | 说明 |
|---|---|
aws rds create-db-instance-read-replica | 创建只读副本 |
aws rds promote-read-replica | 提升为独立实例 |
最佳实践
安全
- 切勿设置为可公开访问 — 使用 VPC 和安全组
- 启用静态加密(KMS)和传输加密(SSL)
- 使用 IAM 身份验证进行应用程序访问
- 将凭证存储在 Secrets Manager 中并启用轮换
- 使用参数组强制启用 SSL
# Enforce SSL in PostgreSQL
aws rds modify-db-parameter-group \
--db-parameter-group-name my-pg-params \
--parameters "ParameterName=rds.force_ssl,ParameterValue=1,ApplyMethod=pending-reboot"
性能
- 选择合适的实例规格 — 监控 CPU、内存和 IOPS
- 使用 gp3 实现高性价比
- 启用 Performance Insights 进行查询分析
- 使用只读副本扩展读取能力
- 优化查询 — 检查慢查询日志
高可用性
- 为生产环境启用 Multi-AZ
- 对任务关键型工作负载使用 Aurora
- 配置合适的备份保留期
- 定期测试故障转移
- 监控副本的复制延迟
成本优化
- 对持续运行的工作负载使用预留实例
- 不使用时停止开发/测试实例
- 定期删除旧快照
- 选择合适的实例类
故障排查
无法连接
原因:
- 安全组未允许访问
- 实例不在 VPC 子网中
- 要求使用 SSL,但未使用
- 端点或端口错误
调试:
# Check security group
aws ec2 describe-security-groups --group-ids sg-rds12345
# Check instance status
aws rds describe-db-instances \
--db-instance-identifier my-postgres \
--query "DBInstances[0].{Status:DBInstanceStatus,Endpoint:Endpoint}"
# Test connectivity from EC2
nc -zv my-postgres.abc123.us-east-1.rds.amazonaws.com 5432
CPU/内存使用率高
调试:
# Enable Enhanced Monitoring
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--monitoring-interval 60 \
--monitoring-role-arn arn:aws:iam::123456789012:role/rds-monitoring-role
# Enable Performance Insights
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--enable-performance-insights \
--performance-insights-retention-period 7
解决方案:
- 升级实例类
- 优化慢查询
- 添加只读副本
- 检查锁定或阻塞情况
存储空间已满
**症状:**实例变得不可用
预防:
# Enable storage autoscaling
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--max-allocated-storage 500
# Set CloudWatch alarm
aws cloudwatch put-metric-alarm \
--alarm-name "RDS-Storage-Low" \
--metric-name FreeStorageSpace \
--namespace AWS/RDS \
--dimensions Name=DBInstanceIdentifier,Value=my-postgres \
--statistic Average \
--period 300 \
--threshold 10000000000 \
--comparison-operator LessThanThreshold \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
复制延迟
监控:
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ReplicaLag \
--dimensions Name=DBInstanceIdentifier,Value=my-postgres-replica \
--start-time $(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 60 \
--statistics Average
原因:
- 副本实例规格太小
- 写入负载过重
- 网络问题
- 副本上运行时间过长的查询
参考资料
评论
支持 Markdown