【问题标题】:How do I optimize my DynamoDB table secondary global index so that records are evenly distributed while still keeping all records sortable?如何优化我的 DynamoDB 表二级全局索引,以便记录均匀分布,同时仍保持所有记录可排序?
【发布时间】:2018-05-28 15:59:48
【问题描述】:

this question相关,我正在寻找更具体的答案。为了保持这种非主观性,这里有一个完整的思考过程,用于创建一个带有卡点的活动表,可以通过一个快速示例答案来完成。

为了更好地了解 DynamoDB,我正在创建一个个人网站,其中包含来自 DynamoDB 表的活动源。目标是均匀分布分区键,同时仍然能够对所有分区键进行排序(我正在努力解决这部分问题)。

不同类型的活动将包括博客文章、项目、Twitter 文章引用、LinkedIn 文章引用等。使用活动类型作为分区键是不明智的,因为我的活动权重很高,主要是在 Twitter 方面,几乎没有曾经创建博客文章。

唯一的活动 ID 似乎是在 DynamoDB 分区之间均匀分布活动的最佳选择。但是,这完全消除了对活动进行排序以启动的能力,因为查询需要首先知道分区 id。这就是二级全局索引 (SGI) 会有所帮助的地方。这样,主分区键上就不需要排序键,而是在 SGI 中配对。

这是我卡住的部分。 SGI 分区键基于什么?目前,我正在考虑使用“日期”排序键的所有活动的单个值“活动”,但这是所有条目的单个分区。 单个 SGI 分区键值会限制此项目中的性能吗?

请注意,这是一个小型项目。但是,在构建这个项目时,我正在考虑大型项目,试图在优化分区分布方面创建尽可能最好的 DynamoDB 表,同时仍然保持对所有表记录进行排序的灵活性。

【问题讨论】:

    标签: amazon-web-services sorting amazon-dynamodb


    【解决方案1】:

    在设计架构时考虑与主表索引相同的 GSI(全局二级索引),因为它们也获得读/写配置限制,并且受到热分区限制以及主表的背压,换句话说,如果您的 GSI 获得节流,然后您的主表将开始限制请求。

    单个 SGI 分区键值会限制此项目中的性能吗?

    完整表的单分区绝对是对 DDB 可扩展能力的滥用。

    目标是均匀分布分区键,同时仍然能够对所有分区键进行排序(我正在努力解决这部分问题)。

    您可以使用 GSI 对分区进行排序,但您将再次需要 GSI 的分区键,如果该分区键分布不充分,那么您就会遇到我上面提到的问题。

    如果建模正确,DDB 对 put/get 操作和带有一些过滤器的相当简单的查询非常强大。通常,随着访问的分区键值与表中分区键值总数的比率增加,您将更有效地利用吞吐量。

    对于您的特定需求,无法直接从 DDB 获得可扩展的解决方案,但我们仍然没有多少选择

    选项 1:

    我们可以对数据进行建模,使其在写入时公平分布,并且在读回数据时需要额外的工作,这种模式也称为跨多个分区键值的随机化。由于您不想在给定时间内访问特定项目,这对我们有用。

    想法是创建固定集(例如 1 到 100)并从中随机选择一个数字以附加到创建日期(不是时间戳),并将创建时间戳作为排序键。

    这会将您的负载分配到多个随机分区,但会增加读取复杂性,因为您需要查询所有分区并合并以获得该日期的最终排序视图。

    选项 2:

    对冷热数据使用多个表,因为它是基于时间序列的数据。有关信息,请阅读 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

    选项 3:

    扫描?如果我们谈论可扩展性以及您的数据何时增长,这不是一个好的选择,但对于相当小的数据集,这肯定会有所帮助。

    这些只是一个示例,并不适合您的用例。 所以这里有一个思考过程问题给你:写下你所有的用例和访问模式。弄清楚它们的重要性,哪些对最终一致性很好,哪些不是,首先看看 DDB 是否适合它们,不要试图使用 DDB,然后在访问模式可扩展性方面苦苦挣扎。

    另请阅读https://stackoverflow.com/a/38790120/962545,了解更多问题,然后再限制自己从 DDB 获得特定访问模式。

    别忘了阅读最佳实践:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

    【讨论】:

    • 这个答案很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多