簡體   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