written by
Just4test

AWS认证 Database Specialty 学习笔记

2 min read , October 14, 2020

RDS

  • 带有只读副本的RDS实例无法停止
  • 增强监测:从实例级别进行监测。数据除了RDS界面的图表之外,将存储在CloudWatch Logs中。图表5秒更新一次,Logs一秒更新一次。
  • Performance Insights:从SQL层面进行性能监控
  • RDS可以将重启、关闭、系统更新、状态转换等事件发送到SNS,称为事件通知(Event Notification)

S3集成

  • 可以通过SELECT INTO OUTFILE S3 语句将查询结果保存到S3
  • 通过 LOAD DATA FROM S3 语句将支持的文件格式从S3加载到RDS,支持XML或CSV等格式。
  • 需要创建一个有权访问S3的IAM Role,并将Role ARN 写入aurora_load_from_s3_roleaws_default_s3_role参数

备份

  • 自动备份默认保留7天,最多保留35天。设置为0将禁用自动备份和时间点恢复。
  • 自动备份可以设置启动时间。如果没有配置MultiAZ,则备份开始时会发生短暂延迟。
  • 启用自动备份时会自动启用时间点恢复。RDS每5分钟将数据上传到S3,因此可以恢复的时间范围为自动备份保留期到5分钟前。
  • 用户可以拍摄手动快照。手动快照不会过期,还可以复制到其他Region。
  • 删除实例时可以选择保留自动备份。保留的自动备份会过期。
  • 删除实例时还可以选择创建最终快照,快照不会过期

SQL Server

  • 支持本机备份,不过是存储在S3上。这将生成一个.bak文件。只能在相同Region的S3桶中执行备份还原操作。
  • Multi-AZ部署的RDS SQL Server无法停止
  • 可使用 CloudWatch Application Insights 进行性能分析。即使自建SQL Server也可以使用。

Oracle

  • 不支持Oracle Data Guard。要使用这个特性,只能在EC2上自建。

迁移

  • 希望尽可能快地从本地迁移到RDS时,考虑使用Percona XtraBackup(PXB)工具导出二进制备份放入S3,并直接从S3还原到RDS。这种方式速度很快。
  • 从RDS迁移到Aurora时,创建Aurora读副本连接到RDS,等延迟为0后提升读副本为主库。注意,RDS/Aurora读副本的主库必须是RDS,因此这不适合从自建数据库迁移。
  • 当迁移过程涉及数据库架构变更时,使用SCT转换架构

SSL

可以指定强制验证证书。从AWS官网下载各区域的根证书,然后在连接命令中指定该证书

使用IAM连接到数据库

这可以让每个IAM用户使用单独的凭据连接数据库。然而这种连接方式效率较低,不适合生产应用程序使用。

  1. 在选项中启用IAM身份验证
  2. 为IAM用户或角色分配“rds-db:connect”权限
  3. 在数据库中创建用户,稍后IAM将利用此用户登陆
  4. 使用CLI生成连接字符串。

选项组

  • 如果关联了多个RDS实例,则这些实例必须处于同一VPC。
  • 持久性选项:只有不关联任何实例时才能才选项组删除该选项
  • 永久性选项:一旦添加无法删除。且关联的实例即使更换选项组,新的选项组也必须具有相同的永久性选项。

参数组

  • 更改动态参数后,相关的数据库将立即应用更改
  • 更改静态参数后,必须指定立即应用或手动重启数据库以应用更改,否则数据库将处于pending-reboot状态。这种状态不会导致维护期间数据库重启。
  • 更改实例关联的参数组后,必须手动重启数据库。

事件通知

可以使用SNS订阅各种RDS事件

只读副本

只读副本的源数据库必须启用了自动备份,这意味着备份保留期不能为0。

Aurora

  • MySQL 只支持 InnoDB 引擎

跨区域副本和全球数据库

  • 为主集群开启binlog之后即可手动创建跨区域副本
  • 全球数据库的延迟更低,跨区域副本对主库没有性能影响,并且在一个Region挂了之后可以在一分钟内恢复。

Serverless

  • 提供数据API,以便Serverless应用程序使用。该API提供HTTP方式访问。

Lambda集成

  • 可以通过lambda_sync函数调用lambda并获取返回值,或者使用lambda_async异步调用
  • 需要创建一个能够访问Lambda资源的IAM Role,然后将参数 aws_default_lambda_role 设置为Role ARN
  • 需要为用户授予权限,使用 GRANT INVOKE LAMBDA ON *.* TO user@domain

数据还原

  • 回溯(Backtracking):将当前数据库重置为以前某一秒的状态。这个功能需要单独开启。
  • 时间点恢复(Restore to point in time):创建一个新的数据库,具备以前某一秒的数据,不影响当前数据库。
  • 从快照恢复:创建一个新的数据库,具备快照的数据。快照可以分享给别的账户。

错误注入

故障转移

当主实例失败时,如果集群中没有副本实例,则将创建新的主实例,通常需要10分钟。

如果集群中有副本实例,则提升一个副本实例为主实例。通常需要2分钟。
可以为实例分配0-15之间的优先级。数字越小优先级越高。相同优先级中有多个实例类型的,实例类型越大优先级越高。

默认情况下,故障转移之后的主实例存在短时间性能下降的问题,这是新的主实例的缓存还没填充的缘故。为了缓解这一问题,可以启用缓存管理并将写入器、读取器实例的提升优先级改为0。

AutoScaling

只能在有至少一个副本的Aurora集群中启用AutoScalig。扩展的副本总是和主实例大小相同,优先级最低。

ERROR: could not write block XXXX of temporary file: No space left on device

Aurora DB Instance具有Instance Storage,大小为DB Instance内存的两倍。这些空间用于临时表和日志存储,其剩余容量体现在CloudWatch的FreeLocalStorage指标中。
对大型表进行更改或添加索引、复杂的JOIN、GROUP BY 或 ORDER BY可能导致该空间耗尽,从而报错。简单的解决方法是优化SQL语句或者更换为更大型的DB Instance;修改数据库参数也会有帮助。

incompatible parameters/不兼容的参数

此时无法修改数据库实例的参数组/实例类型/引擎版本,只能重启或删除。
此时应该重置当前关联参数组的部分或全部设置。与默认参数组比较以确定哪些参数与默认参数组不同,并手动修改;或者直接从控制台中将参数组重置为默认参数。

修改数据库时区后,某些用户仍然得到旧的时区设置

时区是动态参数,无需重启数据库,但仅对新连接生效。该用户断开并重新和数据库连接后即解决问题。

全局数据库

  • 在主集群之外,在最多5个其他区域创建只读集群。
  • 复制使用专用基础设施,因此创建只读集群不会降低主集群的性能
  • 使用Backbone进行复制,典型延迟低于1秒
  • 不支持克隆、回溯、并行查询、Serverless,不支持t系列实例。
  • 需要手动执行故障转移

多主集群/Multi-Master Cluster

  • 集群中的每个数据库实例均可以写入,不过目前只支持两个实例。
  • 不需要故障转移,因此是0停机时间。一个挂了不影响其他实例写入。不过需要自己处理负载平衡。(不支持读取器端点/reader endpoint)
  • 必须位于同一Region中,也无法创建跨Region副本。
  • 不支持克隆,不支持回溯,不支持转换成其他类型的Aurora。数据迁移只能使用DMS或MySQL dump。

数据库活动流

将SQL级别的访问和更改事件推送到Kinesis流,以满足合规要求。需要KMS支持。

高级审核/Advanced Auditing

DynamoDB

  • 提供一致的、毫秒级读写延迟,无论读写量和数据存量。
  • 单个对象最大尺寸为400K
  • 使用DAX(本质是Redis)以实现微秒级延迟
  • AutoScaling以应对流量高峰。如果业务通常流量很低但有突发流量峰值,考虑Serverless。
  • 使用投影表达式/Projection Expression减少读取的数据量,以降低成本、提高传输效率。
  • 分区key支持强一致查询,全局二级索引(GSI)和本地二级索引(LSI)仅支持最终一致性查询。
  • 本地二级索引和表共享写容量。
  • 通常通过公网传输数据。
    可以使用基于PrivateLink技术的VPC终端节点以内网传输到VPC。
    可以结合Direct Connect和PrivateLink终端节点以内网传输到私有机房。
  • 使用 BatchWriteItem 批量写入或删除对象。无法用于部分更新对象。

表设计

  • 首先应分析数据库查询访问模式(Database query access pattens),以便建模。
  • 必须指定主键(Primary Key),主键不可重复。可以使用单主键,或者分区键(Partition Key)和排序键(Sort Key)构成的复合主键。
  • 分区键也称为哈希属性(hash attribute),排序键也称为范围属性(Range attribute)。
  • 如果综合使用分区键和排序键,分区键应该平均分配。如果分区键的值是很少的几种枚举,将导致热分区问题,降低性能。
  • 如果指定的是复合主键,则可以创建本地二级索引。本地二级索引和主键使用相同的分区键。

