跳至内容
aws
aws数据库集合

aws数据库集合

aws数据库

  • rds
  • rds proxy
  • DynamoDB

1. RDS

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli_rds_code_examples.html
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.CommonTasks.html
https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html

注意区分集群 和 实例

postgresql

注意事项

参数组参数

rds.force_ssl   1   # 默认值为 1, 需要 ssl 访问, 需要下载证书

创建一个实例

aws rds create-db-cluster \
    --db-cluster-identifier sample-pg-cluster \
    --engine aurora-postgresql \
    --master-username master \
    --master-user-password secret99 \
    --db-subnet-group-name default \
    --vpc-security-group-ids sg-0b9130572daf3dc16

性能指标

Total DB load 47.03 表示数据库的总负载, 即所有活动和等待事件的总和 CPU 13.88, 30% CPU 使用占总负载的百分比; IO:DataFileRead 3.45, 7% 从数据文件读取操作占总负载的百分比; 这反映了数据库从磁盘读取数据文件的频率和资源消耗

mysql

# 查询 MySQL 可用版本
aws rds describe-db-engine-versions --engine mysql --query "DBEngineVersions[].EngineVersion"

# 查询 aurora 可用版本
aws rds describe-db-engine-versions --engine aurora --query "DBEngineVersions[].EngineVersion"

aws rds describe-db-engine-versions --engine aurora-mysql --query "DBEngineVersions[].EngineVersion"
  1. 创建集群
  2. 创建实例
# 创建集群, 注意返回信息中的 endpoint 地址
aws rds create-db-cluster \
    --db-cluster-identifier cluster01 \
    --engine aurora-mysql \
    --engine-version 5.7 \
    --master-username admin \
    --master-user-password secret99 \
    --db-subnet-group-name default \
    --vpc-security-group-ids sg-0b9130572daf3dc16

   # 其它参数
   --kms-key-id b43c75aa-bb7d-481d-94e0-8bc45401bd36
   --storage-encrypted
   --enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]'


# 创建实例
# 返回结果中也包含一个 endpoint, 但这个地址是写入节点本机的, 不是集群地址, 不具备高可用能力
aws rds create-db-instance \
    --db-instance-identifier cluster01 \
    --db-instance-class db.t3.micro \
    --engine mysql \
    --master-username admin \
    --master-user-password secret99 \
    --allocated-storage 20

其它管理命令

aws rds create-db-parameter-group \
    --db-parameter-group-name mydbparametergroup \
    --db-parameter-group-family MySQL5.6 \
    --description "My new parameter group"

aws rds create-db-snapshot \
    --db-instance-identifier database-mysql \
    --db-snapshot-identifier mydbsnapshot

# 创建集群 - 读副本
aws rds create-db-instance-read-replica \
    --db-instance-identifier test-instance-repl \
    --source-db-instance-identifier test-instance

# 使用 AWS CLI 创建只读副本
aws rds create-db-instance-read-replica \
    --db-instance-identifier my-db-read-replica \
    --source-db-instance-identifier my-primary-db \
    --db-instance-class db.t3.medium \
    --availability-zone us-east-1a

# 修改实例配置
aws rds modify-db-instance

cli manager

# 查看集群详细信息
aws rds describe-db-clusters --db-cluster-identifier mydbcluster

# 查看实例详细信息
aws rds describe-db-instances --db-instance-identifier mydbinstancecf

# 查看指定 RDS 数据库实例最近发生的事件列表
aws rds describe-events --source-identifier test-instance --source-type db-instance

# delete
# 在删除之前,自动创建一个数据库快照
aws rds delete-db-instance --db-instance-identifier test-instance \
    --final-db-snapshot-identifier test-instance-final-snap


# 获取性能指标数据, 参数存储在 JSON 文件中
aws pi get-resource-metrics --service-type RDS --identifier db-LKCGOBK26374TPTDFXOIWVCPPM \
  --start-time 1527026400 --end-time 1527080400 --period-in-seconds 300 \
  --metric db.load.avg --metric-queries file://metric-queries.json

