DynamoDB 写入读取容量

2023-10-08 01:10
文章标签 读取 写入 容量 dynamodb

本文主要是介绍DynamoDB 写入读取容量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近使用DynamoDB才发现里面一堆坑。踩进去全是钱。
DynamoDB 是依据读取容量 写入容量和数据存储大小(表和索引)收费。这个读取容量写入容量就很恐怖了。还有autoScaling自动扩容也全是钱

所以这里非常有必要了解下读取容量和写入容量。天天读AWS的文档人都不好了。
官方文档:https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

  • 1 读取/写入容量基本概念
    • 1.1 读取容量单位
    • 1.2 写入容量单位
    • 1.3 超容量了怎么办
    • 1.4 初始吞吐量设置
  • 2 索引对读取和写入容量的影响
    • 2.1 索引实现原理
    • 2.2 索引读取和写入容量
    • 2.3 如何正确使用索引
      • 2.3.1 最大程度地减少索引的数量
      • 2.3.2 对于写入活动工作量很大的表,避免使用索引
      • 2.3.3 慎重选择投影
  • 3 AutoScaling 模式
  • 4 踩到的坑

1 读取/写入容量基本概念

1.1 读取容量单位

读取容量单位 表示对大小最多为 4 KB 的项目每秒执行一次强一致性读取(最新数据读取),或每秒执行两次最终一致性读取(可能不是最新数据)。
假设您创建一个带 10 个预置读取容量单位的表。这将允许您对大小最多为 4 KB 的项目每秒执行 10 次强一致性读取,或每秒执行 20 次最终一致性读取。

简单来说就是:1个读取容量单位1秒可以读一次,一次数据量不能超过4KB,超过需要多加容量。

1.2 写入容量单位

写入容量单位 表示对大小最多为 1 KB 的项目每秒执行一次写入。
例如,假设您创建一个带 10 个写入容量单位的表。这将允许您对大小为 1 KB 的项目每秒执行 10 次写入。

简单来说就是:1个写入容量单位1秒可以写一次,一次数据量不能超过1KB,超过需要多加容量。

1.3 超容量了怎么办

如果您的应用程序执行读取或写入操作的速率高于表能够支持的速率,则 DynamoDB 将开始限制 这些请求。

当 DynamoDB 限制读取或写入时,它会将 ProvisionedThroughputExceededException 返回给调用方。随后,应用程序可以采取相应的措施,例如,在重试请求之前等待一段较短的间隔。DynamoDB 控制台显示表的 Amazon CloudWatch 指标,以便您能够监视受限制的读取请求和写入请求。

1.4 初始吞吐量设置

我们创建表和全局二级索引时都需要设置初始容量。表和全局二级索引均会占用读取和写入容量,,AWS免费额度为25个写入,25个读取。所以需要预估每秒请求数量。不过也可以使用AutoScaling方式,动态调整每张表和索引容量

2 索引对读取和写入容量的影响

2.1 索引实现原理

每个二级索引都由 DynamoDB 自动维护。在基表中添加、修改或删除项目时,表上的所有索引也会更新,以反映这些更改。即添加删除肯定会占用读取和写入容量

全局二级索引的投影是从表复制到二级索引中的属性集。表的分区键和排序键始终投影到索引中;您可以投影其他属性以支持应用程序的查询要求。当您查询索引时,Amazon DynamoDB 可以访问投影中的任何属性,就像这些属性是在它们自己的表中一样。

DynamoDB 自动将每个全局二级索引与其基表同步。当应用程序对某个表写入或删除项目时,该表的所有全局二级索引都会使用最终一致性模型异步更新。应用程序绝不会直接向索引中写入内容。

预置吞吐量使用
全局二级索引:每个全局二级索引都有自己的用于读取和写入活动的预置吞吐量设置。对全局二级索引执行的查询或扫描会占用索引 (而非基表) 的容量单位。全局二级索引更新也是如此,因为会进行表写入。对于全局二级索引查询或扫描,您只能请求投影到索引中的属性。DynamoDB 不从表提取任何属性。
本地二级索引:对local secondary index执行的查询或扫描会占用基表的读取容量单位。向表写入时,其local secondary index也会更新;这些更新会占用基表的写入容量单位。

2.2 索引读取和写入容量

创建全局二级索引时,必须根据该索引的预期工作负载指定读取和写入容量单位。全局二级索引的预置吞吐量设置独立于其基表的相应设置。对全局二级索引执行的 Query 操作会占用索引 (而非基表) 的读取容量单位。在表中放置、更新或删除项目时,表的全局二级索引也会更新;这些索引更新会占用索引 (而非基表) 的写入容量单位。

例如,如果您对全局二级索引执行 Query 操作并超过其预置读取容量,则您的请求会受到阻止。如果您对表执行大量写入活动,但是该表的全局二级索引没有足够写入容量,则对该表进行的写入活动会受到限制。

索引的读取容量:
对于 全局二级索引 查询,DynamoDB 的预置读取活动的计算方式与其表查询的方式相同。唯一不同的是,本次计算基于索引条目的大小,而不是基表中项目的大小。读取容量单位的数量就是返回的所有项目的所有投影属性大小之和,该结果会向上取整到 4 KB 的下一个倍数。

索引的写入容量:
在添加、更新或删除表中的项目,并且全局二级索引受此影响时,全局二级索引将占用为此操作预置的写入容量单位。一次写入操作的预置吞吐量总成本是对基表执行的写入操作以及更新全局二级索引所占用的写入容量单位之和。请注意,如果对表执行的写入操作不需要全局二级索引更新,则不会占用索引的写入容量。

