1

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

如果我有类似这样的文件...

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

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

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

谢谢

4

3 回答 3

3

不,分片键是不可变的。

考虑 mongo 文档,我可以在对集合进行分片后更改分片键吗?

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

不。

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

  • 将 MongoDB 中的所有数据转储为外部格式。
  • 删除原始分片集合。
  • 使用更理想的分片键配置分片。
  • 预先分割分片键范围以确保初始均匀分布。
  • 将转储的数据恢复到 MongoDB。
于 2013-03-14T14:33:25.933 回答
1

我对你的问题的理解是你问:

如果用户更改他的密码会发生什么?

不是:

如果我更改分片键会发生什么?

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

对于您的原始问题:

在共享集群中,mongodb 有一个称为平衡器的组件。平衡器将平衡您的分片并迁移您的块,以便尽可能平衡它们的大小。

请阅读:分片集群平衡器

所以,是的,如果用户更改他们的密码,相应的文档将自动迁移到不同的块,只有当平衡器认为需要时。平衡器会处理这个问题。

于 2018-08-03T21:35:44.637 回答
1

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

“一旦插入,文档的分片键值就不能被修改”。

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

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

于 2020-01-09T09:28:54.290 回答