二级索引

  • 本地二级索引(Local Secondary Indexes)和表共享分区键。也就是说,当表是单主键时,本地二级索引没有意义。最多5个。
  • 全局二级索引(Global Secondary Indexes)无需使用表的主键
  • 当设置了二级索引时,可以插入没有索引键的记录,或者值类型与索引不符的记录。二级索引不会索引这种记录。
  • 更新本地二级索引会消耗额外的写入容量。因此,当创建了本地二级索引时,写入记录所消耗写入容量将增加。

数据导入

  • 使用AWS CLI导入JSON格式文件
  • 使用Lambda从S3导入适量文件
  • 使用Data Pipeline从S3或其他来源导入大量数据。这一过程会创建EMR集群,需要一定成本

缩放

  • 支持自动伸缩(Auto-Scaling)。这可以(较慢地)提高性能。突发流量仍然会引发限流。
  • 切换到按需(on-demand)容量模式。这可以承受突发的大量负载,但相比预置容量模式贵很多。适用于流量峰谷差异非常大的情况。

扫描

  • 必须提供分区键。可以是主键的分区键,也可以是全局二级索引的分区键。
  • 可以指定排序键的范围,或字符串前缀。这有助于缩小扫描范围从而减少读取容量消耗。每次最多扫描1MB,超过了要分页。
  • 可以指定筛选表达式(Filter Expression)。这无助于减少读取容量消耗,但有助于减少返回的结果大小。
  • 可以指定投影表达式(Projection Expression)。这有助于减少返回结果大小。特别的,如果查询的是全局二级索引,且属性已经全部投影到二级索引中,则有助于减小消耗的读取容量。
  • 指定Limit以限制返回数目。这也有助于减少消耗的读取容量。
  • 可以在应用层面执行并行扫描以加快大型查询的速度。在查询中指定分段(Segment)和总分段数(TotalSegments)以支持并行查询。

TTL

  • 启用TTL以自动删除过期元素。删除动作不消耗写入流量,也不产生费用。
  • TTL是一个属性,并可以指定该属性的名称。
  • 在控制台启用TTL之前可以预览将要删除的对象
  • 过期之后不会立即删除。尚未删除的对象依然可以读取、更新。通常过期项目在48小时内会删除。
  • TTL值5年前的对象不会自动删除。
  • 可以使用 dynamodb:UpdateTimeToLive 权限限制对TTL的启用禁用,以及写入TTL属性。

备份

  • 手动备份(Backup),注意,RDS的手动备份称为快照(Snapshot)
  • 时间点恢复。DynamoDB不支持自动备份,仅支持时间点恢复。可以恢复到其他Region。
  • 可以使用Stream进行流式实时备份,这需要用户自己捕获并保留流数据。这也可以用于跨Region实时备份。

时间点恢复/PITR

  • 需要启用。启用后保留35天。这个时间无法更改。
  • 如果删除了启用时间点恢复的表,将保留35天的备份以备还原。
  • 启用后可以将可用时间段内的任何一秒的数据恢复成一个新的DynamoDB实例。
  • 可以还原到其他Region。此时必须指定sse-specification-overridesource-table-arn 参数。
  • 还原时包含二级索引。可以禁用部分或全部二级索引,这会加快还原速度。
  • 免费,不消耗吞吐流量。但若还原到其他Region则产生Region间数据传输费用。

ElastiCache

Redis

  • 备份或故障转移有时会失败,是因为为后台进程预留的内存不够。通过在修改参数组中的“reserved-memory-percent”解决此问题。老版本Redis建议设置为50,新版为25
  • 在只读副本上进行备份可以减少对集群的性能影响
  • 支持全球数据存储(Global Datastore for Redis),可以在其他Region建立只读辅助集群。最多两个辅助集群。
  • ElastiCache Redis 集群分为两种:分片和不分片。不分片是指只有一个分片,也称为禁用集群模式(Cluster Mode Disabled)。分片是指有2个或更多分片,也称为启用集群模式。数据将平均地存储在各个分片中,应用程序需要同时连接所有分片以查询全部数据。
  • 每个分片对应一个主实例。可以创建0-5组读副本实例。如果一个集群有3个分片,5组读副本,则总共有3个主实例,15个读副本实例,共18个实例。
  • 一个集群最多90个实例,但此限制可以提升。对于5.0.6以下的版本,可提升至250个实例;对于5.0.6以上版本,可提升至500个实例。
  • 对于写操作很重的应用,建议启用分片(Cluster Mode Enabled),这将把写入操作均匀分配到不同的服务器。
  • 对于读操作为主且考虑横向伸缩的应用,建议禁用分片(Cluster Mode Disabled)。非集群模式的横向伸缩更简单
  • 在不分片、禁用了多可用区、禁用了自动故障转移的集群中,可以将读副本提升为主数据库

