简介
Amazon DynamoDB 是一种完全托管式 NoSQL 数据库服务,可提供快速且可预测的性能,能够实现无缝扩展。Amazon DynamoDB 能在足够数量的服务器上自动分布该表的数据和流量,以处理客户指定的请求容量和存储的数据量,同时保持一致、快速的性能。
主要特点:
高可用性和持久性
DynamoDB 自动将表的数据和流量分布到足够数量的服务器上,以处理客户指定的请求容量和存储的数据量,同时保持一致且快速的性能。所有数据项目均存储在固态硬盘 (SSD) 中,并自动复制到某个 AWS 区域的多个可用区,以便提供数据自身的高可用性和数据持久性。可以使用全局表保持 DynamoDB 表在 AWS 区域间同步。
核心组件(表,项目和属性)
-
表 – 类似于其他数据库系统,DynamoDB 将数据存储在表中。表 是数据的集合。
-
项目 – 每个表包含零个或更多个项目。项目 是一组属性,具有不同于所有其他项目的唯一标识。在 People 表中,每个项目表示一位人员。类似于mysql中行的概念
-
属性 – 每个项目包含一个或多个属性。属性 是基础的数据元素,无需进一步分解。相当于mysql数据库中的字段属性概念。
实例表展示:
People { "PersonID": 101, "LastName": "Smith", "FirstName": "Fred", "Phone": "555-4321" } { "PersonID": 102, "LastName": "Jones", "FirstName": "Mary", "Address": { "Street": "123 Main", "City": "Anytown", "State": "OH", "ZIPCode": 12345 } } { "PersonID": 103, "LastName": "Stephens", "FirstName": "Howard", "Address": { "Street": "123 Main", "City": "London", "PostalCode": "ER3 5K8" }, "FavoriteColor": "Blue" } 特点: 1,表中的每个项目都有一个唯一的标识符或主键,用于将项目与表中的所有其他内容区分开来。在 People 表中,其主键就是PersonID。 2,与mysql不同,People 表是无架构的,表中的属性及其数据类型都不需要预先定义。每个项目都能拥有其自己的独特属性。 3,只支持数字和字符串类型,以及对应集合。(集合可以嵌套集合,最多支持32层嵌套)
再来看另一张实例表
Music { "Artist": "No One You Know", "SongTitle": "My Dog Spot", "AlbumTitle": "Hey Now", "Price": 1.98, "Genre": "Country", "CriticRating": 8.4 } { "Artist": "No One You Know", "SongTitle": "Somewhere Down The Road", "AlbumTitle": "Somewhat Famous", "Genre": "Country", "CriticRating": 8.4, "Year": 1984 } { "Artist": "The Acme Band", "SongTitle": "Still in Love", "AlbumTitle": "The Buck Starts Here", "Price": 2.47, "Genre": "Rock", "PromotionInfo": { "RadioStationsPlaying": { "KHCR", "KQBX", "WTNR", "WJJH" }, "TourDates": { "Seattle": "20150622", "Cleveland": "20150630" }, "Rotation": "Heavy" } } { "Artist": "The Acme Band", "SongTitle": "Look Out, World", "AlbumTitle": "The Buck Starts Here", "Price": 0.99, "Genre": "Rock" } 特点: Music 的主键包含两个属性(Artist 和 SongTitle)。表中的每个项目必须具有这两个属性。Artist 和 SongTitle 的属性组合用于将表中的每个项目与所有其他内容区分开来。主键可以是单个也可以是多个.其余特点类似上表
主键
DynamoDB 支持两种不同类型的主键,在创建表时除了表名称外还需要指定表的主键,主键唯一且不同。
-
分区键 – 由一个称为分区键的属性构成,也称简单主键。基于数据项目的分区键值实现跨多个分区的数据项目平均分布。
DynamoDB 使用分区键的值作为内部散列函数的输入。来自散列函数的输出决定了项目将存储到的分区(DynamoDB 内部的物理存储)。
在只有分区键的表中,任何两个项目都不能有相同的分区键值。
上面的 People 表具有简单主键 (PersonID)。
-
分区键和排序键 – 称为复合主键,此类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。排序键,按照排序键值有序地将具有相同分区键的项目存储在互相紧邻的物理位置。
DynamoDB 使用分区键值作为对内部哈希函数的输入。来自散列函数的输出决定了项目将存储到的分区(DynamoDB 内部的物理存储)。具有相同分区键值的所有项目按排序键值的排序顺序存储在一起。
在具有分区键和排序键的表中,多个项目可能具有相同的分区键值。但是,这些项目必须具有不同的排序键值。
上面的 Music 表是具有复合主键(Artist 和 SongTitle)的表示例。
读取一致性
Amazon DynamoDB 从表、本地二级索引(LSI)、全局二级索引(GSI)和流中读取数据。表和 LSI 都提供两个读取一致性选项:最终一致读取(原定设置)和强一致性读取。来自 GSI 和流的所有读取是最终一致的。
当您的应用程序向 DynamoDB 表写入数据并收到 HTTP 200 响应(OK)时,这意味着写入已成功完成并且已持久保持。DynamoDB 提供读取已提交隔离,并确保读取操作始终为项目返回提交的值。读取从不会显示在写入过程中最终未取得成功的项目。读取已提交隔离无法防止在读取操作后立即修改项目。
简单来说类似于mysql数据库中隔离级别:读已提交。当然DynamoDB 做了一定的处理,避免了幻读的可能。
最终一致性读取
最终一致性是所有读取操作的原定设置读取一致性模型。当对 DynamoDB 表或索引发出最终一致读取时,响应可能不会反映最近完成的写入操作的结果。如果在短时间后重复执行读取请求,响应最终将返回最新的项目。
强一致性读取
读取操作(例如 GetItem
、Query
和 Scan
)提供了一个可选 ConsistentRead
参数。如果您将 ConsistentRead
设置为 true,DynamoDB 会返回具有最新数据的响应,从而反映来自之前所有已成功的写入操作的更新。只有表和本地辅助索引才支持强一致性读取。不支持从全局二级索引或 DynamoDB 流进行强一致性读取。
全局表读取一致性
DynamoDB 还支持使用全局表进行多活动和多区域复制。一个全局表由不同 AWS 区域中的多个副本表组成。对任何副本表中的任何项目所做的任何更改都将复制到同一全局表中的所有其他副本,时间通常在一秒钟内,并且最终一致。
特点对照表
特征 | Mysql | DynamoDB |
---|---|---|
连接 | 通过程序与数据库建立的短连接,长连接来访问数据库 | DynamoDB 是一项 Web 服务,与其进行的交互是无状态的。应用程序不需要维护持久性网络连接。相反,与 DynamoDB 的交互是通过 HTTP(S) 请求和响应进行的。 |
身份验证 | 在经过身份验证后才能建立连接,操作数据库 | 对 DynamoDB 发出的每个请求均必须附有一个加密签名,此签名将对特殊请求进行身份验证。AWS SDK 提供了创建签名和签署请求所需的所有逻辑 |
授权 | 数据库自身的权限管理 | 基于AWS的统一权限认证(IAM),进行访问控制 |
发送请求 | 向数据库发送一条SQL,数据库进行语法检查,创建执行计划,执行该SQL | 应用程序将 HTTP(S) 请求发送到 DynamoDB。该请求包含要执行的 DynamoDB 操作的名称和参数。DynamoDB 立即运行请求。 |
接受响应 | 返回指定的sql结构,出错返回错误状态和信息 | DynamoDB 返回一个包含操作结果的 HTTP(S) 响应。如果出错,DynamoDB 将返回 HTTP 错误状态和消息。 |