

# PERF04-BP02 评估可用的选项
<a name="perf_right_database_solution_evaluate_options"></a>

 在选择数据管理解决方案之前，需要了解可用的数据库选项及其如何优化性能。使用负载测试确定与您的工作负载相关的重要数据库指标。在研究数据库选项时，要考虑各种方面，如参数组、存储选项、内存、计算、只读副本、最终一致性、连接池和缓存选项。尝试使用这些不同的配置选项来改进指标。 

 **期望结果：** 基于数据类型，工作负载可以使用一个或多个数据库解决方案。数据库功能和优势与数据特征、访问模式和工作负载要求完美匹配。要优化您的数据库性能和成本，您必须评估数据访问模式以确定适当的数据库选项。评估可接受的查询时间，以确保选定的数据库选项可以满足要求。 

 **常见反模式：** 
+  未识别数据访问模式。 
+  不了解所选数据管理解决方案的配置选项。 
+  仅依赖于增加实例大小，而不考虑其他可用的配置选项。 
+  不测试所选解决方案的扩展特征。 

 

 **建立此最佳实践的好处：** 通过探索和试用数据库选项，您也许能够降低基础设施成本，提高性能和可扩展性，并减少维护工作负载所需的工作量。 

 **未建立这种最佳实践的情况下暴露的风险等级：** 高 
+  必须针对 *一刀切类型的* 数据库进行优化意味着做出不必要的妥协。 
+  由于没有配置数据库解决方案以匹配流量模式，导致成本增加。 
+  扩展问题可能会导致运维问题。 
+  数据的保护级别可能达不到要求。 

## 实施指导
<a name="implementation-guidance"></a>

 了解您的工作负载数据特征，以便配置数据库选项。运行负载测试以确定您的关键性能指标和瓶颈。使用这些特征和指标来评估数据库选项并尝试使用不同的配置。 


|  AWS 服务  |  Amazon RDS、Amazon Aurora  |  Amazon DynamoDB  |  Amazon DocumentDB  |  Amazon ElastiCache  |  Amazon Neptune  |  Amazon Timestream  |  Amazon Keyspaces  |  Amazon QLDB  | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | 
|  扩展计算  |  增加实例大小，Aurora 无服务器实例自动扩展以响应负载变化  |  按需容量模式下的自动读/写扩展，或预置容量模式下的预置读/写容量自动扩展  |  增加实例大小  |  增加实例大小，将节点添加到集群  |  增加实例大小  |  自动扩展以调整容量  |  按需容量模式下的自动读/写扩展，或预置容量模式下的预置读/写容量自动扩展  |  自动扩展以调整容量  | 
|  横向扩展读取  |  所有引擎都支持只读副本。Aurora 支持只读副本实例的自动扩展  |  增加预置的读取容量单位  |  只读副本  |  只读副本  |  只读副本。支持只读副本实例的自动扩展  |  自动扩展  |  增加预置的读取容量单位  |  自动纵向扩展到规定的并发限制  | 
|  横向扩展写操作  |  增加实例大小，批处理应用程序中的写操作，或在数据库前面添加队列。通过跨多个实例的应用程序级分片进行横向扩展  |  增加预置的写入容量单位。确保最佳分区键，以防止分区级写操作节流  |  增加主实例大小  |  在集群模式下使用 Redis 跨分片分布写操作  |  增加实例大小  |  扩展时，写请求可能会受到限制。如果遇到节流异常，请继续以相同（或更高）吞吐量发送数据，以自动扩展。批量写入以减少并发写入请求  |  增加预置的写入容量单位。确保最佳分区键，以防止分区级写操作节流  |  自动纵向扩展到规定的并发限制  | 
|  引擎配置  |  参数组  |  不适用  |  参数组  |  参数组  |  参数组  |  不适用  |  不适用  |  不适用  | 
|  缓存  |  内存中的缓存，可通过参数组进行配置。与 ElastiCache for Redis 等专用缓存结合使用，分流对经常访问项的请求  |  DAX 完全托管式缓存可用  |  内存中的缓存。（可选）与 ElastiCache for Redis 等专用缓存结合使用，分流对经常访问项的请求  |  主要功能是缓存  |  使用查询结果缓存来缓存只读查询的结果  |  Timestream 有两个存储层；其中之一是高性能内存中存储层  |  部署单独的专用缓存（如 ElastiCache for Redis），分流对经常访问项的请求  |  不适用  | 
|  高可用性/灾难恢复  |  对于生产工作负载，推荐的配置是在第二个可用区中运行备用实例，以在一个区域内提供弹性。  对于跨区域的弹性，可以使用 Aurora 全球数据库  |  在一个区域内高度可用。可以使用 DynamoDB 全局表跨区域复制表  |  跨可用区创建多个实例以实现可用性。  快照可以跨区域共享，集群可以使用 DMS 进行复制，用于提供跨区域复制/灾难恢复  |  对于生产集群，推荐的配置是在备用可用区中至少创建一个节点。  ElastiCache 全局数据存储可用于跨区域复制集群。  |  其他可用区中的只读副本用作失效转移目标。  快照可以跨区域共享，集群可以使用 Neptune 流进行复制，用于在两个不同区域的两个集群之间复制数据。  |  在一个区域内高度可用。跨区域复制需要使用 Timestream SDK 进行自定义应用程序开发  |  在一个区域内高度可用。  跨区域复制需要自定义应用程序逻辑或第三方工具  |  在一个区域内高度可用。  要跨区域复制，请将 Amazon QLDB 日志的内容导出到 S3 存储桶，并配置该存储桶以进行跨区域复制。  | 

 

 **实施步骤** 

1.  哪些配置选项可用于选定的数据库？ 

   1.  利用 Amazon RDS 和 Aurora 的参数组，您可以调整常见的数据库引擎级别设置（例如为缓存分配的内存），或调整数据库的时区 

   1.  对于预置的数据库服务（如 Amazon RDS、Aurora、Neptune、Amazon DocumentDB）以及在 Amazon EC2 上部署的数据库服务，您可以更改实例类型、预置存储和添加只读副本。 

   1.  DynamoDB 允许您指定两种容量模式：按需和预置。考虑到不同的工作负载，您可以在这两种模式之间进行更改，并在预置模式下随时增加所分配的容量。 

1.  工作负载是否包含大量的读取或写入操作？  

   1.  哪些解决方案可用于分流读取操作（只读副本、缓存等）？  

      1.  对于 DynamoDB 表，您可以使用 DAX 缓存功能来分流读取操作。 

      1.  对于关系数据库，您可以创建一个 ElastiCache for Redis 集群，并将应用程序配置为首先从缓存中读取，并在请求的项目不存在时返回到数据库。 

      1.  关系数据库（如 Amazon RDS 和 Aurora）以及预置的 NoSQL 数据库（如 Neptune 和 Amazon DocumentDB）全部支持添加只读副本，以分流工作负载的读取部分。 

      1.  DynamoDB 等无服务器数据库将自动扩展。确保您预置了足够的读取容量单位（RCU，Read Capacity Unit）来处理工作负载。 

   1.  哪些解决方案可用于扩展写入操作（分区键分片、引入队列等）？ 

      1.  对于关系数据库，您可以增加实例的大小以适应增加的工作负载，或增加预调配 IOPS 以增加底层存储的吞吐量。 
         +  您还可以在数据库前面引入队列，而不是直接写入数据库。此模式允许您将摄取操作与数据库解耦，并控制流量，这样数据库就不会过载。  
         +  对写入请求进行批处理，而不是创建许多短期事务，这样有助于提高有大量写入的关系数据库的吞吐量。 

      1.  像 DynamoDB 这样的无服务器数据库可以自动扩展写入吞吐量，也可以根据容量模式调整预置的写入容量单位（WCU，Write Capacity Unit）。  
         +  但是，当达到给定分区键的吞吐量限制时，仍然会遇到 *热* 分区问题。这可以通过选择更均匀分布的分区键或对分区键进行写分片来缓解。  

