繁体   English   中英

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

[英]How to build field hash based sharding in MongoDB

我正在寻找一个很好的方法来做到以下几点:

给定一个字段FI的文档想要设置分片,我的应用程序可以为该字段值生成静态哈希(意味着,如果值相同,哈希将始终相同)然后使用该哈希来定位正常MongoDB分片设置中的适当分片。

问题:

  1. 这是一种安全/好的方法吗?
  2. 实施它的好方法是什么
  3. 是否有任何关于分片群集设置的问题,我应该知道。

谢谢!

我实际上已经实现了这个并且它非常可行并且导致非常好的写入性能。 我假设您实现它的原因与我一样(没有预热/平衡的即时分片定位,写入吞吐量,在块移动/分割期间没有性能下降等)。

你的问题 :

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

需要考虑的一些缺点:

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

祝好运。

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

这是一个安全的好主意。

但是,哈希函数的选择至关重要:

  • 你想要它是统一的(你平滑所有碎片的负载,但你放松了一些语义批量访问)?
  • 你想要人类可读吗? (你的效率会下降(与二进制哈希相比,速度非常快),但你赢了,可读性
  • 你能使它保持一致(谨防语言提供的哈希函数)
  • 如果你想要,你可以强制执行吗?

我已成功选择:均匀性,二进制形式,一致性和单一性与murmurHash3函数:

value - > murmurmHash(valueInBinaryForm)后跟valueInBinaryForm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM