【问题标题】:What's a good mongodb shard key for this Schema?这个 Schema 有什么好的 mongodb 分片键?
【发布时间】:2012-10-09 08:06:00
【问题描述】:

架构

{
        "_id" : ObjectId("5069d68700a2934015000000"),
        "port_name" : "CL1-A",
        "metric" : 340,
        "port_number" : "0",
        "datetime" : ISODate("2012-09-30T13:44:00Z"),
        "array_serial" : "12345"
}

每个数组有 128 个端口,每个文档是该指标的一分钟数据。由于基数低,array_serial 似乎不是分片键的好选择,也就是说,串行12345 的所有数据都必须保留在同一个分片上而不是分成块,对吗?

port_number 似乎允许中等基数,但它会导致查询隔离失败,因为对同一阵列上多个端口的单个查询将跨越多个分片。我预计用户一次不需要查询超过 4-8 个端口。

答案是组合吗?我应该使用日期时间的一部分,比如月份还是星期?

【问题讨论】:

    标签: mongodb sharding


    【解决方案1】:

    关于数组串行,是的,这是正确的。

    如果您选择“port_number”,它将具有足够高的基数,这意味着具有相同“port_number”的所有文档将驻留在同一个块中,但如果查询到达一系列端口,那么它'会击中多个碎片。

    如您所料,选择正确的分片键非常重要且困难。一个“完美”的分片键满足三个相互排斥的目标:

    • 写入应均匀分布在分片上
    • 单个文档的查询应均匀分布在分片上
    • 范围查询和排序应该是高效的,这意味着序列中的元素都应该在相同分片上。

    避免使用顺序分片键的原因之一是它会在插入时创建热点:在任何给定时间,单个分片将承担所有插入负载(这有利于查询隔离,但最终不利于性能 - 因此 _id和“日期时间”不是好的选择)。我可能会选择复合分片键。 Google Group 关于这个话题有一些很好的讨论:

    如果您选择类似 { array_serial : 1 , datetime : 1 } 的内容,则“array_serial”的数据将在需要时分成许多块(基于日期时间)并分布在服务器上。使用完整的“数据时间”值。

    “array_serial”是如何决定的?取值范围是多少?我假设 port_name 会随着 port_number 的变化而变化?

    鉴于你所说,我可能会选择 { port_number : 1, datetime: 1},它并不完美,但也不错。

    它是您的最佳选择吗?这真的取决于使用信息。

    • 您最常见的查询是什么?

    如果您主要是在特定端口号范围内查询特定名称,那么这可能是您的最佳选择。

    另一方面,如果您主要根据日期时间执行所有“名称”的查询,而不考虑端口号,那么您每次都会执行分散/收集查询,这将降低整体性能你的集群。

    另外,问问自己

    • 单个分片可以处理所有插入吗?

    • 范围查询性能对您来说真的很重要吗?

    根据您的问题,我猜您已经阅读了choosing a shard key 上的链接:)

    这里有一些关于选择一个可以帮助你的好分片键的进一步讨论:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多