【问题标题】:MS SQL to DynamoDB migration, what's the best partition key to chose in my caseMS SQL 到 DynamoDB 迁移,在我的情况下选择的最佳分区键是什么
【发布时间】:2017-09-04 15:02:05
【问题描述】:

我正在从 MS Sql 迁移到 DynamoDB,我不确定什么是最适合我的哈希键。在 MS SQL 中,我有一个项目表,其中存储了不同客户的一些产品信息,所以实际上主键是两列 customer_id 和 item_no。在应用程序代码中,我需要查询特定项目和所有项目的客户 ID,所以我的第一个想法是将客户 ID 设置为哈希键,将项目编号设置为范围键。但就分区而言,这是最好的概念吗?我需要每天为一些大客户导入 50.000-100.000 种产品的产品数据,据我所知,最好有一个随机哈希键。否则,导入作业将仅在一个分区上运行。 有人可以告诉我在这种情况下最好的数据模型是什么吗?

再见, 彼得

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb database nosql


    【解决方案1】:

    听起来您需要 item_no 作为分区键,而 customer_id 作为排序键。此外,为了有效地查询 customer_id 的所有项目,您需要在 customer_id 上创建一个全局二级索引。

    此配置应为您提供良好的分布,同时允许您运行您指定的查询。

    【讨论】:

    • 谢谢马克,我喜欢这个解决方案,下周将进行性能测试。
    【解决方案2】:

    您走在正确的轨道上,您在每天执行导入作业时应该非常小心处理写入操作的方式。 还要避免不必要地添加索引,因为它们只会增加您的写作操作。

    使用customer_id 作为哈希键和item_no 作为范围键将提供最佳选择,不仅可以查询,还可以上传数据。

    正如您所提到的,客户 ID 的随机化将非常有助于优化资源的使用并防止出现热分区的可能性。在您的情况下,我将遵循 DynamoDB 文档中包含的确切示例:

    [...] 增加此应用程序写入吞吐量的一种方法 将是跨多个分区键值随机写入。 从固定集合中选择一个随机数(例如,1 到 200),然后 将其连接为后缀 [...]

    因此,当您编写客户信息时,只需将后缀随机分配给您的客户 ID,请确保均匀分配它们(例如 CustomerXYZ.1、CustomerXYZ.2、...、CustomerXYZ.200)。

    要阅读所有项目,您需要获取每个后缀的所有项目。例如,您将首先发出对分区键值 CustomerXYZ.1 的查询请求,然后对 CustomerXYZ.2 发出另一个查询,以此类推通过 CustomerXYZ.200。因为您知道后缀范围(在本例中为 1...200),您只需查询将每个后缀附加到客户 ID 的记录。

    哈希键 CustomerXYZ.n 的每个查询都应从该特定客户返回一组项目(由范围键指定),您的应用程序需要合并所有查询请求的结果。

    这肯定会让您更难阅读记录(就所需的额外请求而言),但是,优化吞吐量和性能的好处将得到回报。请记住,热分区不仅会增加您的整体财务成本,还会极大地影响您的性能。

    如果您有一个设计良好的分区键,您的查询将始终以最低的成本快速返回。

    此外,请确保您的导入作业不执行按客户分组的写入操作,例如,不要按顺序写入来自特定客户的所有项目,而是对写入操作进行排序,以便将它们分配给所有客户。即使您的客户将分布在多个分区中(由于 id 随机化过程),您最好采取这种额外的安全措施来防止单个分区中的写入活动爆发。更多详情如下:

    来自官方 DynamoDB 文档的“在数据上传期间分发写入活动”部分:

    为了充分利用所有的吞吐能力 为您的表配置,您需要分配工作负载 跨分区键值。在这种情况下,通过引导不均匀 对所有具有相同分区键的项目的上传工作量 价值,您可能无法充分利用所有资源 DynamoDB 已为您的表预置。您可以分发您的 通过首先从每个分区键值上传一项来上传工作。 然后为下一组排序键值重复该模式 所有项目,直到您上传所有数据 [...]

    来源: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

    我希望这会有所帮助。问候。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2016-07-04
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2023-03-02
      • 2017-09-28
      • 2018-10-11
      • 1970-01-01
      相关资源
      最近更新 更多