2015-06-25 148 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