metric-queries.json
[
    {
        "Metric": "db.load.avg",
        "GroupBy": {
            "Group":"db.wait_event"
        }
    }
]

2. RDS Proxy

创建 RDS Proxy

aws rds create-db-proxy \
    --db-proxy-name my-db-proxy \
    --engine-family MYSQL \
    --role-arn arn:aws:iam::123456789012:role/rds-proxy-role \
    --vpc-subnet-ids subnet-123456 subnet-789012 \
    --auth UsernamePassword \
    --secret-arn arn:aws:secretsmanager:us-east-1:123456789012:secret:my-db-credentials

aws rds create-db-proxy \
  --db-proxy-name my-rds-proxy \
  --engine-family MYSQL \
  --auth-type SECRETS \
  --require-tls \
  --idle-client-timeout 1800 \
  --debug-logging \
  --role-arn arn:aws:iam::123456789012:role/RDSProxyRole \
  --vpc-subnet-ids subnet-12345678 subnet-87654321 \
  --vpc-security-group-ids sg-12345678 \
  --auth Description="RDS Proxy Auth",AuthScheme=SECRETS,IAMAuth=DISABLED,SecretArn=arn:aws:secretsmanager:us-east-1:123456789012:secret:rds-proxy-credentials-ABC123
# 添加主数据库作为写端点
aws rds register-db-proxy-targets --db-proxy-name my-rds-proxy --target-group-name default \
  --db-instance-identifier my-primary-db

# 添加只读副本作为读端点
aws rds register-db-proxy-targets --db-proxy-name my-rds-proxy --target-group-name reader \
  --db-instance-identifier my-read-replica-1
# 检查复制状态
aws rds describe-db-instances \
    --db-instance-identifier my-read-replica \
    --query 'DBInstances[0].{Status:DBInstanceStatus, ReplicaStatus:StatusInfos[0].Status}'

