使用增量(但唯一)ID 作为分区键可以在 DynamoDB 中创建热分区吗?
Can using incremental (but unique) IDs as a partition key create hot partitions in DynamoDB?
根据 docs,我了解到 DynamoDB 将获取提供的分区键的值并通过散列函数将其放入以决定数据应该去哪个物理位置。
这是否意味着使用顺序但仍然唯一的分区键写入项目会产生热分区键?
例如,插入分区键值为 10001、10002、10003、10004 的项目是否允许跨分区均匀分布数据?
或者随机生成一个分区键值,比如 UUID,使其分布更均匀?
DynamoDB 支持两种不同类型的主键:
- 分区键
- 分区键 + 排序键
分区键
如果你有一个主键只有一个分区键,你很少会像in a table that has only a partition key, no two items can have the same partition key value那样遇到热分区问题。
您的密钥始终是唯一的,DynamoDB 的内部哈希函数将始终输出唯一的哈希值,然后您的所有数据将始终均匀分布在逻辑和物理分区中。
例如,这是 10001 的 MD5 哈希值:d89f3a35931c386956c1a402a8e09941
这是 10002 的 MD5 哈希:9103c8c82514f39d8360c7430c4ee557
尽管 10001 只增加了 1,但整个哈希是不同的,与 10002 的 MD5 哈希完全不同。
从一致性哈希的角度来看,UUID 值或增量值之间没有区别。
如果您非常频繁地访问一个特定分区(此处与项目同义),您只会得到一个热分区,在这种情况下,需要正确设置 RCU 和 WCU,您应该考虑为经常访问的项目。
分区键 + 排序键
如果您有一个主键也包含一个排序键,如果您不小心,您可能会遇到热分区问题,因为现在您可能有重复的分区键值。
如果你没有尽可能明确的主键,你可以创建热分区。
举个例子:
一个电子商务网站决定像这样设计他们的订单table,当前日期是分区键,排序键是项目 ID:
+---------------+----------+
| Partition Key | Sort Key |
+---------------+----------+
| 19/10/2021 | item3000 |
| 19/10/2021 | item3001 |
| 20/10/2021 | item4000 |
+---------------+----------+
在这种规模下,这可能工作得很好——在上面的例子中,他们每天处理 1000 件物品,这工作得很好。
黑色星期五 - 26/11/2021 - 到达并且他们现在一天有超过 20000 个订单:
+---------------+-----------+
| Partition Key | Sort Key |
+---------------+-----------+
| 26/10/2021 | item6000 |
| 26/10/2021 | item15000 |
| 26/10/2021 | item27000 |
| 27/10/2021 | item27100 |
+---------------+-----------+
这将造成巨大的热分区问题,因为 2021 年 10 月 26 日的 20000 多个订单中的 所有 现在被写入 只有一个 单个分区键值(正如我提到的,具有相同分区键的项目将存储在一起)。
26/11/2021 分区键将 被大量请求且很热,这会降低数据库性能 因为您将尝试处理订单,最终,您将因应用程序性能缓慢而损失收入。
table 的设计方式应允许相对于总主键计数(总项目)有更多不同的主键值 - 写入分片(random or calculated)会阻止这种情况是否必须将日期用作分区键的问题。
如果您没有将排序键作为主键的一部分,请不要担心文档中所说的热分区 - 如果您有 1 /2 经常访问的项目,考虑缓存解决方案,例如 DAX.
如果您确实将排序键作为主键的一部分,请设计您的 table 模式,使分区 + 排序键的组合与可以避免热分区。
根据 docs,我了解到 DynamoDB 将获取提供的分区键的值并通过散列函数将其放入以决定数据应该去哪个物理位置。
这是否意味着使用顺序但仍然唯一的分区键写入项目会产生热分区键?
例如,插入分区键值为 10001、10002、10003、10004 的项目是否允许跨分区均匀分布数据?
或者随机生成一个分区键值,比如 UUID,使其分布更均匀?
DynamoDB 支持两种不同类型的主键:
- 分区键
- 分区键 + 排序键
分区键
如果你有一个主键只有一个分区键,你很少会像in a table that has only a partition key, no two items can have the same partition key value那样遇到热分区问题。
您的密钥始终是唯一的,DynamoDB 的内部哈希函数将始终输出唯一的哈希值,然后您的所有数据将始终均匀分布在逻辑和物理分区中。
例如,这是 10001 的 MD5 哈希值:d89f3a35931c386956c1a402a8e09941
这是 10002 的 MD5 哈希:9103c8c82514f39d8360c7430c4ee557
尽管 10001 只增加了 1,但整个哈希是不同的,与 10002 的 MD5 哈希完全不同。
从一致性哈希的角度来看,UUID 值或增量值之间没有区别。
如果您非常频繁地访问一个特定分区(此处与项目同义),您只会得到一个热分区,在这种情况下,需要正确设置 RCU 和 WCU,您应该考虑为经常访问的项目。
分区键 + 排序键
如果您有一个主键也包含一个排序键,如果您不小心,您可能会遇到热分区问题,因为现在您可能有重复的分区键值。
如果你没有尽可能明确的主键,你可以创建热分区。
举个例子:
一个电子商务网站决定像这样设计他们的订单table,当前日期是分区键,排序键是项目 ID:
+---------------+----------+
| Partition Key | Sort Key |
+---------------+----------+
| 19/10/2021 | item3000 |
| 19/10/2021 | item3001 |
| 20/10/2021 | item4000 |
+---------------+----------+
在这种规模下,这可能工作得很好——在上面的例子中,他们每天处理 1000 件物品,这工作得很好。
黑色星期五 - 26/11/2021 - 到达并且他们现在一天有超过 20000 个订单:
+---------------+-----------+
| Partition Key | Sort Key |
+---------------+-----------+
| 26/10/2021 | item6000 |
| 26/10/2021 | item15000 |
| 26/10/2021 | item27000 |
| 27/10/2021 | item27100 |
+---------------+-----------+
这将造成巨大的热分区问题,因为 2021 年 10 月 26 日的 20000 多个订单中的 所有 现在被写入 只有一个 单个分区键值(正如我提到的,具有相同分区键的项目将存储在一起)。
26/11/2021 分区键将 被大量请求且很热,这会降低数据库性能 因为您将尝试处理订单,最终,您将因应用程序性能缓慢而损失收入。
table 的设计方式应允许相对于总主键计数(总项目)有更多不同的主键值 - 写入分片(random or calculated)会阻止这种情况是否必须将日期用作分区键的问题。
如果您没有将排序键作为主键的一部分,请不要担心文档中所说的热分区 - 如果您有 1 /2 经常访问的项目,考虑缓存解决方案,例如 DAX.
如果您确实将排序键作为主键的一部分,请设计您的 table 模式,使分区 + 排序键的组合与可以避免热分区。