mcpField
R
rds

rds

github.com/itsmostafa数据与数据库1.2k129 次安装2 天前更新
代码仓库

关于 rds

面向数据库管理员和开发者的 Amazon RDS 运维参考技能,涵盖 CLI 与 boto3 示例,以及备份、高可用、安全、性能和故障排查建议。

主要功能

  1. 01创建与修改实例
  2. 02只读副本与 Multi-AZ 模式
  3. 03快照与时间点恢复
  4. 04安全和性能建议
  5. 05CLI 与 boto3 示例

适用场景

  1. 01规划 PostgreSQL RDS 部署
  2. 02使用副本扩展读取能力
  3. 03数据丢失后恢复数据库
  4. 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用途
gp33,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
  • 配置合适的备份保留期
  • 定期测试故障转移
  • 监控副本的复制延迟
成本优化
  • 对持续运行的工作负载使用预留实例
  • 不使用时停止开发/测试实例
  • 定期删除旧快照
  • 选择合适的实例类

故障排查

无法连接

原因:

  1. 安全组未允许访问
  2. 实例不在 VPC 子网中
  3. 要求使用 SSL,但未使用
  4. 端点或端口错误

调试:

# 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