索引对读取写入容量的影响:

  1. 如果您向定义了索引属性的表中写入新项目,或更新现有的项目来定义之前未定义的索引属性,只需一个写入操作即可将项目放置到索引中。
  2. 如果对表执行的更新操作更改了索引键属性的值(从 A 更改为B),就需要执行两次写入操作,一次用于删除索引中之前的项目,另一次用于将新项目放置到索引中。
  3. 如果索引中已有某一项目,而对表执行的写入操作删除了索引属性,就需要执行一次写入操作删除索引中旧的项目投影。
  4. 如果更新项目前后索引中没有此项目,此索引就不会额外产生写入成本。
  5. 如果对表的更新仅更改了索引键架构中投影属性的值,但不更改任何索引键属性的值,则需要执行一次写入以将投影属性的值更新到索引中。

2.3 如何正确使用索引

2.3.1 最大程度地减少索引的数量

全局二级索引都需要配置预制读取写入容量, 不管用没有都得给钱,表的写入删除都会去更新该索引。

2.3.2 对于写入活动工作量很大的表,避免使用索引

如果一个表经常进行大规模写入删除,只要上面建立索引,索引也会进行大规模写入删除操作,这些都会占用大量的读取写入容量。

2.3.3 慎重选择投影

由于二级索引会占用存储空间和预配置吞吐量,因此您应尽可能地减少索引的大小。此外,相较于查询整个表,索引越小,性能优势越明显。

实际使用中,如果你投影很多,每次更新到投影中的属性也就会同步更新索引,占用写入容量。
如果你建立了5个索引,5个索引均投影了某个一个属性,当改变项目中该值时,5个索引均会更新。

3 AutoScaling 模式

DynamoDB Auto Scaling 使用 AWS Application Auto Scaling 服务代表您动态调整预置的吞吐容量,以响应实际的流量模式。这将允许表或全局二级索引增大其预置的读取和写入容量以处理突增流量,而不进行限制。当工作负载减小时,Application Auto Scaling 将减少吞吐量,这样您将无需为未使用的预置容量付费。

AutoScaling示意图:
这里写图片描述
以下步骤汇总了上图中所示的 Auto Scaling 流程:
1 您为 DynamoDB 表创建 Application Auto Scaling 策略。
2 DynamoDB 将使用的容量指标发布到 Amazon CloudWatch。
3 如果表使用的容量在特定时段内超出目标使用率 (或低于目标使用率),则 Amazon CloudWatch 将触发警报。您可以在 AWS 管理控制台上查看警报并使用 Amazon Simple Notification Service (Amazon SNS) 接收通知。
4 CloudWatch 警报调用 Application Auto Scaling 来评估扩展策略。
5 Application Auto Scaling 发出 UpdateTable 请求以调整表的预置吞吐量。
6 DynamoDB 处理 UpdateTable 请求,并动态增加 (或减少) 表的预置吞吐容量,使它接近目标使用率。

DynamoDB 将不会允许您过快地增加预置容量
您将为 TestTable 创建扩展策略(使用Formation部署时)。该策略定义 Application Auto Scaling 可以调整表的预置吞吐量的详细情况,以及它在执行此操作时需要采取的措施。您将此策略与您在上一步中定义的可扩展目标 (TestTable 表的写入容量单位) 相关联。

该策略包含以下元素:

  1. PredefinedMetricSpecification – Application Auto Scaling 允许调整的指标。对于DynamoDB,以下值是 PredefinedMetricType 的有效值: DynamoDBReadCapacityUtilization DynamoDBWriteCapacityUtilization
  2. ScaleOutCooldown – 增加预置吞吐量的每个 Application Auto Scaling 事件之间的最短时间(以秒为单位)。该参数允许 Application Auto Scaling 持续但不是激进地增加吞吐量以应对实际工作负载。ScaleOutCooldown 的默认设置是 0
  3. ScaleInCooldown –减少预置吞吐量的每个 Application Auto Scaling 事件之间的最短时间 (以秒为单位)。此参数允许Application Auto Scaling 以渐进和可预测的方式减少吞吐量。ScaleInCooldown 的默认设置是 0。
  4. TargetValue – Application Auto Scaling 确保消耗的容量与预置的容量的比例保持在该值或接近该值。应将TargetValue 定义为百分比。

4 踩到的坑

1 表预制容量用不完也是按预置容量收费。
2 全局二级索引也是需要读取和写入容量的。
3 AutoScaling并不是实时扩容和收缩,其中有一段启动和冷却时间,可以自己设置
4 索引不可写,但索引投影的属性在表中改变,即会同样更新索引内容即会占用索引写入容量。如果你用了五个索引都投影了某个属性,而该属性内容改变了,5个索引都会更新,这里就用掉了5个容量。
5 慎用scan 读取表中的所有项目。DynamoDB 所考量的是评估所得的项目大小,而不是扫描返回的项目大小。
6 自动扩容会使用cloudwatch,而自动扩容条件下,一个表(或全局二级索引)就会占用5个警报容量,一个警报容量就是0.1刀一个月。5个带全局二级索引的表就是50个容量,cloudwatch前10个容量免费,意思开启autoScaling固定一个月就是4刀的cloudwatch支出。

这篇关于DynamoDB 写入读取容量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/161671

相关文章

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

java读取resource/通过文件名获取文件类型

java读取resource java读取resource目录下文件的方法: 借助Guava库的Resource类 Resources.getResource("test.txt") 通过文件名获取文件类型 mongodb java

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa