MongoDB和动态分片键

时间:2013-03-14 14:08:55

标签: mongodb dynamic key sharding

我一直在考虑使用MongoDB进行分片,并遇到了一个我无法弄清楚的用例......所以这就是:

如果我的文件看起来像这样......

_id [Integer]
username [String]
password [String] <-- SHA1 hash
firstname [String]
lastname [String]

...我现在选择密码字段作为我的分片键,它非常适合分片,因为它具有非常高的基数并且可以很好地扩展。但问题仍然存在,如果用户更改密码会怎样?相应的文档会自动迁移到不同的块吗?

有人知道MongoDB如何处理像这样的案件吗?

由于

3 个答案:

答案 0 :(得分:2)

不,分片键是不可变的。

考虑mongo文档,Can I change the shard key after sharding a collection?

  

我可以在分片集合后更改分片键吗?

     

没有

     

MongoDB中没有自动支持来更改分片键   在分割集合之后。这一现实强调了重要性   选择一个好的shard key。如果必须更改分片键   在对集合进行分片后,最好的选择是:

     
      
  • 将MongoDB中的所有数据转储为外部格式。
  •   
  • 删除原始分片集。
  •   
  • 使用更理想的分片键配置分片。
  •   
  • pre-split分片键范围,以确保初始均匀分布。
  •   
  • 将转储的数据恢复到MongoDB中。
  •   

答案 1 :(得分:1)

作为从4.2开始的新版本发布的重要说明,以下声明不适用。

“一旦插入,便无法修改文档的分片键值”。

所以问题的答案,可以更改分片键吗?

尽管不能为分片集合选择其他分片键,但从MongoDB 4.2开始,您可以更新文档的分片键值,除非分片键字段是不可变的_id字段

答案 2 :(得分:0)

我对您的问题的理解是,您问过:

  

如果用户更改密码会怎样?

不是:

  

如果更改分片键会怎样?

完全不同的问题。对于第二种情况,可接受的答案是正确的。

您的原始问题:

在共享集群中,mongodb具有一个称为“平衡器”的组件。平衡器将平衡您的碎片并迁移您的块,以便在可能的情况下平衡它们的大小。

请阅读:Sharded Cluster Balancer

因此,是的,如果用户更改了密码,则只有在平衡器认为需要的情况下,相应的文档才会自动迁移到其他块。平衡器会解决这个问题。