一、介绍
1、简介
Amazon DynamoDB 是由 AWS 提供的一种完全托管的 NoSQL 数据库服务,适用于高性能、可扩展的应用程序。它设计用于处理大规模的数据存储和高速数据访问,广泛应用于需要低延迟、高吞吐量的场景,如移动应用、电商、游戏后端、IoT(物联网)和社交媒体等。此外还可以使用 AWS 管理控制台来监控资源使用情况和各种性能指标。
2、特点
-
高可扩展性: DynamoDB 能够自动扩展以处理大规模的数据和高并发的请求。它通过分区技术在多个服务器上自动分配数据,确保随着数据增长,性能不会下降。
-
低延迟和高吞吐量: DynamoDB 提供毫秒级响应时间,支持数百万请求每秒,适用于需要低延迟和高并发的场景。
-
完全托管: 用户无需管理硬件、数据库的安装、配置和维护等,AWS 会自动管理 DynamoDB 实例的运行、扩展、备份和恢复。
-
无服务器架构: DynamoDB 支持无服务器(Serverless)模式,意味着用户不需要管理服务器的数量或规模,可以根据需要自动调整容量。
-
多区域复制: DynamoDB 支持跨多个 AWS 区域复制,确保数据高可用和灾难恢复能力。
-
灵活的数据模型: DynamoDB 是一个键值和文档存储数据库,可以根据业务需求选择适当的模式。它支持单表设计,并通过索引和查询操作提高数据检索的效率。
-
强一致性与最终一致性: DynamoDB 支持强一致性读取和最终一致性读取两种模式。强一致性读取返回的结果是最新的,而最终一致性读取可能会稍微滞后,但可以提高吞吐量。
3、使用 DynamoDB 的场景
(1)高并发应用:如社交媒体平台、移动应用后端、实时分析等。
(2)快速增长的应用:如物联网设备数据存储、电商网站用户行为跟踪等。
(3)需要低延迟的应用:如金融服务、广告实时竞价系统、游戏排行榜等。
4、主要优点
- 管理简单:无需手动配置数据库实例或进行硬件扩展,AWS 负责底层管理。
- 高可用性:自动跨多个区域复制数据,避免单点故障。
- 灵活扩展:支持处理大规模流量,适应需求变化。
5、主要限制
- 查询功能有限:相比关系型数据库,DynamoDB 在复杂查询和联接操作上的能力有限。通常需要依赖设计好的索引和查询模式。
- 成本:根据表的规模和访问模式,DynamoDB 的费用可能会根据读取、写入、存储和索引等项产生较高费用,特别是大规模操作时需要注意成本控制。
6、官方文档
DynamoDB 入门 - Amazon DynamoDB
7、dynamo local
dynamo是aws完全托管的,无需安装任何服务,即可可以在aws控制台上建表。
为了方便开发和测试,Amazon还提供了DynamoDB Local,这是一种轻量级的版本,可以在本地机器上运行,所以需要手动下载和安装。
二、关键概念
1、表(Table)
DynamoDB中的数据是存储在表中的。每个表都需要一个主键来唯一标识记录。主键由两个部分组成:
(1)分区键(Partition Key):表中的每个项目都有一个分区键,决定了数据存储的位置。
(2)复合主键(Partition Key + Sort Key):允许对数据进行排序的键,复合主键使得每个分区可以存储多个项目。
2、项目(Item)
表中的一条记录是一个项目,类似于传统数据库中的一行。项目由多个属性(字段)组成。
3、属性(Attribute)
每个项目都有一个或多个属性,类似于数据库中的列。属性的类型可以是基本数据类型,如字符串、数字、布尔值,也可以是嵌套的数据结构,如列表和映射。
4、索引(Index)
DynamoDB 提供了两种类型的索引:
(1)全局二级索引(GSI):可以根据不同的属性进行查询,支持强一致性或最终一致性读取。
(2)本地二级索引(LSI):与主表的分区键相同,但支持不同的排序键。
5、主键
在 Amazon DynamoDB 中,每个表必须有主键 (Primary Key),这也是 DynamoDB 表结构的核心要求。主键用于唯一标识表中的每个项目,并决定如何将数据分布到不同的分区。主键由两种类型组成:分区键 (Partition Key,也叫Hash Key) 和 排序键 (Sort Key,也叫Range Key)。这两者可以用来定义数据的存储方式。
(1)Partition Key /Hash Key
是 DynamoDB 主键的一部分,负责将数据分布到不同的物理分区。根据分区键的值,DynamoDB 会使用哈希函数计算分区存储位置。如果你只定义了分区键,则数据表的主键是 单一分区键。每个分区键值都对应一个分区,其中存储着该键值下的所有数据项。
使用排序键,你可以执行类似范围查询、排序查询等操作。例如,你可以查找某个分区键值下,所有排序键在某个范围内的数据项。
如在一个订单表中,UserId
可以作为分区键,而OrderDate
作为排序键。这样可以让同一个用户(分区键相同)拥有多个订单(排序键不相同)。
(2)Range Key / Sort Key
是可选的,用来进一步细分存储在同一分区下的项目。它允许在同一个分区键值下存储多项数据,并按照排序键的值进行排序。
DynamoDB 主键类型总结
单分区键:
只有一个分区键,适用于数据量较小的情况(可以确保唯一性)。
分区键 + 排序键组合:
一个分区键+一个排序键,注意排序键也最多只能有一个。适用于数据量较大、需要按排序键进行操作的情况。
6、流(Streams)
DynamoDB Streams 可以记录表的数据变更,支持应用程序监听这些变更并执行相应操作。
7、容量单位(Capacity Units)
DynamoDB 的吞吐量是基于容量单位来计算的。用户可以选择按预置容量模式(Provisioned Mode)或者按需容量模式(On-Demand Mode)计费:
(1)预置容量模式:事先设定表的吞吐量(读取和写入请求),适合预测负载的应用。
(2)按需容量模式:DynamoDB 根据实际负载动态调整吞吐量,适合负载波动较大的应用。
8、自动备份和恢复
DynamoDB 提供了自动备份、点-in-time 恢复(PITR),确保数据的持久性和恢复能力。
三、数据类型
在 Amazon DynamoDB 中,数据类型的表示方式与传统关系型数据库有所不同。DynamoDB 支持多种基本数据类型,以及一些复合数据类型,用于存储复杂的数据结构。通过使用 AWS SDK 或 DynamoDB Mapper,你可以在应用程序中更容易地映射这些类型。
以下是 DynamoDB 中常见的几种数据类型,以及如何在 DynamoDB 表中表示它们:
1、String (S)
用于表示文本数据。
// 表示 String 类型
@DynamoDBAttribute
private String name;
2、Number (N)
用于表示整数或浮动小数(双精度浮动数)。DynamoDB 将其存储为字符串格式,但它可以作为数字进行处理。
3、Binary (B)
用于存储二进制数据,如文件、加密密钥或图片。
// 表示 Binary 类型
@DynamoDBAttribute
private Byte[] fileData;
4、Boolean (BOOL)
用于表示 true
或 false
布尔值。
5、Null (NULL)
表示空值(没有值)。如果某个属性没有被设置,可以将其设置为 NULL
。
// 表示 Null 类型
@DynamoDBAttribute
private String address; // 如果 address 没有值,可以设置为 NULL
6、List (L)
用于表示一个有序的元素列表,可以包含多个不同类型的元素。
// 表示 List 类型
@DynamoDBAttribute
private List<String> tags;
7、Map (M)
用于表示一个由键值对组成的哈希映射,可以嵌套其他类型的集合。
// 表示 Map 类型
@DynamoDBAttribute
private Map<String, String> metadata;
8、Set (SS, NS, BS)
- SS:String Set,用于表示一个字符串集合。
- NS:Number Set,用于表示一个数字集合。
- BS:Binary Set,用于表示一个二进制数据集合。
// 表示 String Set 类型
@DynamoDBAttribute
private Set<String> interests;
// 表示 Number Set 类型
@DynamoDBAttribute
private Set<Double> ratings;
// 表示 Binary Set 类型
@DynamoDBAttribute
private Set<Byte[]> binaryData;
9、日期与时间
DynamoDB 并没有内建的日期时间类型,但可以使用 String 或 Number 类型来存储日期和时间。常见的做法是使用 ISO 8601 格式的字符串来表示日期(例如:"2024-11-14T00:00:00Z"
)或 Unix 时间戳(自 1970 年 1 月 1 日以来的秒数)。
// 日期存储为 ISO 8601 格式的 String
@DynamoDBAttribute
private String createdAt;
// 日期存储为 Unix 时间戳(秒数)
@DynamoDBAttribute
private Long timestamp;
四、和mongodb的区别
Amazon DynamoDB 和 MongoDB 都是流行的 NoSQL 数据库,但它们在设计理念、架构、功能、用途等方面有一些显著的区别。以下是 DynamoDB 和 MongoDB 之间的主要区别:
1. 类型和架构
- DynamoDB:
- 类型:完全托管的键值存储(Key-Value Store)和文档数据库(Document Store)。
- 架构:DynamoDB 是一个分布式数据库,完全由 Amazon Web Services (AWS) 提供管理。它是一个托管服务,支持自动扩展和自动分区,以应对大规模的读取和写入负载。
- 数据模型:数据存储在表(Table)中,表由 分区键(Partition Key) 和可选的 排序键(Sort Key) 组成,支持简单的键值访问(Hash Key + Range Key)。此外,它还支持全局二级索引(GSI)和本地二级索引(LSI)。
- MongoDB:
- 类型:文档数据库(Document Store)。
- 架构:MongoDB 是一个开源的、分布式的数据库,通常需要自行管理部署。虽然有托管版本(如 MongoDB Atlas),但它也可以自托管和配置。
- 数据模型:MongoDB 将数据存储为 BSON 格式的文档,文档类似于 JSON 格式。它允许具有嵌套结构的复杂文档,并且字段可以动态变化,不需要提前定义模式(Schema-less)。
2. 数据模型与查询语言
-
DynamoDB:
- 数据模型:基于键值存储和表的结构,主键包括 分区键(HashKey) 和可选的 排序键(RangeKey)。它支持存储非结构化数据,但通常不提供传统的 SQL 查询能力。
- 查询语言:DynamoDB 使用其特定的查询 API,主要基于 Key-Value 存取方式,可以进行简单的查询、扫描、分页操作。支持通过二级索引(GSI、LSI)来扩展查询功能。
- 限制:对于复杂的多表联合查询、聚合操作等,DynamoDB 的查询能力相对有限。
-
MongoDB:
- 数据模型:数据以 JSON 类似的 BSON 文档形式存储,具有更高的灵活性,可以存储复杂的嵌套数据。每个文档可以有不同的字段和结构,非常适合处理不规则和半结构化数据。
- 查询语言:MongoDB 提供强大的查询语言,支持多种操作(如查找、聚合、排序、分组等),并且支持表达式、条件查询、范围查询和文本搜索等。
- 灵活性:由于其模式自由的特性,MongoDB 适合需要快速开发、频繁变更数据结构的场景。
3. 性能和扩展
- DynamoDB:
- 性能:DynamoDB 以自动分区和分布式的方式来提供可扩展性。它支持自动的横向扩展,随着数据量和请求量的增加,AWS 会自动分配更多的资源。通过 Provisioned(预配置)和 On-Demand(按需)两种容量模式来进行管理。
- 扩展性:DynamoDB 提供自动扩展和负载均衡,几乎不需要手动管理。它能够在 AWS 全球范围内自动扩展,适合大规模、高吞吐量的工作负载。
- MongoDB:
- 性能:MongoDB 同样支持分布式架构,支持水平扩展(Sharding)。你可以通过增加更多节点来提高性能。
- 扩展性:虽然 MongoDB 支持分片和集群,但它需要用户手动配置和管理(特别是当处理大规模数据时)。MongoDB 在扩展性上需要更多的运维管理。
4. 一致性和可用性
-
DynamoDB:
- 一致性:DynamoDB 提供 强一致性 和 最终一致性 两种读取选项。强一致性保证读取到的数据是最新的,而最终一致性则允许更高的吞吐量,但可能返回过时的数据。
- 高可用性:DynamoDB 是一个高可用的服务,通过在多个 AWS 区域和可用区之间自动复制数据来实现高可用性。它的 SLA 保证了 99.99% 的可用性。
-
MongoDB:
- 一致性:MongoDB 支持 强一致性 和 最终一致性,根据配置,可以控制读写操作的副本集(Replica Set)的行为。通过选择副本集读写策略,可以决定是否读取到最新的写入数据。
- 高可用性:MongoDB 通过副本集(Replica Set)提供高可用性,并支持自动故障转移和复制。副本集可以在多个节点间进行数据复制,确保数据的高可用性。
5. 管理和运维
-
DynamoDB:
- 管理:DynamoDB 是一个 完全托管 的服务,不需要用户管理服务器或底层基础设施。AWS 会自动处理备份、恢复、扩展、分区等问题。
- 备份与恢复:提供自动备份、定期快照和时间点恢复(Point-in-Time Recovery)功能,简化了数据的备份和恢复。
-
MongoDB:
- 管理:MongoDB 可以自托管,也可以通过 MongoDB Atlas 进行托管。自托管版本需要你自己管理数据库的扩展、备份、监控和维护工作。
- 备份与恢复:MongoDB 也提供备份和恢复功能,但需要更多的配置和管理,尤其是在自托管环境中。
6. 成本
-
DynamoDB:
- 计费模型:DynamoDB 按请求计费,包括读取、写入、存储和流量。你可以选择按需(On-Demand)计费模式,也可以选择按预配置的吞吐量计费(Provisioned)。
- 自动扩展:DynamoDB 的自动扩展可能会根据流量波动导致费用的波动,因此需要对成本进行监控。
-
MongoDB:
- 计费模型:MongoDB 在自托管模式下不收取许可费用,但需要自行管理硬件和基础设施。如果使用 MongoDB Atlas,则按实例的大小、存储、备份、流量等收费。
- 灵活性:MongoDB 在自托管环境中,可以通过优化资源使用来降低成本,但管理和维护的负担较重。
7. 使用场景
-
DynamoDB:
- 适合高吞吐量、低延迟和全托管的应用场景,如 实时数据分析、物联网(IoT)、移动应用后端、游戏数据存储 等。
- 适合需要 自动扩展 和 高可用性 的工作负载,尤其是在 AWS 云环境中。
-
MongoDB:
- 适合需要复杂查询、聚合操作和灵活数据模型的应用场景,如 内容管理系统(CMS)、日志分析、社交网络平台、电子商务平台 等。
- 适合 开发快速原型 和频繁更改数据结构的应用。
总结
特性 | DynamoDB | MongoDB |
---|---|---|
类型 | 键值存储、文档存储 | 文档存储 |
数据模型 | 表格,分区键 + 排序键 + 属性 | BSON 文档,支持嵌套结构 |
查询语言 | 基于键值的查询,支持简单查询和二级索引 | 强大的查询语言,支持复杂查询、聚合等 |
管理 | 完全托管服务,自动扩展和分区 | 自托管或通过 Atlas 托管,手动扩展 |
一致性 | 强一致性、最终一致性 | 强一致性、最终一致性,副本集控制 |
性能与扩展 | 自动扩展,高吞吐量,适合大规模应用 | 支持水平扩展和分片,适合复杂查询和大数据工作负载 |
高可用性 | 自动高可用,自动跨可用区复制数据 | 副本集支持高可用性和自动故障转移 |
成本 | 按请求计费,按吞吐量和存储计费 |
五、和ES的区别
Amazon DynamoDB 和 Elasticsearch (ES) 都是非常流行的 NoSQL 数据存储系统,但它们在设计理念、用途、架构、功能等方面有一些显著的区别。以下是 DynamoDB 和 Elasticsearch 之间的主要区别:
1. 基本类型和目标
-
DynamoDB:
- 类型:分布式的 键值存储 和 文档数据库(Key-Value Store 和 Document Store)。
- 目标:DynamoDB 旨在提供一个高可扩展性、低延迟、高吞吐量的数据库服务,适合存储和快速访问大量结构化数据。它通常用于需要低延迟、高吞吐量的实时应用场景,比如用户数据存储、会话管理、物联网数据存储等。
-
Elasticsearch (ES):
- 类型:分布式的 搜索引擎 和 全文搜索数据库(Full-Text Search Engine)。
- 目标:Elasticsearch 是基于 Lucene 的搜索引擎,专为处理大规模的、复杂的 全文搜索 和 数据分析 场景设计。它非常适合于需要快速、强大搜索和分析功能的应用,如日志分析、产品搜索、文档搜索、日志监控等。
2. 数据模型和结构
-
DynamoDB:
- 数据模型:基于表(Table)、行(Item)、列(Attribute)的模型。每个表都有一个 主键(由分区键和可选的排序键组成)。数据是结构化的,字段值可以是基本数据类型(如字符串、数字、布尔值)或嵌套类型(如列表、映射)。
- 访问模式:通过主键(Partition Key 和可选的 Sort Key)进行直接的 键值查询。它支持 二级索引(GSI 和 LSI)以扩展查询功能。
-
Elasticsearch (ES):
- 数据模型:基于 索引、文档 和 字段。每个文档是一个 JSON 格式的对象,并存储在索引中。文档可以包含复杂的嵌套结构,如数组和对象,支持强大的查询功能。
- 访问模式:基于 全文搜索 和 查询 DSL(Domain Specific Language)进行复杂查询,支持全文索引、过滤、聚合等。
3. 查询语言和查询能力
-
DynamoDB:
- 查询语言:DynamoDB 使用 AWS SDK 或 DynamoDB API 来执行 CRUD 操作。查询是基于主键或通过 全表扫描 进行的。它也支持通过 二级索引 来进行更灵活的查询,但查询能力相对简单,主要支持按 分区键 和 排序键 查询。
- 限制:DynamoDB 支持的查询类型有限,不能像传统的关系型数据库那样进行复杂的联接、聚合和排序。对于需要复杂查询、排序和聚合的场景,DynamoDB 有一定的限制。
-
Elasticsearch (ES):
- 查询语言:Elasticsearch 使用 Elasticsearch Query DSL,一种强大的查询语言,支持全文搜索、布尔查询、过滤器、范围查询、模糊查询、聚合等。它提供了丰富的查询能力,适合处理复杂的文本和分析查询。
- 优势:ES 具有高效的全文搜索和 全文索引 能力,适合进行复杂的搜索、分析、排序、聚合等操作。它还支持 近似匹配 和 模糊搜索,对于日志分析和搜索引擎应用非常强大。
4. 性能和扩展性
-
DynamoDB:
- 性能:DynamoDB 提供了 低延迟、高吞吐量 的数据存储解决方案。它具有自动横向扩展的能力,能够根据流量自动调整容量。
- 扩展性:DynamoDB 是 完全托管的,AWS 会自动管理底层硬件资源并根据流量自动扩展。用户只需关心请求和存储的容量,DynamoDB 可以处理大规模的数据存储和高并发的读写请求。
- 自动化:它自动进行分区管理,自动复制到多个可用区(Availability Zones),确保高可用性。
-
Elasticsearch (ES):
- 性能:Elasticsearch 是为 全文搜索 和 分析 优化的,能够快速进行高效的索引和查询操作。ES 的查询速度非常快,尤其是在处理大量文本数据和复杂的查询时。
- 扩展性:Elasticsearch 支持 水平扩展(Sharding),用户可以根据数据量和查询需求调整集群规模。可以通过增加节点来水平扩展集群。ES 的性能在集群化部署时表现更好。
- 自动化:虽然 ES 也支持自动扩展,但在大规模部署时需要更多的配置和管理。使用 Elasticsearch Service(例如 Elastic Cloud 或 Amazon Elasticsearch Service)时,AWS 也会提供托管服务。
5. 一致性和可用性
-
DynamoDB:
- 一致性:DynamoDB 支持 强一致性 和 最终一致性 的读操作。强一致性确保读取到的数据是最新的,而最终一致性允许更高的吞吐量和可用性,但可能会读取到稍微过时的数据。
- 高可用性:DynamoDB 在多个可用区中自动复制数据,确保 高可用性 和 容错性。在 AWS 上运行的 DynamoDB 提供了 99.99% 的可用性 SLA。
-
Elasticsearch (ES):
- 一致性:Elasticsearch 采用 最终一致性 模型,特别是在分布式集群中的写操作。它通过副本分片来提供高可用性,但读操作的最终一致性意味着数据的更新可能在所有节点之间传播有所延迟。
- 高可用性:Elasticsearch 提供 副本集(Replicas)和 分片(Shards)机制,通过复制数据到不同节点上来实现高可用性和容错。它支持自动故障转移,确保集群的高可用性。
6. 用途
-
DynamoDB:
- 适合用于 低延迟、高吞吐量 的应用程序,如 实时数据处理、物联网(IoT) 数据存储、会话存储、用户管理系统、购物车管理、数据存储与访问 等。
- 用于存储结构化数据,尤其是主键查询性能要求高的场景。
-
Elasticsearch (ES):
- 主要用于 全文搜索 和 日志分析,常见应用包括 搜索引擎、日志聚合与分析、电子商务搜索、文档管理系统、社交媒体分析 等。
- 适用于需要 复杂查询、全文搜索、聚合分析 的场景,尤其在处理海量日志数据、文本数据分析时非常强大。
7. 成本
-
DynamoDB:
- 计费模型:DynamoDB 按请求容量(读写操作)和存储容量收费,也提供按需计费模式。在高流量、需要高吞吐量的场景中,成本可能会较高。
- 自动扩展:自动扩展的能力虽然提供了极大的便利,但在使用上需要精确控制读写操作,避免不必要的浪费。
-
Elasticsearch (ES):
- 计费模型:Elasticsearch 的费用通常按 节点数、存储容量 和 计算资源(如 CPU、内存)收费。使用 Elasticsearch Service(例如 AWS Elasticsearch Service 或 Elastic Cloud)时,也按资源的消耗来计费。
- 资源管理:Elasticsearch 的性能和成本与集群规模密切相关,需要根据查询负载和数据存储量来调整集群规模。
8. 管理和运维
-
DynamoDB:
- 管理:DynamoDB 是一个 完全托管服务,AWS 负责所有的硬件、自动扩展和故障恢复,用户无需担心底层硬件和运维。
- 备份与恢复:DynamoDB 提供自动备份功能,并且支持 时间点恢复(Point-in-Time Recovery,PITR)。
-
Elasticsearch (ES):
- 管理:Elasticsearch 既可以自托管,也可以使用托管版本(例如 AWS 提供的 Elasticsearch Service)。自托管版本需要更多的资源和精力来管理集群、索引、