

# PERF04-BP01 了解数据特征
<a name="perf_right_database_solution_understand_char"></a>

 选择数据管理解决方案，以最佳地匹配工作负载数据集的特征、访问模式和要求。在选择和实施数据管理解决方案时，您必须确保查询、扩展和存储特征支持工作负载数据要求。了解各种数据库选项如何匹配您的数据模型，以及哪些配置选项最适合您的使用案例。  

 AWS 提供了多种数据库引擎，包括关系、键值、文档、内存、图形、时间序列和分类账数据库。每种数据管理解决方案都有可供您使用的选项和配置，以支持您的使用案例和数据模型。根据数据特征，您的工作负载也许能够使用多种不同的数据库解决方案。通过选择针对特定问题的最佳数据库解决方案，您可以摆脱整体式数据库的束缚（整体式数据库采用具有限制性的一刀切方法），专注于管理数据以满足客户的需求。 

 **期望结果：** 工作负载数据特征的记录足够详细，可以帮助选择和配置支持的数据库解决方案，并深入了解潜在的替代方案。 

 **常见反模式：** 
+  没有考虑将大型数据集分割成具有相似特征的较小数据集合的方法，导致失去使用更符合数据和增长特征的专用数据库的机会。 
+  没有预先识别数据访问模式，导致以后进行成本高昂且复杂的重复工作。 
+  使用的数据存储策略无法按需求快速扩展，限制了增长 
+  为所有工作负载选择一个数据库类型和供应商。 
+  由于员工拥有某种特定类型的数据库解决方案的经验和知识，坚持使用该数据库解决方案。 
+  保持一种数据库解决方案，因为它在本地环境中运行良好。 

 **建立此最佳实践的好处：** 熟悉所有的 AWS 数据库解决方案，以便为各种工作负载确定正确的数据库解决方案。为您的工作负载选择合适的数据库解决方案后，您可以快速试用每种数据库产品/服务，以确定它们是否继续满足您的工作负载需求。 

 **未建立这种最佳实践的情况下暴露的风险等级：** 高 
+  可能无法确定潜在的成本节约机会。 
+  数据的保护级别可能达不到要求。 
+  数据访问和存储性能可能不是最佳的。 

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

 定义工作负载的数据特征和访问模式。查看所有可用的数据库解决方案，以确定哪种解决方案支持您的数据需求。对于给定的工作负载，可以选择多个数据库。评估每个服务或每组服务，并单独进行评估。如果为部分或全部数据确定了潜在的替代数据管理解决方案，那么可以试用替代实施方案，以获得成本、安全性、性能和可靠性方面的好处。如采用新的数据管理方法，需要更新现有文档。 


|  **类型**  |  **AWS 服务**  |  **主要特征**  |  **常见使用案例**  | 
| --- | --- | --- | --- | 
|  关系  |  Amazon RDS、Amazon Aurora  |  参照完整性、ACID 事务、写时模式  |  ERP、CRM、商用现货软件  | 
|  键值  |  Amazon DynamoDB  |  高吞吐量、低延迟、近乎无限的可扩展性  |  购物车（电子商务）、产品目录、聊天应用程序  | 
|  文档  |  Amazon DocumentDB  |  存储 JSON 文档并查询任何属性  |  内容管理（CMS）、客户资料、移动应用程序  | 
|  内存  |  Amazon ElastiCache、Amazon MemoryDB  |  微秒级延迟  |  缓存、游戏排行榜  | 
|  图形  |  Amazon Neptune  |  高度相关的数据，其数据之间的关系具有意义  |  社交网络、个性化引擎、欺诈检测  | 
|  时间序列  |  Amazon Timestream  |  以时间为主维度的数据  |  DevOps、IoT、监控  | 
|  宽列  |  Amazon Keyspaces  |  Cassandra 工作负载。  |  工业设备维护、路线优化  | 
|  分类账  |  Amazon QLDB  |  不可变且可加密验证的变更分类账  |  记录系统、医疗保健、供应链、金融机构  | 

 **实施步骤** 

1.  数据结构如何？（例如，非结构化、键值、半结构化、关系型） 

   1.  如果数据是非结构化的，请考虑使用对象存储，例如 [Amazon S3](https://aws.amazon.com/products/storage/data-lake-storage/) 或 NoSQL 数据库，如 [Amazon DocumentDB。](https://aws.amazon.com/documentdb/) 

   1.  对于键值数据，请考虑使用 [DynamoDB](https://aws.amazon.com/documentdb/)、 [ElastiCache for Redis](https://aws.amazon.com/elasticache/redis/) 或者 [MemoryDB。](https://aws.amazon.com/memorydb/) 

   1.  如果数据具有关系结构，那么需要什么级别的参照完整性？ 

      1.  对于外键约束，关系数据库（如 [Amazon RDS](https://aws.amazon.com/rds/) 和 [Aurora](https://aws.amazon.com/rds/aurora/) ）可以提供这种级别的完整性。 

      1.  通常，在 NoSQL 数据模型中，您可以将数据去规范化到单个文档或文档集合，以便在单个请求中进行检索，而不是跨各文档或各表联接。  

1.  是否要求符合 ACID（原子性、一致性、隔离性、持久性）？ 

   1.  如果需要与关系数据库关联的 ACID 属性，请考虑使用关系数据库，例如 [Amazon RDS](https://aws.amazon.com/rds/) 和 [Aurora。](https://aws.amazon.com/rds/aurora/) 

1.  需要什么样的一致性模型？ 

   1.  如果您的应用程序可以容许最终一致性，请考虑使用 NoSQL 实施。查看其他特征，以帮助选择最合适的 [NoSQL 数据库](https://aws.amazon.com/nosql/) 。 

   1.  如果需要强一致性，您可以使用 [DynamoDB](https://aws.amazon.com/documentdb/) 强一致性读取，或者使用关系数据库，如 [Amazon RDS](https://aws.amazon.com/rds/)。 

1.  必须支持哪些查询和结果格式？（例如，SQL、CSV、Parque、Avro、JSON 等） 

1.  存在哪些数据类型、字段大小和总体数量？（例如，文本、数字、空间、时间序列计算、二进制或 BLOB、文档） 

1.  存储需求将如何随时间变化？ 这对可扩展性有何影响？ 

   1.  无服务器数据库（如 [DynamoDB](https://aws.amazon.com/documentdb/) 和 [Amazon Quantum Ledger Database](https://aws.amazon.com/qldb/) ）将动态扩展至近乎无限的存储空间。 

   1.  关系数据库的预置存储空间设有上限，一旦达到这些限制，通常必须通过分片等机制进行水平分区。 

1.  读查询与写查询的比例是多少？ 缓存有可能提高性能吗？ 

   1.  包含大量读操作的工作负载可以受益于缓存层，如 [ElastiCache](https://aws.amazon.com/elasticache/) 或者 [DAX](https://aws.amazon.com/dynamodb/dax/) （如果数据库是 DynamoDB）。 

   1.  读操作也可以通过关系数据库（如 [Amazon RDS](https://aws.amazon.com/rds/)）分流到只读副本上。 

1.  存储和修改（OLTP – Online Transaction Processing，联机事务处理）还是检索和报告（OLAP – Online Analytical Processing，联机分析处理）具有更高的优先级？ 

   1.  对于高吞吐量事务处理，请考虑使用 NoSQL 数据库，如 DynamoDB 或 Amazon DocumentDB。 

   1.  对于分析查询，请考虑使用列存数据库（如 [Amazon Redshift](https://aws.amazon.com/redshift/) ），或者将数据导出到 Amazon S3 并使用 [Athena](https://aws.amazon.com/athena/) 或者 [QuickSight 执行分析。](https://aws.amazon.com/quicksight/) 

1.  这些数据有多敏感，需要什么级别的保护和加密？ 

   1.  所有的 Amazon RDS 和 Aurora 引擎都支持使用 AWS KMS 进行静态数据加密。Microsoft SQL Server 和 Oracle 在使用 Amazon RDS 时也支持本机透明数据加密（TDE，Transparent Data Encryption）。 

   1.  对于 DynamoDB，您可以使用 [IAM](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html) 的精细访问控制功能，在关键字级别控制谁可以访问哪些数据。 

1.  数据需要什么级别的持久性？ 

   1.  Aurora 自动在一个区域内的三个可用区复制您的数据，这意味着您的数据具有高度的持久性，数据丢失的可能性较小。 

   1.  DynamoDB 自动跨多个可用区复制，提供高可用性和数据持久性。 

   1.  Amazon S3 提供 11 个 9 的持久性。许多数据库服务（如 Amazon RDS 和 DynamoDB）支持将数据导出到 Amazon S3 以进行长期保留和归档。 

1.  恢复 [时间目标（RTO）或恢复点目标（RPO）](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/plan-for-disaster-recovery-dr.html) 要求是否影响解决方案？ 

   1.  Amazon RDS、Aurora、DynamoDB、Amazon DocumentDB 和 Neptune 全部支持时间点恢复以及按需备份和还原。  

   1.  对于高可用性要求，可以全局复制 DynamoDB 表（使用 [全局表](https://aws.amazon.com/dynamodb/global-tables/) 功能），并且可以使用全局数据库功能跨多个区域复制 Aurora 集群。此外，可以使用跨区域复制功能，跨 AWS 区域复制 S3 存储桶。  

1.  是否希望摆脱商用数据库引擎/许可成本？ 

   1.  考虑使用 Amazon RDS 或 Aurora 上的开源引擎，如 PostgreSQL 和 MySQL 

   1.  利用 [AWS DMS](https://aws.amazon.com/dms/) 和 [AWS SCT](https://aws.amazon.com/dms/schema-conversion-tool/) 执行从商用数据库引擎到开源引擎的迁移 

1.  对数据库的运维有什么期望？ 迁移到托管服务是主要的关注点吗？ 

   1.  利用 Amazon RDS 而不是 Amazon EC2，以及利用 DynamoDB 或 Amazon DocumentDB 而不是自行托管的 NoSQL 数据库可以减少运维开销。 

1.  当前如何访问数据库？ 是只有应用程序访问，还是有商业智能（BI，Business Intelligence）用户和其他互联的现成应用程序？ 

   1.  如果您依赖于外部工具，那么您可能必须保持与它们支持的数据库的兼容性。Amazon RDS 完全兼容其支持的不同引擎版本，包括 Microsoft SQL Server、Oracle、MySQL 和 PostgreSQL。 

1.  下面列出了潜在的数据管理服务，以及这些服务的最佳使用位置： 

   1.  关系数据库通过预定义 schema 及其之间的关系存储数据。这些数据库旨在支持 ACID（原子性、一致性、隔离性、持久性）事务，并保持参照完整性和数据强一致性。许多传统应用程序、企业资源规划（ERP, enterprise resource planning）、客户关系管理（CRM, customer relationship management）和电子商务都使用关系数据库来存储其数据。您可以在 Amazon EC2 上运行许多这些数据库引擎，或者从以下 AWS [托管数据库服务中进行选择](https://aws.amazon.com/products/databases/)： [Amazon Aurora](https://aws.amazon.com/rds/aurora)， [Amazon RDS](https://aws.amazon.com/rds)和 [Amazon Redshift](https://aws.amazon.com/redshift). 

   1.  键值数据库已针对常见的访问模式进行优化，通常用于存储和检索大量数据。这些数据库即使在出现大量并发请求的情况下也能实现快速响应。键值数据库的典型使用案例包括高流量 Web 应用程序，电子商务系统和游戏应用程序。在 AWS 中，您可以利用 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)数据库，这是一个完全托管的多区域、多主表持久数据库，具有适用于互联网规模的应用程序的内置安全性、备份和还原以及内存中的缓存。 

   1.  内存数据库用于需要实时访问数据、最低延迟和最高吞吐量的应用程序。对于毫秒级延迟不足以满足需求的应用程序，这些数据库通过直接将数据存储在内存中来提供微秒级延迟。您可以将内存数据库用于应用程序缓存、会话管理、游戏排行榜和地理空间应用程序。 [Amazon ElastiCache](https://aws.amazon.com/elasticache/) 是一种完全托管的内存数据存储，兼容 [Redis](https://aws.amazon.com/elasticache/redis/) 或者 [Memcached](https://aws.amazon.com/elasticache/memcached)。如果应用程序还有更高的持久性要求，可以结合 [适用于 Redis 的 Amazon MemoryDB](https://aws.amazon.com/memorydb/) 来提供持久的内存数据库服务，以实现超快的性能。 

   1.  文档数据库旨在将半结构化数据存储为类似 JSON 的文档。这些数据库可帮助开发人员快速构建和更新应用程序，例如内容管理、目录和用户配置文件。 [Amazon DocumentDB](https://aws.amazon.com/documentdb/) 是一种快速、可扩展、高度可用且完全托管的文档数据库服务，支持 MongoDB 工作负载。 

   1.  宽列存储是 NoSQL 数据库的一种类型。它使用表、行和列，但是与关系数据库不同的是，同一个表中各行的列名称和格式可能会有所不同。您通常会看到一个宽列存储在大规模工业应用程序中，用于设备维护、队列管理和路线优化。 [Amazon Keyspaces（Apache Cassandra 兼容）](https://aws.amazon.com/mcs/) 是一种宽列可扩展、高度可用且兼容 Apache Cassandra 的托管数据库服务。 

   1.  图形数据库适用于需要大规模以毫秒延迟在高度连接的图形数据集之间浏览和查询数百万关系的应用程序。许多公司将图形数据库用于欺诈检测、社交网络和推荐引擎。 [Amazon Neptune](https://aws.amazon.com/neptune/) 是一种快速、可靠、完全托管的图数据库服务，便于用户能轻松构建并运行适用于高度互连数据集的应用程序。 

   1.  时间序列数据库可以高效收集、合成数据，并从不断变化的数据中获得见解。IoT 应用程序、开发运营和工业遥测可以利用时间序列数据库。 [Amazon Timestream](https://aws.amazon.com/timestream/) 是适用于 IoT 和运营应用程序的快速、可扩展、完全托管的时间序列数据库服务，可用于轻松存储和分析每天数以万亿计的事件。 

   1.  分类账数据库提供可信中央机构，以维护每个应用程序的可扩展、不可变和允许以加密方式进行验证的交易记录。我们看到分类账数据库用于记录系统、供应链、注册甚至银行交易。 [Amazon Quantum Ledger Database (Amazon QLDB)](https://aws.amazon.com/qldb/) 是一种完全托管的分类账数据库，提供可信中央机构拥有的透明、不可变和允许以加密方式进行验证的交易日志。Amazon QLDB 跟踪每个应用程序数据更改，并持续维护完整且可验证的更改历史记录。 

 **实施计划的工作量级别： **如果工作负载从一种数据库解决方案转移到另一种计算解决方案，则重构数据和应用程序可能需要 *高* 工作量。   

## 资源
<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) 
+  [在 EC2 和 Amazon RDS 之间进行选择](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-sql-server/comparison.html) 
+  [实施 Amazon ElastiCache 的最佳实践](https://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/BestPractices.html) 

 **相关视频：** 
+ [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 Redshift 数据共享优化数据模式](https://wellarchitectedlabs.com/sustainability/300_labs/300_optimize_data_pattern_using_redshift_data_sharing/) 
+  [数据库迁移](https://github.com/aws-samples/aws-database-migration-samples) 
+  [MS SQL Server – AWS Database Migration Service（DMS）复制演示](https://github.com/aws-samples/aws-dms-sql-server) 
+  [数据库现代化动手实践研讨会](https://github.com/aws-samples/amazon-rds-purpose-built-workshop) 
+  [Amazon Neptune 示例](https://github.com/aws-samples/amazon-neptune-samples) 