mongodb - 如何在 MongoDB 中构建基于字段哈希的分片

标签 mongodb sharding

我正在寻找一种好的方法来执行以下操作:

给定一个包含某些字段 F 的文档,我想将分片设置为我的应用程序可以为该字段值生成一个静态散列(意思是,如果值相同,散列将始终相同),然后使用该散列在正常的 MongoDB 分片设置中定位适当的分片。

问题:

  1. 这是一种安全/好的方法吗?
  2. 实现它的好方法是什么
  3. 关于分片集群设置是否有任何我应该注意的陷阱。

谢谢!

最佳答案

我实际上已经实现了这个,它非常可行,并且具有非常好的写入性能。我假设您出于与我相同的原因实现它(无需预热/平衡的即时分片定位、写入吞吐量、 block 移动/拆分期间无性能下降等)。

您的问题:

  1. 是的,前提是您正确实现。
  2. 我在内部 ORM 层所做的是将文档中的某些字段标记为哈希分片字段。然后,我们的 ORM 将在写入或读取文档之前自动为该字段值生成哈希值。然后传出查询用该散列值(在我们的例子中总是称为“散列”)修饰,然后 MongoDB 分片将其用于分片定位。显然,在这种情况下,“哈希”始终是唯一的分片键。
  3. 目前最重要的是生成良好的哈希值。许多字段值(最常见的是基于 ObjectId 的 _id 字段)是增量的,因此您的哈希算法必须是这样的,以便为增量值生成的哈希值会导致哈希值命中不同的分片。其他问题包括选择合适的 block 大小。

需要考虑的一些缺点:

  • 默认的 MongoDB block 平衡变得不太有用,因为您通常会使用大量 block 设置初始集群(这有助于向集群添加分片,同时在所有分片中保持良好的 block 分布)。这意味着只有当您的预制 block 中有足够的数据需要拆分时,平衡器才会开始拆分。
  • 它很可能在不久的将来成为官方支持的 MongoDB 功能,这可能会使整个努力有点浪费。不过,您可能像我一样没有等待的奢侈。

祝你好运。

更新 25/03/2013:从版本 2.4 开始,MongoDB 原生支持哈希索引。

关于mongodb - 如何在 MongoDB 中构建基于字段哈希的分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915777/

相关文章:

c# - 使用 mongodb c# 从字符串数组中提取值(如果包含子字符串)

java - Spring mongo 存储库 CRUD 与标准相结合

node.js - 从MongoDB和尚的结果中排除字段

performance - 如何在 100% CPU 时提高 Redis 性能?分片?最快的 .Net 客户端?

mongodb - Sharding后MongoDB查询报错

mysql - 对dbShards有意见吗?

Perl & MongoDB 二进制数据

c# - C# 中的 MongoDb "AnyIn"过滤方法给出编译器错误

mongodb - 删除无法访问的 Mongo 分片

Discord.js 分片,如何使用广播Eval 发送嵌入消息?