DynamoDB介绍

DynamoDB介绍1 DynamoDB 介绍 DynamoDB 特点 AWS 全面管理的 NoSQL 数据库服务全部基于 solid statedrives SSDS 没有存储空间上限可以支持任意数量的每秒并发吞吐量稳定的低延迟性能 单位数 ms 的响应延迟同时支持 Key Value 和 Document 数据模型自动在三个 AZ 复制数据低成本 DynamoDB 的数据模型可以说是 BigTable 与 OracleNoS

1. DynamoDB介绍及实践

DynamoDB特点:

  • AWS全面管理的NoSQL数据库服务
  • 全部基于solid-state drives(SSDS)
  • 没有存储空间上限
  • 可以支持任意数量的每秒并发吞吐量
  • 稳定的低延迟性能:单位数ms的响应延迟
  • 同时支持Key-Value和Document数据模型
  • 自动在三个AZ复制数据
  • 低成本
    DynamoDB的数据模型可以说是BigTable与Oracle NoSQL的融合。系统首先分成多张表(Table)。表中的记录拥有单属性简单哈希主键或两属性Hash Key+Range Key组合主键。记录内容可包含任意多个属性,属性分单值或多值两种。属性值可以是字符串或数值类型。表没有统一的模式,建表时只需要指定主键的定义,其余各记录都可以拥有自己不同的属性集合。记录由主键和多个属性组成这一点类似于BigTable,这比简单的KV模型更易用。主键可以由Hash Key+Range Key组合而成则类似于Oracle NoSQL,这主要为了提供相同Hash Key的记录集合操作。
    DynamoDB 可以从表中自动删除过期的项,从而帮助您降低存储用量,减少用于存储不相关数据的成本。

1.1. DynamoDB 核心组件

在 DynamoDB中,表、项目和属性是您使用的核心组件。表是项目的集合,而每个项目是属性的集合。DynamoDB 使用主键来唯一标识表中的每个项目,并且使用二级索引来提供更大的查询灵活性。您可以使用 DynamoDB 流 捕获 DynamoDB 表中的数据修改事件。

1.1.1. 表、项目和属性

基本 DynamoDB 组件包括:

  • 表 – 类似于其他数据库系统,DynamoDB 将数据存储在表中。表是数据的集合。
  • 项目 – 每个表包含多个项目。项目是一组属性,具有不同于所有其他项目的唯一标识。DynamoDB 中的项目在很多方面都类似于其他数据库系统中的行、记录或元组。
  • 属性 – 每个项目包含一个或多个属性。属性是基础的数据元素,无需进一步分解。DynamoDB 中的属性在很多方面都类似于其他数据库系统中的字段或列。

1.1.2. 主键

创建表时,除表名称外,您还必须指定表的主键。主键唯一标识表中的每个项目,因此,任意两个项目的主键都不相同。

DynamoDB 支持两种不同类型的主键:

  • 分区键 – 简单的主键,由一个称为分区键 的属性组成。
    DynamoDB 使用分区键的值作为内部散列函数的输入。来自散列函数的输出决定了项目将存储到的分区 (DynamoDB 内部的物理存储)。在只有分区键的表中,任何两个项目都不能有相同的分区键值。
  • 分区键和排序键 – 称为复合主键,此类型的键由两个属性组成。
    第一个属性是分区键,第二个属性是排序键。

1.2. DynamoDB API

1.2.1. 控制层面

控制层面操作可让您可以创建和管理 DynamoDB 表。它们还可让您可以使用依赖于表的索引、流和其他对象。

  • CreateTable – 创建新表。或者,您也可以创建一个或多个二级索引并为表启用 DynamoDB 流。
  • DescribeTable – 返回有关表的信息,例如,表的主键架构、吞吐量设置、索引信息等。
  • ListTables – 返回列表中您的所有表的名称。
  • UpdateTable – 修改表或其索引的设置、创建或删除表上的新索引或修改表的 DynamoDB 流 设置。
  • DeleteTable – 从 DynamoDB 中删除表及其所有依赖对象。

1.2.2. 数据层面

数据层面操作可让您对表中的数据执行创建、读取、更新和删除 (也称为 CRUD) 操作。某些数据层面操作还可让您可以从二级索引中读取数据。

创建数据:

  • PutItem – 将单个项目写入到表中。您必须指定主键属性,但不必指定其他属性。
  • BatchWriteItem – 将最多 25 个项目写入到表中。这比多次调用 PutItem 更有效,因为您的应用程序只需一个网络往返行程即可写入项目。请注意,您还可以使用 BatchWriteItem 来从一个或多个表中删除多个项目。

读取数据:

  • GetItem – 从表中检索单个项目。您必须为所需的项目指定主键。您可以检索整个项目,也可以仅检索其属性的子集。
  • BatchGetItem – 从一个或多个表中检索最多 100 个项目。这比多次调用 GetItem 更有效,因为您的应用程序只需一个网络往返行程即可读取项目。
  • Query – 检索具有特定分区键的所有项目。您必须指定分区键值。您可以检索整个项目,也可以仅检索其属性的子集。或者,您也可以对排序键值应用条件,以便只检索具有相同分区键的数据子集。您可以对表使用此操作,前提是该表同时具有分区键和排序键。您还可以对索引使用此操作,前提是该索引同时具有分区键和排序键。
  • Scan – 检索指定表或索引中的所有项目。您可以检索整个项目,也可以仅检索其属性的子集。或者,您也可以应用筛选条件以仅返回您感兴趣的值并放弃剩余的值。

