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_role
或aws_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用户使用单独的凭据连接数据库。然而这种连接方式效率较低,不适合生产应用程序使用。
- 在选项中启用IAM身份验证
- 为IAM用户或角色分配“
rds-db:connect
”权限 - 在数据库中创建用户,稍后IAM将利用此用户登陆
- 使用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-override
和source-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
- 创建克隆数据中心(对生产集群执行数据提取会极大地降低生产集群性能)
- 安装数据提取代理(Data Exacting Agent)
- 创建S3桶,数据将导出到S3桶中
- 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。这不是连接参数。
性能分析
- RDS的SQL层面性能分析:使用Performance Insights
- .NET和SQL Server应用层监控:CloudWatch Application Insights
- RDS实时性能监控:增强监测(Enhanced Monitoring)
- DynamoDB最常访问项目与最受限项目分析:CloudWatch Contributor Insights。这个工具可以分析日志文本中最常出现的元素。
- DocumentDB:使用“explain()”以分析单个请求。使用“
currentOp
”列出当前正在执行的请求。使用 Profiling将操作的详细时间记录到CloudWatch Logs。最后通过CloudWatch Logs Insights进行分析,该分析工具用类似SQL的语法跨多个日志流进行查询,并可将结果可视化。
缓存策略
- Cache-Aside 应用程序读数据时同时连接缓存和数据库。缓存未命中时,应用程序负责去数据库读数据。
- Read Through 应用程序连接到缓存(或缓存提供程序)直接读取数据。缓存未命中时,由缓存(或缓存提供程序)去数据库获取数据
- Write Through 应用程序将数据写入缓存(或缓存提供程序)。缓存负责将数据写入数据库。所有写入的数据都存在于缓存中,读命中率更高,但消耗更多内存。
- Lazy Loading 仅在读取时,如果缓存中没有则从数据库读入缓存。相比Write Through可以节省内存大小(写入的对象未必需要读出)
- Write-Behind 一种Write Through变种,缓存异步地将数据写入数据库。这可以提高写入性能,但在系统崩溃时会损失更多的数据。
- Write-Around 应用程序写入时忽略缓存,只写入数据库。
- Write-Back