1.  当前或预期的每秒事务数（TPS）峰值是多少？ 使用此流量和此流量 \$1X% 进行测试，以了解扩展特征。 

   1.  适用于 PostgreSQL 的 pg\$1bench 等原生工具可用于对数据库进行压力测试，以了解瓶颈和扩展特征。 

   1.  应该捕获类似生产的流量，以便重放这些流量，从而在合成工作负载之外模拟真实世界的情况。 

1.  如果使用无服务器或弹性可扩展计算，请测试此扩展对数据库的影响。如果合适，引入连接管理或池技术以降低对数据库的影响。  

   1.  RDS 代理可与 Amazon RDS 和 Aurora 结合使用，以管理与数据库的连接。  

   1.  DynamoDB 等无服务器数据库没有与之关联的连接，但会考虑预置容量和自动扩展策略来处理负载峰值。 

1.  负载是否可预测，是否会出现负载峰值和不活动时段？ 

   1.  如果有一段时间处于不活动状态，请考虑在这段时间内缩减预置的容量或实例大小。Aurora Serverless V2 将根据负载自动纵向扩展和缩减。 

   1.  对于非生产实例，请考虑在非工作时间暂停或停止这些实例。 

1.  您是否需要根据访问模式和数据特征对数据模型进行分段和拆分？ 

   1.  考虑使用 AWS DMS 或 AWS SCT 将您的数据移动到其他服务。 

## 实施计划的工作量级别： 
<a name="level-of-effort-for-the-implementation-plan-to-establish-this-best-practice-you-must-be-aware-of-your-current-data-characteristics-and-metrics.-gathering-those-metrics-establishing-a-baseline-and-then-using-those-metrics-to-identify-the-ideal-database-configuration-options-is-a-low-to-moderate-level-of-effort.-this-is-best-validated-by-load-tests-and-experimentation."></a>

要建立此最佳实践，您必须了解当前的数据特征和指标。收集这些指标，建立基线，然后使用这些指标来确定理想的数据库配置选项，这需要 *低* 到 *中等* 工作量。这最好通过负载测试和实验来验证。 

## 资源
<a name="resources"></a>

 **相关文档：** 
+  [AWS 云数据库 ](https://aws.amazon.com/products/databases/?ref=wellarchitected) 
+  [AWS 数据库缓存 ](https://aws.amazon.com/caching/database-caching/?ref=wellarchitected) 
+  [Amazon DynamoDB Accelerator ](https://aws.amazon.com/dynamodb/dax/?ref=wellarchitected) 
+  [Amazon Aurora 最佳实践 ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.BestPractices.html?ref=wellarchitected) 
+  [Amazon Redshift 性能 ](https://docs.aws.amazon.com/redshift/latest/dg/c_challenges_achieving_high_performance_queries.html?ref=wellarchitected) 
+  [Amazon Athena 10 大性能提示 ](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/?ref=wellarchitected) 
+  [Amazon Redshift Spectrum 最佳实践 ](https://aws.amazon.com/blogs/big-data/10-best-practices-for-amazon-redshift-spectrum/?ref=wellarchitected) 
+  [Amazon DynamoDB 最佳实践](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BestPractices.html?ref=wellarchitected) 

 

 **相关视频：** 
+  [AWS 专用数据库（DAT209-L） ](https://www.youtube.com/watch?v=q81TVuV5u28)
+ [Amazon Aurora 存储揭秘：工作原理（DAT309-R） ](https://www.youtube.com/watch?v=uaQEGLKtw54) 
+  [Amazon DynamoDB 深入研究：高级设计模式 (DAT403-R1) ](https://www.youtube.com/watch?v=6yqfmXiZTlM)

 **相关示例：** 
+  [Amazon DynamoDB 示例](https://github.com/aws-samples/aws-dynamodb-examples) 
+  [AWS 数据库迁移示例](https://github.com/aws-samples/aws-database-migration-samples) 
+  [数据库现代化研讨会](https://github.com/aws-samples/amazon-rds-purpose-built-workshop) 
+  [使用 Amazon RDS for Postgress DB 上的参数](https://github.com/awsdocs/amazon-rds-user-guide/blob/main/doc_source/Appendix.PostgreSQL.CommonDBATasks.Parameters.md) 