# 监控 CloudWatch 指标
aws cloudwatch get-metric-statistics \
    --namespace AWS/RDS \
    --metric-name ReplicaLag \
    --dimensions Name=DBInstanceIdentifier,Value=my-read-replica \
    --start-time $(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 60 \
    --statistics Maximum
# 查看代理状态
aws rds describe-db-proxies --db-proxy-name my-rds-proxy

# 查看目标状态
aws rds describe-db-proxy-targets --db-proxy-name my-rds-proxy

# 查看代理日志
aws rds describe-db-proxy-log-files --db-proxy-name my-rds-proxy

3. DynamoDB

一种 NoSQL 数据库服务, 使用键值对来存储数据

无模式(Schema-less)的; 同一张表中的不同项可以拥有完全不同的属性集合

数据结构层级

Table 表: 与其他数据库类似, 是数据的集合容器; 与关系型数据库不同的是, DynamoDB 在创建表时只需定义主键(Primary Key), 无需预先定义其他列或属性(Schema-less);

Item 项: 表中的一条数据记录, 类似于关系型数据库中的"行(Row)"

Attribute 属性: 组成项的基本数据单元, 类似于"列(Column)", 但 DynamoDB 支持嵌套结构

数据类型标识

用于告诉 DynamoDB 该属性的具体类型

标识符 数据类型 描述与示例
S String 区分大小写的字符串; 例如: {"S": "张三"}
N Number 整数或小数, 作为字符串传输; 例如: {"N": "99.9"}
B Binary 二进制数据(Base64 编码); 例如: {"B": "dGVzdA=="}
BOOL Boolean 布尔值; 例如: {"BOOL": true}
NULL Null 表示空值; 例如: {"NULL": true}
L List 存储有序的集合, 类型可混合; 例如: {"L": [{"S": "apple"}, {"N": "5"}]}
M Map 存储无序的键值对集合, 类似 JSON 对象;
SS Set 字符串集合, 元素必须唯一
NS Set 数字集合, 元素必须唯一
BS Set 二进制集合, 元素必须唯一
Map : {"M": {"name": {"S": "李四"}, "age": {"N": "18"}}}

map 和 list 可以构建深度最多 32 层的复杂 JSON 结构

Primary Key 主键

分区键(Partition Key) 必须存在, DynamoDB 根据该值的哈希值进行物理存储分布; 选择分区键时, 建议选择基数大(取值种类多)的属性(如 user_id), 避免出现"热点"分区;

排序键(Sort Key) 可选, 用于在同一分区键下对数据进行排序; 支持字符串(S), 数字(N)或二进制(B)类型; 如果业务存在"一对多"查询需求(如查询"某用户的所有订单"), 建议将关联属性设计为排序键;

管理 cli

  1. 使用 CLI 操作时, 必须显式声明类型
  2. 使用语言 SDK 时, 通常会字段解决类型声明;

管理表


# 列出全部表
aws --profile uat --region us-east-1 dynamodb list-tables

数据查询


# 必须同时指定分区键和排序键
aws --profile uat --region us-east-1 \
    dynamodb get-item \
    --table-name Riv-Prod-SharedStorageMetadataFaceTable609BE09F-16WEOJN0II315 \
    --key '{"PartitionKey": {"S": "User::84e571c1-d0f9-49ce-b797-581c7542ac9b"}, "SortKey": {"S": "Face::1909665b-73dc-48a9-9bba-40725105c633"}}' \
    --return-consumed-capacity TOTAL

# 扫描表里面的全部数据
aws --profile uat --region us-east-1 dynamodb scan \
    --table-name Riv-Prod-SharedStorageMetadataFaceTable609BE09F-16WEOJN0II315

# 扫描表里面的全部数据 - 过滤
aws --profile uat --region us-east-1 dynamodb scan \
    --table-name Riv-Prod-SharedStorageMetadataFaceTable609BE09F-16WEOJN0II315 \
    --filter-expression "PartitionKey = :a" \
    --expression-attribute-values '{":a":{"S":"User::ae6bd981-409e-4651-b88c-dab9ee06bdd3"}}' \
    --return-consumed-capacity TOTAL


# 文件搜索 key
# awskey.json
{"PartitionKey": {"S": "User::84e571c1-d0f9-49ce-b797-581c7542ac9b"}}

aws --profile zhongtai --region us-east-1 dynamodb scan \
    --table-name Riv-Prod-SharedStorageMetadataFaceTable609BE09F-7A7RS2GQO97O \
    --filter-expression "PartitionKey = :a" \
    --expression-attribute-values '{":a":{"S":"User::ae6bd981-409e-4651-b88c-dab9ee06bdd3"}}' \
    --return-consumed-capacity TOTAL

数据

{
  "user_id": {"S": "user_001"},
  "age": {"N": "25"},
  "tags": {"SS": ["developer", "aws"]},
  "profile": {
    "M": {
      "city": {"S": "上海"},
      "score": {"N": "88.5"}
    }
  }
}

python sdk


import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('your_table_name')

# 检查主键名
primary_key = table.key_schema[0]['AttributeName']
if primary_key != 'your_primary_key':
    raise ValueError("提供的键名与定义的键名不匹配")

# 检查排序键名
sort_key = table.key_schema[1]['AttributeName']
if sort_key != 'your_sort_key':
    raise ValueError("提供的键名与定义的键名不匹配")


# 可以使用 Table.attribute_definitions 属性来获取 DynamoDB 表的键值类型信息
# 检查主键值类型
primary_key_type = table.attribute_definitions[0]['AttributeType']
if type(your_primary_key) != primary_key_type:
    raise TypeError("提供的键值与定义的键值类型不匹配")

# 检查排序键值类型
sort_key_type = table.attribute_definitions[1]['AttributeType']
if type(your_sort_key) != sort_key_type:
    raise TypeError("提供的键值与定义的键值类型不匹配")

DMS

数据库迁移服务

注意内部是通过触发器进行同步的, 触发器的用户和相关权限需要注意

因为数据迁移用过一次, 因为触发器引发业务bug, 所以又放弃使用了;

pg数据库

-- 独立的迁移用户需要有相关权限
GRANT rds_superuser to your_user;
GRANT rds_replication to your_user;
最后更新于