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)
上一篇 2026年1月27日 上午8:01
下一篇 2026年1月27日 上午8:22


相关推荐

  • 设备驱动基础学习–platform driver简单实现「建议收藏」

    设备驱动基础学习–platform driver简单实现「建议收藏」设备驱动基础学习–platformdriver简单实现

    2022年7月4日
    24
  • LinearGradient线性渲染

    LinearGradient线性渲染

    2021年12月17日
    42
  • java基础-数组越界

    java基础-数组越界小伙伴们 你们好呀 我是老寇 目录一 问题思考二 解决方案一 问题思考老寇在做算法题时遇到了一个问题 查阅有关资料 原来是数组越界 话不多说 直接看错 int 的范围 long 的范围 这个问题要怎么解决 二 解决方案既然超过数据 int 的范围 那就直接将 int 改为 long 就行啦

    2026年3月19日
    3
  • 初学者都能看懂的95%置信区间

    初学者都能看懂的95%置信区间1 点估计与区间估计首先我们看看点估计的含义 是用样本统计量来估计总体参数 因为样本统计量为数轴上某一点值 估计的结果也以一个点的数值表示 所以称为点估计 点估计虽然给出了未知参数的估计值 但是未给出估计值的可靠程度 即估计值偏离未知参数真实值的程度 接下来看下区间估计 给定置信水平 根据估计值确定真实值可能出现的区间范围 该区间通常以估计值为中心 该区间则为置信区间 2 中心

    2026年3月20日
    2
  • 深入理解加密、解密、数字签名(签名证书、加密证书)的组成和数字证书

    深入理解加密、解密、数字签名(签名证书、加密证书)的组成和数字证书深入理解加密 解密 数字签名和数字证书 nbsp nbsp 随着电子商务的迅速发展 信息安全已成为焦点问题之一 尤其是网上支付和网络银行对信息安全的要求显得更为突出 为了能在因特网上开展安全的电子商务活动 公开密钥基础设施 PKI PublicKeyInf 逐步在国内外得到广泛应用 我们是否真的需要 PKI PKI 究竟有什么用 下面通过一个案例一步步地来剖析这个问题

    2026年3月17日
    2
  • java正则表达式详解

    java正则表达式详解一、正则表达式术语1)元字符:非一般字符,具有某种意义的字符。如:\bX:\b边界符,以X开始的单词2)正则表达式语法大全 字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,”n”匹配字符”n”。”\n”匹配换行符。序列”\\”匹配”\”,”\(“匹配”(“。 …

    2022年5月31日
    44

发表回复

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

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