DocumetDB

Profiling:免费,但需要导出至CloudWatch Logs

  • 将“ReadPreference”设置为“secondaryPreferred”可以优先从只读节点读取,以提高集群性能。

DMS

  • DMS不迁移索引。对于大型迁移任务,应提前建立索引。

CDC,连续复制任务

data validation

比较迁移前后的数据以验证错误。如果应用于连续复制任务,则将连续检查。

  • 可选的
  • 支持CDC
  • FailureMaxCount:检查出指定数量的记录错误后停止复制
  • TableFailureMaxCount:检查出指定数量的表错误后停止复制
  • ThreadCount:指定验证使用的线程数量
  • RecordFailureDelayLimitInMinutes:在经过指定的延迟之后才开始报告错误

架构转换工具,SCT,Schema Conversion Tool

用于异构数据库迁移。

Apache Cassandra 迁移到 DynamoDB

  1. 创建克隆数据中心(对生产集群执行数据提取会极大地降低生产集群性能)
  2. 安装数据提取代理(Data Exacting Agent)
  3. 创建S3桶,数据将导出到S3桶中
  4. DynamoDB从S3中导入数据

WQF,Workload Qualification Framework

一个能够给出从自建Oracle和SQL Server转移到RDS评估报告的工具。该工具使用DMS SCT来收集信息并模拟现有的Oracle和SQL Server数据库,以分析出负载评估、转移策略、转移的各个步骤提示,并输出报告。这是一个Marketplace 镜像。

CloudFormation

  • Secret Manager可以随机生成密码
  • 使用!Ref函数以引用资源。
  • 使用resolve”进行动态引用。动态引用仅在运行时解析,其值不会出现在模板中,适合引用密码

删除保护

  • 将堆栈的TerminationProtection(终止保护)指定为True。这将阻止删除堆栈。
  • 将资源的DeletioPolicy指定为Retain或Snapshot。堆栈可以正常删除,但资源仍将保留/保留快照。
  • 使用StackPolicy(堆栈策略)阻止删除或替换资源
  • 使用IAM控制

Data Pipeline

图数据库 Neptune

  • 支持 Gremlin 和 SPARQL 查询语言
  • SPARQL用于查询RDF模型(RDF model),以表示图形对象之间的关系。

Redshift

  • 可以创建快照,快照可以共享给其他账户

Spectrum

将数据存储在S3中,以利用S3的低成本优势。

并发扩展

一种Serverless技术,可以弹性的获取额外资源进行并发处理,获取资源的延迟很低。这仍然需要现有的Redshift集群主机。

辨析

RDS开启防止中间人攻击

将以下字符串加入客户端连接参数

  • MySQL: --ssl-ca=/home/myuser/rds-combined-ca-bundle.pem --ssl-mode=verify-full
  • SQL Server: encrypt=true;trustServerCertificate=false
  • PostgreSQL:sslrootcert=rds-ca-2015-root.pem sslmode=verify-full
    可以将数据库静态参数rds.force_ssl设为1以禁止非加密链接。
  • Oracle: 将客户端属性 ssl_server_dn_match 设为ON或True。这不是连接参数。

性能分析

缓存策略

  • Cache-Aside 应用程序读数据时同时连接缓存和数据库。缓存未命中时,应用程序负责去数据库读数据。
  • Read Through 应用程序连接到缓存(或缓存提供程序)直接读取数据。缓存未命中时,由缓存(或缓存提供程序)去数据库获取数据
  • Write Through 应用程序将数据写入缓存(或缓存提供程序)。缓存负责将数据写入数据库。所有写入的数据都存在于缓存中,读命中率更高,但消耗更多内存。
  • Lazy Loading 仅在读取时,如果缓存中没有则从数据库读入缓存。相比Write Through可以节省内存大小(写入的对象未必需要读出)
  • Write-Behind 一种Write Through变种,缓存异步地将数据写入数据库。这可以提高写入性能,但在系统崩溃时会损失更多的数据。
  • Write-Around 应用程序写入时忽略缓存,只写入数据库。
  • Write-Back