更新数据:

  • UpdateItem – 修改项目中的一个或多个属性。您必须为要修改的项目指定主键。您可以添加新属性以及修改或删除现有属性。您还可以执行有条件更新,以便更新仅在满足用户定义的条件时成功。或者,您也可以实施一个原子计数器,该计数器可在不干预其他写入请求的情况下递增或递减数字属性。

删除数据:

  • DeleteItem – 从表中删除单个项目。您必须为要删除的项目指定主键。
  • BatchWriteItem – 从一个或多个表中删除最多 25 个项目。这比多次调用 DeleteItem 更有效,因为您的应用程序只需一个网络往返行程即可删除项目。请注意,您也可以使用 BatchWriteItem 来向一个或多个表添加多个项目。

2. 使用DyanmoDB中踩的坑

在实际的项目使用中我们配置了6W/s的写入速度,但是实际的写入速度被限制在2W/s, 有大量的写入受限,写入速度上不去。我们遇到了DynamoDB的一个坑。配置的读写速度并不是我们想象的总的速度,而是和DynamoDB分区数量有关。

2.1. DynamoDB的分区

我们可以将任意数据的数据添加到表中,当数据量超过10G后,DynamoDB会把一个分区拆分成2个分区,分区最大10G。 但是大小只是拆分区的一个因素, 另外一个因素是吞吐量。

  • 吞吐量
    我们可以给表配置任意数量的吞吐量。
    写入容量单位(WCU:write capacity units)以每秒1KB来测量,就是说一次写入100字节的数据算一次写入;一次写入1.2KB的数据算2次写入。
    读取容量单位(RCU:read capacity units)以每秒4KB来测量,一次读取的数据小于4KB算一次读; 一次读取得数据超过4KB,每4KB算一次读。


  • 每个分区最大的WCU是1000, 最大的RCU是3000
    就是说不管表的WCU, RCU设置多大,一个分区最大的WCU,RCU是固定的。

2.2. 分区数量的计算方法

  • 一个容易忽略的点是RCU和WCU是在分区间均匀分布的
    分成3个区之后:
    每个分区的RCU=5000/3=1666.67
    每个分区的WCU=500/3=166.67
    而不是保证每个分区的RCU可以到5000, WCU可以达到500。



我们遇到的问题是我们的点击量太大了,每天超过20亿,持续写入一个表大概2周,每10G一个分区,我们的点击分成了大概250个分区, 6W的WCU平均到250个分区,每个分区只有240的WCU, 一旦数据的按分区键分配的不均匀,造成某个分区的写入超过了240 WCU,就会造成写入受限。

3. 改进方案

3.1. 冷数据,热数据分表

3.2. 分区键做hash

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231126.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tomcat安装使用与部署Web项目的三种方法

    Tomcat安装使用与部署Web项目的三种方法今天带来Tomcat的安装教程,也会讲到各种目录下代表的含义,重点是在Tomcat服务器上面部署Web项目的三种方法。以上便是Tomcat从零到部署项目的教程了,觉得写的不错或者对你有帮助的话,三连支持博主吧~……

    2026年1月24日
    6
  • nginx负载均衡的5种策略及原理

    nginx负载均衡的5种策略及原理nginx的upstream目前支持的5种方式的分配1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 upstreambackserver{ server192.168.0.14; server192.168.0.15; } 2、指定权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 upst…

    2022年6月29日
    54
  • mybatis配置文件位置

    mybatis配置文件位置目录配置文件在resource/mapper文件下项目结构配置文件在java/**/mapper/xml文件夹下项目结构配置总结配置文件在resource/mapper文件下优点:配置文件在resource文件夹下,类文件在Java文件夹下,结构清晰项目结构##配置1、properties文件#配置扫描mybatis.mapper-locations=classpath:mapper/**.xml2、启动类@MapperScan(value=”top.jiug.sa.mapp

    2025年6月29日
    5
  • dpu芯片_三星放弃自研架构

    dpu芯片_三星放弃自研架构近日,专注于智能计算领域的DPU芯片和解决方案公司中科驭数发布了其下一代DPU芯片计划,将基于自研的KPU(KernelProcessingUnit)芯片架构,围绕网络协议处理、数据库和大数据处理加速、存储运算、安全加密运算等核心功能,推出新一代DPU芯片,赋能金融科技、数据中心、混合云及边缘计算等高带宽、低延迟、数据密集型的计算场景。DPU,是DataProcessingUnit的简称,是面向数据中心的专用处理器。据中科驭数创始人兼CEO鄢贵海介绍,”DPU是最新发展起来的专用处理器的一个大类

    2025年9月27日
    3
  • 使用 UpdatePanel

    使用 UpdatePanel1概述ASP.NETUpdatePanel控件能让你创建丰富的、以客户为中心的Web应用程序。使用UpdatePanel控件,可以刷新选择的页面部分而不是使用回发来刷新整个页面,这就像是执行了一个局部页面更新一样。包含一个ScriptManager和一个或多个UpdatePanel的Web页面会自动加入局部页面更新,而不需要定制客户端代码。1.1场景…

    2022年7月23日
    15
  • 面向过程

    面向过程现在前端技术不是几年前的前端那样,熟练掌握JavaScript、Jquery、Ajax、DOM操作、其他框架等等这些就够了。而随着业务的复杂等多种因素,如今前端有了面向对象的方式编程,如:TypeSc

    2022年8月2日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号