2015-06-25 101 views
0

如果我有一个MongoDB分片群集和多个MongoS实例,我的ObjectID在_id中是否与我写入的任何MongoS一致?分片群集中的MongoDB ObjectID唯一

例如,如果我从MongoS#1写入一些数据并且_id正常升级,如果我使用MongoS#2写入,那么这些_id是否也会与其他写入一致?

作为ObjectID的一部分看到的是基于机器哈希和进程ID,我看不到这样会对ObjectID进行排序将毫无用处。正确?

这是什么推荐?

+0

简单的答案是肯定的。 Mongo在分片群集中保持_id字段的唯一性。 –

回答

0

如何生成ObjectId会给你一个关于你的查询的公平想法。

如果您在蒙戈控制台键入此

新的ObjectId()

,你会看到的ObjectId样本值

ObjectId("558bf61f9f49f303f72dd59b") 

现在,让我们休息一下,看看mongo如何生成这个。 558bf61f 9f49f3 03f7 2dd59b

  1. 这里,第一8个字符(4个字节)表示的秒(未毫秒)作为时间戳的数目。
  2. 接下来的3个字节是机器标识。
  3. 接下来的2个字节是进程ID。
  4. 最后3个字节是随机值。

​​

所以,可以肯定然而mongos您正在使用,连接随着时间的推移它会在升序排列只(因为第一个点),其他点确保其始终是一个独特的数。希望它能澄清你的疑问。

- $

+0

事情是我不认为它充分解释了如何获得机器ID和进程ID。 它来自客户端应用程序,mongos过程机器,它写入的碎片的主要部分? 只是想知道这是否以一种不同的方式在分片群集设置中解决以保持一致性。 – Theramist

+0

是真的,但是,我的解释确实回答了有关升序主键(_id)的问题。尽管你可以观察,例如,你运行一个Java程序并进行批量插入,然后记录中的机器标识和进程标识总是相同的,只有时间标记和随机数不同。在该领域中的processId的一个观察结果与Java代码的进程ID不同。 –

+0

好的。我想我会对多个mongos进程和多个客户端连接做一些实验,看看我能否确定machineID和processID的来源。 我试图在这里实现的主要事情是一个准确的方法来确定最后更新发生在多个连接的位置,并从这一点开始向前读取。如果我可以依靠_id,这将有所帮助,但看起来我不得不寻找另一种解决方案。 – Theramist