使用Native Java UUID.getRandom()作为Sharding键和_id?

时间:2012-12-07 17:13:46

标签: mongodb random uuid sharding mongodb-java

据我所知,对于一个写密集的应用程序,使用ObjectId对于分片密钥来说是一个非常糟糕的主意。 但是,使用Java 中的原生* UUID.randomUUID()作为分片键是一个好主意,因为它们是真正随机的,不会导致单个分片的热点。

这些ID为 128位ID ,如下所示:

  • 5842fa92557947f1b020041ff74868a4
  • 308947443e564d80b97dd8411b4b727e
  • f8a7ee765bed4ce3bcc5800ac3a2a710
  • 1bcfd08b89e94c58ae7695b3e7a1bc4f

它与ObjectId(96bit int)非常相似。

另外,由于必须在_id上有一个索引,因此分片键将是_id,我们将通过为shard_key创建另一个索引来节省RAM。所有东西都可以用于分片。

是针对 Mongod 中的性能问题还是针对磁盘/内存空间问题?

UUID的冲突率为(from wikipedia): 只有在未来100年内每秒生成10亿UUID后,创建一个重复的概率大约为50%。如果地球上每个人拥有6亿UUID,则一次重复的概率约为50%。

3 个答案:

答案 0 :(得分:2)

使用UUID会在整个分片中分配您的写入权限,但是您没有查询隔离,因此您的查询结果不会很好。最快的查询是只有一个分片回答的查询。 http://docs.mongodb.org/manual/core/sharding-internals/#sharding-shard-key-query-isolation

这有助于了解您馆藏中的内容,以便更有效地为您提供帮助。

答案 1 :(得分:1)

使用UUID是完全可以的(假设您只是通过其主/分片键查找这些文档)。分片键的目的之一是将相关文档组合在一起。如果我们正在构建,例如flickr,我们的分片键将以user_id开头,以便用户的照片在一个分片上坐在一起。如果您的文档不相关且主键也是分片键,则没有问题。

答案 2 :(得分:1)

由于https://jira.mongodb.org/browse/JAVA-403,您可能会遇到问题,该问题将在下一版本中修复。