我一直在考虑使用MongoDB进行分片,并遇到了一个我无法弄清楚的用例......所以这就是:
如果我的文件看起来像这样......
_id [Integer]
username [String]
password [String] <-- SHA1 hash
firstname [String]
lastname [String]
...我现在选择密码字段作为我的分片键,它非常适合分片,因为它具有非常高的基数并且可以很好地扩展。但问题仍然存在,如果用户更改密码会怎样?相应的文档会自动迁移到不同的块吗?
有人知道MongoDB如何处理像这样的案件吗?
由于
答案 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具有一个称为“平衡器”的组件。平衡器将平衡您的碎片并迁移您的块,以便在可能的情况下平衡它们的大小。
因此,是的,如果用户更改了密码,则只有在平衡器认为需要的情况下,相应的文档才会自动迁移到其他块。平衡器会解决这个问题。