AWS 22 AWS_Serverless_DynamoDB
传统建筑
•传统应用程序利用RDBMS数据库
•这些数据库使用SQL查询语言
•对数据建模方式的强烈要求
•能够进行查询连接、聚合和复杂计算
•垂直扩展(获得更强大的CPU/RAM/IO)
•水平扩展(通过添加EC2/RDS读取副本提高读取能力)
NoSQL数据库
•NoSQL数据库是非关系数据库,并且是分布式的
•NoSQL数据库包括MongoDB、DynamoDB等…
•NoSQL数据库不支持查询联接(或仅支持有限)
•查询所需的所有数据都显示在一行中
•NoSQL数据库不执行聚合,例如“总和”、“平均值”…
•NoSQL数据库水平扩展
•NoSQL与SQL之间没有“对错”,它们只需要
对数据进行不同的建模,并以不同的方式思考用户查询
亚马逊发电机 Amazon DynamoDB
•全面管理,高度可用,跨多个AZ进行复制
•NoSQL数据库——不是关系数据库
•可扩展到大规模工作负载、分布式数据库
•每秒数百万个请求,数万亿行,100 TB的存储容量
•性能快速且一致(检索延迟低)
•与IAM集成以实现安全、授权和管理
•支持使用DynamoDB流进行事件驱动编程
•低成本和自动扩展功能
DynamoDB-基础
•DynamoDB由桌子组成
•每个表都有一个主键(必须在创建时确定)
•每个表可以有无限多个项目(=行)
•每个项目都有属性(可以随时间添加–可以为空)
•项目的最大大小为400KB
•支持的数据类型包括:
• Scalar Types – String, Number, Binary, Boolean, Null
• Document Types – List, Map
• Set Types – String Set, Number Set, Binary Set
DynamoDB–主键
•选项1:分区密钥(散列)
•每个项目的分区键必须是唯一的
•分区密钥必须“多样化”,以便数据分布
•例如:用户表的“用户ID”
DynamoDB–主键
•选项2:分区键+排序键(哈希+范围)
•每个项目的组合必须是唯一的
•数据按分区键分组
•示例:用户游戏表,“用户ID”表示分区键,“游戏ID”表示排序键
DynamoDB–分区键(练习)
•我们正在建立一个电影数据库
•最大化数据分布的最佳分区密钥是什么?
•电影id
•制作人姓名
•领导者_演员_姓名
•电影语言
•“movie_id”的基数最高,因此是一个很好的候选人
•“电影语言”没有太多价值观,可能会被扭曲
所以分区键不是一个很好的选择
---------------------------------------------------------------------------------------
DynamoDB–读/写容量模式
•控制如何管理表的容量(读/写吞吐量)
•配置模式(默认)
•指定每秒的读/写次数
•您需要事先规划容量
•支付配置的读写容量单元
•按需模式
•读/写会随工作负载自动放大/缩小
•无需容量规划
•为你使用的东西付费,更昂贵(美元)
•您可以每24小时在不同模式之间切换一次
R/W容量模式–已配置
•表必须配备读写容量单元
•读取容量单位(RCU)–读取吞吐量
•写入容量单位(WCU)–写入吞吐量
•设置吞吐量自动缩放以满足需求的选项
•可以使用“突发容量”暂时超过吞吐量
•如果突发容量已被消耗,您将获得
“通过PutteExceedexception提供”
•然后建议进行指数退避重试
DynamoDB–写入容量单位(WCU)
•一个写入容量单元(WCU)代表一个数据的每秒写入一次
大小不超过1KB的项目
•如果项目大于1KB,则消耗更多WCU
•示例1:我们每秒写10个项目,项目大小为2kb
•我们需要10个∗ 10 ∗ ( 2kb / 1 kb) = 20 𝑊𝐶𝑈𝑠
•示例2:我们每秒写6个项目,项目大小为4.5 KB
•我们需要6个∗ 6 ∗ ( 5KB / 1KB ) = 30 𝑊𝐶𝑈𝑠 (4.5四舍五入到上限KB)
•例3:我们每分钟写120个项目,项目大小为2kb
•我们需要 ( 120 、 60) * (2KB / 1KB ) = 4 𝑊𝐶𝑈𝑠
强一致性读取与最终一致性读取
•最终一致读取(默认)
•如果我们在写入后立即读取,可能会因为复制而获得一些过时的数据
•强一致的读取
•如果我们读取的数据正确
•在API调用(GetItem、BatchGetItem、Query、Scan)中将“ConsistentRead”参数设置为True
•消耗两倍的RCU
DynamoDB–读取容量单位(RCU)
•一个读取容量单元(RCU)代表每秒一次强一致性读取,或每秒两次最终一致性读取,用于最大为4KB的项目
•如果项目大于4KB,则消耗更多的RCU
•示例1:每秒10次强一致性读取,项目大小为4KB
•我们需要10个 10 ∗ (4kb/4kb) = 10 𝑅𝐶𝑈𝑠
•示例2:每秒16次最终一致读取,项目大小为12KB
•我们需要 (16 / 2) * (12kb / 4kb) = 24 𝑅𝐶𝑈𝑠
•示例3:每秒10次强一致性读取,项目大小为6KB
•我们需要 10 ∗ (8KB / 4KB) = 20 𝑅𝐶𝑈𝑠 (我们必须将6KB的大小凑到8KB)
DynamoDB–内部分区
•数据存储在分区中
•分区键通过哈希算法来知道他们去哪个分区
•要计算分区的数量:
•WCU和RCU均匀分布在分区上
DynamoDB–节流
•如果我们超过供应的RCU或WCU,我们将获得“通过PutteExceedexception提供”
•原因:
•热键–一个分区键被读取太多次(例如,热门项)
•热分区
•非常大的物品,记住RCU和WCU取决于物品的大小
•解决方案:
•遇到异常时的指数退避(已在SDK中)
•尽可能多地分发分区密钥
•如果RCU出现问题,我们可以使用DynamoDB加速器(DAX)
R/W容量模式–按需
•读/写会随工作负载自动放大/缩小
•无需容量规划(WCU/RCU)
•无限WCU和RCU,无油门,更昂贵
•根据RRU和WRU,您需要支付读/写费用
•读取请求单元(RRU)–读取吞吐量(与RCU相同)
•写入请求单元(WRU)–写入吞吐量(与WCU相同)
•比供应容量贵2.5倍(小心使用)
•用例:未知的工作负载、不可预测的应用程序流量…
---------------------------------------------------------------------------------------
DynamoDB–写入数据
•PutItem
•创建新项目或完全替换旧项目(相同主键)
•消耗WCU
•UpdateItem
•编辑现有项目的属性,如果不存在,则添加新项目
•可用于实现原子计数器–一个数字属性无条件递增
•条件写入
•仅在满足条件时接受写入/更新/删除,否则返回错误
•有助于同时访问项目
•不影响性能
DynamoDB–读取数据
•GetItem
•基于主键读取
•主键可以是哈希或哈希+范围
•最终一致读取(默认)
•选择使用强一致性读取(更多RCU-可能需要更长时间)
•ProjectionExpression可以指定为仅检索某些属性
DynamoDB–读取数据(查询)
•查询返回基于以下内容的项目:
•KeyConditionExpression
•分区键值(必须是=运算符)–必需
•排序键值(=,<,<=,>,>=,介于之间,以开头)-可选
•FilterExpression
•查询操作后的额外过滤(数据返回给您之前)
•仅与非键属性一起使用(不允许哈希或范围属性)
•Returns:
•限制中规定的项目数量
•或高达1MB的数据
•能够对结果进行分页
•可以查询表、本地二级索引LSI或全局二级索引GSI
DynamoDB–读取数据(扫描)
•扫描整个表格,然后过滤掉数据(效率低下)
•返回高达1MB的数据–使用分页来保持读取
•消耗大量RCU
•使用限制或减少结果大小并暂停来限制影响
•为了提高性能,请使用并行扫描
•多个工作人员同时扫描多个数据段
•增加吞吐量和消耗的RCU
•像扫描一样限制并行扫描的影响
•可以使用ProjectionExpression和FilterExpression(不更改RCU)
DynamoDB–删除数据
•删除项目
•删除单个项目
•能够执行有条件删除
•删除表
•删除整个表格及其所有项目
•删除所有项目比调用DeleteItem要快得多
DynamoDB–批处理操作
•通过减少API调用的数量,可以节省延迟
•为了提高效率,操作是并行进行的
•批次的一部分可能会失败;在这种情况下,我们需要再次尝试失败的项目
•BatchWriteItem
•一次通话最多25个PutItem和/或DeleteItem
•最多可写入16 MB的数据,每项最多可写入400 KB的数据
•无法更新项目(使用UpdateItem)
•BatchGetItem
•从一个或多个表中返回项目
•最多100项,最多16 MB的数据
•并行检索项目,以最小化延迟
---------------------------------------------------------------------------------------
DynamoDB–本地二级索引(LSI)
•表的可选排序键(与基表相同的分区键)) 备用排序键
•排序键由一个标量属性(字符串、数字或二进制)组成
•每个表最多5个本地二级索引
•必须在表格创建时定义
•属性投影–可以包含基表的部分或全部属性
( KEYS_ONLY , INCLUDE , ALL )
DynamoDB – Global Secondary Index (GSI)
•基表中的可选主键(哈希或哈希+范围)备用主键
•加快对非关键属性的查询
•索引键由标量属性(字符串、数字或二进制)组成
•属性投影——基本表的部分或全部属性 ( KEYS_ONLY , INCLUDE , ALL )
•必须为索引提供RCU和WCU
•可在创建表后添加/修改
DynamoDB–索引和节流
•全球二级指数(GSI):
•如果GSI上的写操作被限制,那么主表将被限制!
•即使主桌上的WCU正常
•仔细选择GSI分区密钥!
•仔细分配WCU容量!
•本地二级索引(LSI):
•使用主表的WCU和RCU
•无需特别考虑节流
---------------------------------------------------------------------------------------
DynamoDB–乐观锁定
•DynamoDB有一个称为“条件写入”的功能
•在更新/删除项目之前,确保项目未发生更改的策略
•每个项目都有一个作为版本号的属性
DynamoDB加速器(DAX)
•完全管理、高可用、无缝存储DynamoDB缓存
•缓存读取和查询的延迟为微秒
•不需要修改应用程序逻辑(与现有的DynamoDB API兼容)
•解决“热键”问题(读取次数过多)
•缓存5分钟TTL(默认)
•群集中最多10个节点
•多AZ(建议生产环境至少使用3个节点)
•安全(KMS、VPC、IAM、CloudTrail,…)
DynamoDB加速器(DAX)与ElastiCache
EC
存储聚合结果
DAX
-单个对象缓存
-查询和扫描缓存
---------------------------------------------------------------------------------------
DynamoDB流
•表中项目级修改(创建/更新/删除)的有序流
•流记录可以是:
•发送至Kinesis数据流
•由AWS Lambda阅读
•由Kinesis客户端库应用程序读取
•数据保留时间长达24小时
•用例:
•实时响应变化(欢迎向用户发送电子邮件)
•分析
•插入衍生工具表
•插入ElasticSearch
•实施跨区域复制
DynamoDB流
•能够选择将写入流的信息:
•KEYS_ONLY_修改项目的关键属性
•NEW_IMAGE–整个项目,在修改后显示
•OLD_IMAGE–整个项目,在修改之前的样子
•NEW_AND_OLD_IMAGES –物品的新图片和旧图片
•DynamoDB流由碎片组成,就像Kinesis数据流一样
•您不需要提供碎片,这是由AWS自动完成的
•启用流后,不会在流中追溯填充记录
DynamoDB Streams&AWS Lambda
•您需要定义一个事件源映射来读取DynamoDB流
•您需要确保Lambda函数具有适当的权限
•同步调用Lambda函数
---------------------------------------------------------------------------------------
DynamoDB–生存时间(TTL)
•在到期时间戳后自动删除项目
•不消耗任何WCU(即无额外成本)
•TTL属性必须是具有“Unix Epoch timestamp”值的“数字”数据类型
•在到期后48小时内删除过期项目
•未删除的过期项目会出现在读取/查询/扫描中(如果不需要,请将其过滤掉)
•从LSI和GSI中删除过期项目
•每个过期项目的删除操作进入DynamoDB Streams(可帮助恢复过期物品)
•用例:通过仅保留当前项目,遵守监管义务…
DynamoDB CLI–很高兴知道
•--projection-- expression:要检索的一个或多个属性
•--filter-expression:在返回给您之前过滤项目
•通用AWS CLI分页选项(例如DynamoDB、S3等)
•-page-size:指定AWS CLI检索项目的完整列表,但使用更多的API调用,
而不是一个API调用(默认值:1000个项目)
•-max-items:在CLI中显示的最大项目数(返回下一步)
•-starting-token:指定检索下一组项目的最后一个NextToken
---------------------------------------------------------------------------------------
DynamoDB事务
•对一个或多个表中的多个项目进行协调、全有或全无操作(添加/更新/删除)
•提供原子性、一致性、隔离性和耐久性(ACID)
•读取模式——最终一致性、强一致性、事务性
•写入模式–标准、事务性
•消耗2倍WCU和RCU
•DynamoDB为每个项目执行2个操作(准备和提交)
•两种操作:(最多25个独特的项目或最多4 MB的数据)
•Transact-GetItems–一个或多个GetItem操作
•TransactionWriteItems–一个或多个PutItem、UpdateItem和DeleteItem操作
•用例:金融交易、管理订单、多人游戏…
两张桌子上都有一个Transac,on,要么没有!
DynamoDB事务–容量计算
•对考试很重要!
•示例1:每秒3次事务写入,项目大小为5 KB
•我们需要3*(5/1) * 2 = 30WCU
•示例2:每秒读取5次事务,项目大小为5KB
5*(8 / 4) * 2 = 20RCU
•(5四舍五入到4 KB的上限)
---------------------------------------------------------------------------------------
DynamoDB作为会话状态缓存 DynamoDB as Session State Cache
•通常使用DynamoDB存储会话状态
•vs.ElastiCache
•ElastiCache在内存中,但DynamoDB没有服务器
•两者都是关键/价值存储
•vs.EFS
•EFS必须作为网络驱动器连接到EC2实例
•vs.EBS & Instance Store
•EBS&Instance Store只能用于本地缓存,不能用于共享缓存
•vs.S3
•S3具有更高的延 迟,不适用于小型对象
DynamoDB写切分 Write Sharding
•假设我们有一个有两名候选人的投票申请,候选人a和候选人B
•如果分区键为“候选_ID”,这将导致两个分区,这将产生问题(例如,热分区)
•一种允许在分区之间更好地均匀分配项目的策略
•为分区键值添加后缀
•两种方法:
•使用随机后缀进行切分
•使用计算后缀进行切分
DynamoDB–写入类型
并发写入
原子写入
条件写入
批写入
DynamoDB–大型对象模式
DynamoDB – Large Objects Pattern
实际存储S3, 在DB存储URL
DynamoDB–索引S3对象元数据
app =》 s3 =》 lambda =》dynamoDB 《= app 《= clent
---------------------------------------------------------------------------------------
DynamoDB操作
•桌子清理
•选项1:扫描+删除项目
•非常慢,消耗RCU和WCU,价格昂贵
•选项2:删除表格+重新创建表格
•快速、高效、廉价
•复制DynamoDB表格
•选项1:使用AWS数据管道
•选项2:备份并恢复到新表中
•需要一些时间
•选项3:扫描+PutItem或BatchWriteItem
•编写自己的代码
---------------------------------------------------------------------------------------
DynamoDB–安全和其他功能
•安全
•VPC端点可在不使用互联网的情况下访问DynamoDB
•访问完全由IAM控制
•在静止状态下使用AWS KMS进行加密,在传输过程中使用SSL/TLS进行加密
•提供备份和恢复功能
•与RDS类似的时间点恢复(PITR)
•不影响性能
•全球表格
•多区域、多活动、完全复制、高性能
•DynamoDB本地
•在本地开发和测试应用程序,无需访问DynamoDB web服务(无需互联网)
•AWS数据库迁移服务(AWS DMS)可用于迁移到
DynamoDB(来自MongoDB、Oracle、MySQL、S3等)
DynamoDB-用户直接与DynamoDB交互
DynamoDB–细粒度访问控制 DynamoDB – Fine-Grained Access Control
•使用Web身份联盟或Cognito身份池,每个用户都可以获得AWS凭据
Web Identity Federation or Cognito Identity Pools
•您可以将IAM角色分配给这些用户,Condition是限制他们对DynamoDB的API访问
•LeadingKeys–限制用户在主屏幕上的行级访问权限钥匙
•Attributes–限制用户可以看到的特定属性
---------------------------------------------------------------------------------------