这是之前DynamoDB 思维导图的文字版,之前发出的图片版有错误,现在重发一下文字+图片版
![](https://i-blog.csdnimg.cn/blog_migrate/808eb75380bb83d277e11cabc2472f33.jpeg)
图片使用 XMind: ZEN生成
DynamoDB 最佳实践
面向DynamoDB的NoSQL设计
关系数据库设计和NoSQL之间的差异
关系型数据库可以灵活的查询数据,但是成本较高,高流量无法扩展
-
RDBMS 设计灵活,可以随时修改
NoSQL查询方式有限
-
需要对架构进行专门设计,以尽可能的加快查询速度。数据结构和需求高度相关,需要特制。
NoSQL设计的两个关键概念
需要先了解业务问题和应用程序的使用案例,然后再开始设计
应保留尽可能少的表。
了解NoSQL设计
三个基本属性
-
数据大小
了解一次存储和请求的数据量将有助于确定对数据进行分区的最有效方法。
数据形状
NoSQL 数据库不会在处理查询时重塑数据(如 RDBMS 系统所做的一样),而是整理数据以便数据在数据库中的形状与查询内容对应。这是加快速度并增强可扩展性的一个关键因素
数据速度
DynamoDB 通过增加可用于处理查询的物理分区的数量并通过跨这些分区有效分发数据来进行扩展。预先了解峰值查询负载可能有助于确定数据分区方式,从而最高效地使用 I/O 容量。
性能的一般准则
-
将相关数据放在一起
将相关数据集中放置到一个位置。将相关数据保留在最近位置会对成本和性能产生重大影响。 不是跨多个表分发相关数据项目,而是在 NoSQL 系统中尽可能紧密地保留相关项目。 作为一般规则,应在 DynamoDB 应用程序中保留尽可能少的表。
只需要一个表, 例外是涉及大量时间序列数据的情况或具有明显不同的访问模式的数据集 — 但这些都是例外。具有反向索引的单个表通常可启用简单查询来创建和检索应用程序所需的复杂层次数据结构。
使用排序顺序
可将相关项目组织起来并进行有效查询,前提是它们的键设计可促使它们一起排序
分发查询
您应该设计数据键以跨尽可能多的分区均匀分发流量,从而避免“热点”。
使用全局二级索引
通过创建特定的全局二级索引,可启用主表支持的查询以外的查询
设计并高效使用分区键的最佳实践
项目主键可以是仅分区键 也可以是分区键+排序键
高效使用突增容量
DynamoDB 当前可将未使用的读取和写入容量保留最多五分钟 (300 秒) 当读取或写入突增导致容量不足时使用。
DynamoDB适应性容量
DynamoDB 适应性容量 允许您的应用程序继续不受限地对热分区进行读写操作,前提是流量未超出表的配置的总容量或分区最大容量。自适应容量的工作原理是,自动增加分区的吞吐量容量来接收更多流量
示例表配置了 400 个写入容量单位 (WCU),这些容量单位均匀分布在 4 个分区中,每个分区每秒可以接收最多 100 个 WCU。分区 1、2 和 3 每秒接收的写入流量为 50 个 WCU。分区 4 每秒接收 150 个 WCU。此热分区可以在接受写入流量的同时仍具有未利用的突增容量,但是,它最终会限制每秒超过 100 个 WCU 的流量。
DynamoDB 适应性容量通过增加分区 4 的容量来做出响应,因此分区 4 可以接收 150 WCU/秒的更高工作负载,而不会受到限制。
设计分区键以均匀分发工作负载
表的主键的分区键用来确定数据存储在哪个物理分区
每个物理分区均分读取和写入容量
合理设计分区键,避免出现“热点” (请求频率非常高的) 分区键值而导致整体性能降低。
好的 用户 ID
差的 状态代码 项目创建日期(时间段)
使用写入分片均匀分发工作负载
跨分区键空间写入是一种比较好的方式
比如:分区键是日期,现在有1w条数据,日期均分在100天,不好的方式是按时间插入,这样会在短时间内产生 热键
使用随机后缀分区
将随机数字添加到分区键值的末尾。然后跨更大型的空间随机化写入。
例如,